redis 内存管理与优化
参考redis官方文档redis.io
过期键删除策略
1 惰性删除策略
所有读写数据库的Redis命令在执行之前都会先检查输入键是否已过期,过期则删除之。
CPU友好,内存不友好
2 定期删除策略
每当 Redis 的服务器周期性操作函数 serverCron 执行时,就会调用定期删除过期键的函数,(serverCron默认100毫秒执行一次)在规定时间内,分多次遍历服务器中的各个数据库,从数据库的过期字典中随机检查一部分键的过期时间,并删除其中的过期键。
通过全局变量记录当前处理的数据库,直到所有数据库的过期键都被删除。
过期字典
一个保存了所有键和过期时间的字典。
过期字典的键是一个指针,指向键空间中的某个键对象
过期字典的值是一个 long long 类型的整数,这个整数保存了键所指向的数据库键的过期时间
redis数据淘汰策略
在redis中,允许用户设置最大使用内存大小maxmemory(需要配合maxmemory-policy使用),设置为0表示不限制;当redis内存数据集快到达maxmemory时,redis会实行数据淘汰策略。Redis提供6种数据淘汰策略:
- volatile-lru:从设置过期时间的数据集中以lru算法淘汰
- volatile-ttl:从设置过期时间的数据集中淘汰即将过期的
- volatile-random:随机淘汰设置过期时间的数据集
- allkeys-lru: 对内存内所有数据集用LRU淘汰
- allkeys-random: 随机删除
- noenviction: 默认策略,不淘汰,不再写入,直接返回错误。
关于maxmemory设置,通过在redis.conf中maxmemory参数设置,或者通过命令CONFIG SET动态修改
关于数据淘汰策略的设置,通过在redis.conf中的maxmemory-policy参数设置,或者通过命令CONFIG SET动态修改
场景:
allkeys-lru: 如果我们的应用对缓存的访问符合幂律分布(也就是存在相对热点数据),或者我们不太清楚我们应用的缓存访问分布状况,我们可以选择allkeys-lru策略。
allkeys-random: 如果我们的应用对于缓存key的访问概率相等,则可以使用这个策略。
volatile-ttl: 这种策略使得我们可以向Redis提示哪些key更适合被eviction。
另外,volatile-lru策略和volatile-random策略适合我们将一个Redis实例既应用于缓存和又应用于持久化存储的时候,然而我们也可以通过使用两个Redis实例来达到相同的效果,值得一提的是将key设置过期时间实际上会消耗更多的内存,因此我们建议使用allkeys-lru策略从而更有效率的使用内存。