这是我参与「第五届青训营 」伴学笔记创作活动的第2天。
今天接着学习 Redis 相关知识。
我们一般说 Redis 是单线程模型。Redis 基于 Reactor 模式开发了自己的网络事件处理器:这个处理器被称为文件事件处理器(file event handler)。文件事件处理器通过IO多路复用程序来监听来自客户端的大量连接(或者说是监听多个socket),并根据套接字目前执行的任务来为套接字关联不同的事件处理器。 当被监听的套接字准备好执行连接应答(accept)、读取(read)、写入(write)、关闭(close)等操作时,与操作相对应的文件事件就会产生,这时文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件。这样的好处非常明显:IO多路复用技术既实现了高性能的网络通信模型,又让 Redis 不需要额外创建多余的线程来监听客户端的大量连接,降低了资源的消耗。
文件事件处理器结构如下图所示:
下面学习 Redis 过期数据删除策略:
- 惰性删除:只有在取出key时才会对数据进行过期检查。
- 定期删除:每隔一定时间抽取一批key对其进行过期检查。
定期删除对内存更加友好,惰性删除对 CPU 更加友好。两者各有千秋,所以 Redis 采用的是 定期删除+惰性删除 。
内存淘汰机制如下(在 Redis4.0 版本之前有6种策略,4.0增加了2种,主要新增了 LFU 算法):
- no-eviction:不进行淘汰。
- allkeys-random:从数据集中随机删除。
- allkeys-lru:使用 LRU 算法进行筛选删除,当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key。
- allkeys-lfu:使用 LFU 算法进行筛选删除,当内存不足以容纳新写入数据时,在键空间中,移除最不经常使用的 key。(新增)
- volatile-random:从已设置过期时间的数据集中随机删除。
- volatile-ttl:从已设置过期时间的数据集中根据过期时间先后进行删除,越早过期的越先被删除。
- volatile-lru:从已设置过期时间的数据集中使用 LRU 算法进行筛选删除。
- volatile-lfu:从已设置过期时间的数据集中使用 LFU 算法进行筛选删除。(新增)