Redis缓存设计与性能优化最佳实战
-
Redis对于过期key有三种清除策略-
被动删除: 当读/写一个已经过期的key时,会触发惰性删除策略,直接删除这个过期key-
例子
- key的过期时间到了就被删除了
-
-
主动删除: 由于惰性删除策略无法保证冷数据被及时删除,所以Redis会定期主动淘汰一批已过期的key-
例子
- 比如制定了删除策略,将top10后面的key进行删除
-
-
强制删除: 当前已用内存超过maxmemory限制时,触发主动清理策略
-
-
缓存过期算法-
LRU算法- (
Least Recently Used)最近最少使用 - 淘汰很久没被访问过的数据,以
最近一次访问时间作为参考
- (
-
LFU算法- (Least Frequently Used)最近不经常使用
- 淘汰最近一段时间被访问次数最少的数据,以
次数作为参考
-
-
主动清除策略-
针对
设置了过期时间的key做处理- volatile-ttl: 在筛选时,会针对设置了过期的键值对,根据过期时间的先后进行删除,越早过期的越先被删除
- volatile-random: 在设置了过期的键值对中,进行随机删除
- volatile-lru: 会使用LRU算法筛选设置了过期时间的键值对删除
- volatile-lfu: 会使用LFU算法筛选设置了过期时间的键值对删除
-
针对所有的key做处理- allkeys-random: 从所有键值对中随机选择并删除数据
- allkeys-lru: 使用LRU算法在所有数据中进行筛选删除
- allkeys-lfu: 使用LFU算法在所有数据中进行筛选删除
-
不处理- noevication: 不会删除任何数据,拒绝所有写入操作并返回客户端错误信息. OOM command not allowed...
- used memory: 此时Redis只响应读操作
-
-
问题: 如何选择缓存过期算法- 当存在热点数据时,LRU的效率很好
- 偶发性的、周期性的批量操作会导致LRU命中率急剧下降,缓存污染情况比较严重,这时使用LFU可能更好点
- 根据自身业务类型,配置好maxmemory-policy默认是noevication,推荐使用volatile-lru。如果不设置最大内存,当Redis内存超出内存限制时,内存的数据会开始和磁盘产生频繁的交换,会让Redis的性能急剧下降
- 当Redis运行在主从模式时,只有主节点才会执行过期删除策略,然后把删除操作同步到从节点删除数据
-
连接池参数