AzkaBan  

阻塞IO:
当使用read或者write对某一文件描述符(File Descriptor FD)进行读写的时候,如果数据没有收到,那么该线程会被挂起,直到收到数据。


I/O多路复用:
多个连接的管理可以在同一进程, 把多个连接的事件通知业务代码处理, 该方法能同时监控多个文件描述符(fd)的读写情况,当其中的某些fd可读/写时,该方法就会返回可读/写的fd个数。


epoll作为I/O多路复用:
网络IO传递的fd_set数据, epoll只告诉那些需要读/写的socket, 整个过程只在调用epoll的时候才会阻塞,收发客户消息是不会阻塞的。

 

例子:
比如一个tcp服务器处理20个客户端socket。A方案:顺序处理,如果第一个socket因为网卡读数据处理慢了,一阻塞后面都玩蛋去。
B方案:每个socket请求都创建一个分身子进程来处理,不说每个进程消耗大量系统资源,光是进程切换就够操作系统累的了。
C方案**(I/O复用模型,epoll):将用户socket对应的fd注册进epoll(实际上服务器和操作系统之间传递的不是socket的fd而是fd_set的数据结构),
然后epoll只告诉哪些需要读/写的socket,只需要处理那些活跃的、有变化的socket fd的就好了。这样,整个过程只在调用epoll的时候才会阻塞,收发客户消息是不会阻塞的。


LRU最近最少使用缓存算法:
运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put。

一种方式是基于双链表: 点击到的就推到头部, 如果数据量变大, 肯定会造成数据热点; 另外,频繁移动数据位置也会造成资源浪费;


另一种是为Key计数, 随机10个key加入pool, 外加时间衰减因素, 没过一分钟衰减1;

 


redis对过期数据的处理:
惰性删除:惰性删除策略不会在键过期的时候立马删除,而是当外部指令获取这个键的时候才会主动删除。处理过程为:接收get执行、判断是否过期(这里按过期判断)、执行删除操作、返回nil(空)。
定期删除:定期删除是设置一个时间间隔,每个时间段都会检测是否有过期键,如果有执行删除操作。这个概念应该很好理解。

 

“读后写”问题:
存在A、B两个进程,同时操作下面这段代码:

$objRedis = new Redis();
//获取key
$intNum = $objRedis->get('key');
if ($intNum == 1) {
//如果key的值为1,则给key加1
$bolRet = $objRedis->incr('key');

//do something...
}

一种方法是: Redis操作方法添加线程锁(lock),让其他线程排队. 另一种是对key进行加盐, 需要根据场景设计(大规模数据写入), 应该还有后续数据处理;


缓存技术并不是raft算法;

posted on 2019-09-17 14:30  AzkaBan  阅读(238)  评论(0编辑  收藏  举报