正文
1.粘包是什么意思?TCP
和UDP
是否会出现粘包?出现了粘包如何处理?
[我的答案]粘包就是当客户端连续不断的往服务端发送数据包的时候,服务端接收的数据会出现两个数据包粘在一起的情况;UDP(非面向连接)是不会出现粘包的,因为UDP协议是基于报文的,UDP首部采用了16bit来指示UDP数据报文的长度,因此在应用层能很好的将不同的数据报文区分开,从而避免粘包和拆包的问题。而TCP(面向连接)是基于字节流的,它无法识别包的长度,所以会出现粘包的现象。
解决办法主要有以下三种:
1)发送端给每个数据包添加包首部,首部中应该至少包含数据包的长度,这样接收端在接收到数据后,通过读取包首部的长度字段,便知道每一个数据包的实际长度了,有较高的效率而且少冗余,但是编程较复杂;
2)发送端将每个数据包封装为固定长度(不够的可以通过补0填充),这样接收端每次从接收缓冲区中读取固定长度的数据就自然而然的把每个数据包拆分开来,编程简单但是效率一般甚至很低;
3)可以在数据包之间设置边界,如添加特殊符号,这样,接收端通过这个边界就可以将不同的数据包拆分开;
2.time_wait
是什么情况?如果出现了过多的close_wait
可能是什么原因?
[我的答案]TIME_WAIT
是主动关闭连接的一方保持的状态,在保持这个状态2MSLmax segment lifetime
时间之后,彻底关闭回收资源。遇到TIME_WAIT
数过大导致的服务器异常,很容易解决,修改下/etc/sysctl.conf
就ok了。
如果一直保持在CLOSE_WAIT
状态,那么只有一种情况,就是在对方关闭连接之后服务器程序自己没有进一步发出ack
信号。换句话说,就是在对方连接关闭之后,程序里没有检测到,或者程序压根就忘记了这个时候需要关闭连接,于是这个资源就一直被程序占着。这个情况多半是代码的问题,在服务器端是无能为力的,要检查代码。
3.epoll
和select
的区别?边缘触发和水平触发的区别?
[我的答案]select
查询速度较慢,因为他每次产生fd
时候会有整体fdset
的拷贝,而且每次有回送,select
要查询整个fdset
;epoll
查询速度较快,因为他为每个fd
都regist
了一个单独的回调函数。
水平触发(LT):当epoll
检测到其上有事件发生并通知应用程序时,应用程序可以不立即处理,这样当应用程序再次调用epoll
中调用函数时,epoll
会再次通知应用程序此事件,直到被处理。
边沿触发(ET):当epoll
检测到其上有事件发生并通知应用程序时,应用程序必须立即处理,并且下一次的epoll
调用,不会再向应用程序通知此事件。
所以ET
模式大大得降低了同一个epoll
事件被重复触发的次数,因此ET
模式工作效率比LT
模式更高。select
、poll
、epoll
的默认工作模式都是水平触发(LT
)模式,但是epoll是支持边沿触发(ET
)模式的。
4.varchar
和char
的区别是什么?utf8字符集下varchar
最多存多少个字符?
[我的答案]前面那个问题去看http://blog.51cto.com/chenx1242/1742467,这里说后面那个。
在utf-8
状态下的varchar
,最大只能到 (65535 - 2) / 3 = 21844 余 1
。
在gbk
状态下的varchar
, 最大只能到 (65535 - 2) / 2 = 32766 余 1
。
5.primary key
和unique
的区别?
[我的答案]首先先说明primary key = unique + not null
,其次Unique Key
可以是空,可以在一个表里的一个或多个字段定义,也就是爱有几个有几个,同时存在也可以;但是Primary Key
不能为空不能重复,而其一个表里只能有一个Primary Key
。
6.乐观锁是啥,悲观锁是啥?
[我的答案]悲观锁Pessimistic Lock
, 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block
直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
乐观锁Optimistic Lock
, 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition
机制的其实都是提供的乐观锁。
两种锁各有优缺点,不可认为一种好于另一种,像乐观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果经常产生冲突,上层应用会不断的进行retry,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适。
7.如何在python的三引号里添加变量?
[我的答案]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17~$ python
Python 2.7.3 (default, Jan 2 2013, 16:53:07)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> context = """Here is an example block template:
... name: %(name)s
... age: %(age)d
... job: %(job)s
... """
>>>
>>> print context % dict(name="Tim Wang", age=45, job="Coder")
Here is an example block template:
name: Tim Wang
age: 45
job: Coder
>>>
8.redis
满了会怎么样?
[我的答案]默认情况下redis
满了就不会存储新的数据了,不过这个可以调整,redis
在达到指定内存的时候可以通过设定的策略来做不同的动作,常见策略如下:
1)noeviction
:返回错误当内存限制达到并且客户端尝试执行会让更多内存被使用的命令(大部分的写入指令,但DEL和几个例外)
2)allkeys-lru
: 尝试回收最少使用的键(LRU),使得新添加的数据有空间存放。
3)volatile-lru
: 尝试回收最少使用的键(LRU),但仅限于在过期集合的键,使得新添加的数据有空间存放。
4)allkeys-random
: 回收随机的键使得新添加的数据有空间存放。
5)volatile-random
: 回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键。
6)volatile-ttl
: 回收在过期集合的键,并且优先回收存活时间(TTL)较短的键,使得新添加的数据有空间存放。
9.啥是“脏读”、“不可重复读”、“幻读”?
[我的答案]脏读
又称无效数据的读出,是指在数据库访问中,事务T1将某一值修改,然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改,这就导致了T2所读取到的数据是无效的。
不可重复读
是指在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。这是由于查询时系统中其他事务修改的提交而引起的。比如事务T1读取某一数据,事务T2读取并修改了该数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果。
幻读
是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,比如这种修改涉及到表中的“全部数据行”。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入“一行新数据”。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
10.ext2、ext3、ext4的区别是啥?
[我的答案]ext3
和ext2
的主要区别在于,ext3
引入Journal
。ext2
和ext3
的格式完全相同,只是在ext3
硬盘最后面有一部分空间用来存放Journal
(日志)的记录;
在ext2
中,写资料到硬盘中时,先将资料写入缓存中,当缓存写满时才会写入硬盘中;
在ext3
中,写资料到硬盘中时,先将资料写入缓存中,待缓存写满时系统先通知Journal
,再将资料写入硬盘,完成后再通知Journal
,资料已完成写入工作;
在ext3
中,也就是有Journal
机制里,系统开机时检查Journal
的资料,来查看是否有错误产生,这样就快了很多;
ext4
和ext3
的主要区别在于:首先ext4
与ext3
兼容,ext3
只支持32,000个子目录,而额ext4
支持无限数量的子目录;ext3
所支持的16TB文件系统和最大的2TB的文件,而ext4
分别支持1EB(1,048,576TB,1EB=1024PB,1PB=1024TB)的文件系统,以及16TB的文件;ext3
的数据块分配策略是尽快分配,而ext4
是尽可能地延迟分配,直到文件在cache
中写完才开始分配数据块并写入磁盘;ext4
允许关闭日志,以便某些有特殊需求的用户可以借此进一步提升性能等等等等。
11.简述一下A记录与NS记录的区别
1.A记录是名称解析的重要记录,它用于将特定的主机名映射到对应主机的IP地址上。你可以在DNS服务器中手动创建或通过DNS客户端动态更新来创建。
2.NS记录此记录指定负责此DNS区域的权威名称服务器。
3.A记录和NS记录的区别是,A记录直接给出目的IP,NS记录将DNS解析任务交给特定的服务器,NS记录中记录的IP即为该特定服务器的IP地址。
4.NS记录优先于A记录,A记录优先于CNAME记录。
参考资料
https://blog.insanecoder.top/tcp-packet-splice-and-split-issue/
http://blog.csdn.net/tiandijun/article/details/41961785
http://www.redis.cn/topics/lru-cache.html
http://blog.csdn.net/d_guco/article/details/53166722
http://www.hollischuang.com/archives/934
http://zhaodedong.leanote.com/post/Linux%EF%BC%9AExt2-Ext3-Ext4%E7%9A%84%E5%8C%BA%E5%88%AB