0
点赞
收藏
分享

微信扫一扫

Redis的内存淘汰机制和删除策略

登高且赋 2022-03-30 阅读 72

Redis内存淘汰指的是用户存储的一些键被可以被Redis主动地从实例中删除。内存的淘汰机制的初衷是为了更好地使用内存。

我们可以通过配置redis.conf中的maxmemory这个值来开启内存淘汰功能,这个值的大小一般设置为Redis容量的15%-30%,因为我们查询的数据大部分都在这15%-30%,我们只缓存这么多的数据,兼顾访问性能和内存空间开销。
同时Redis也支持运行期间修改淘汰策略,这使得我们不需要重启Redis实例而实时的调整内存淘汰策略。
设置命令:config set maxmemory 5gb(设置5GB为例)
查看命令:config get maxmemory

淘汰策略配置:maxmemory-policy noeviction
修改配置文件:config set maxmemory-policy allkeys-lru
它们的触发条件都是Redis使用的内存达到阈值时。
应用场景:但是需要注意,将key设置过期时间实际上会消耗更多的内存,因此我们建议使用allkeys-lru策略从而更有效率的使用内存。
volatile-lru策略和volatile-random策略适合我们将一个Redis实例既应用于缓存和又应用于持久化存储的时候。
allkeys-random:如果我们的应用对于缓存key的访问概率相等,则可以使用这个策略。

Redis的每个Key都可以设置一个过期时间,当达到过期时间的时候,这个key就会被自动删除。这就是Redis的过期策略。

Redis使用懒惰删除+定期删除相结合的方式处理过期的key。

所谓懒惰删除就是在客户端访问该key的时候,redis会对key的过期时间进行检查,如果过期了就立即删除。
优点:在访问的时候检查key的过期时间,不会占用太多的额外CPU资源。
缺点:如果一个key已经过期了,如果长时间没有被访问,那么这个key就会一直存留在内存之中,严重消耗了内存资源。

Redis会将所有设置了过期时间的key放入一个字典中,然后默认每隔100ms从字典中随机一些key检查过期时间并删除已过期的key。在Redis2.8版本后,可以通过修改配置文件redis.conf 的 hz 选项来调整这个扫描的次数。
扫描的过程如下:
1、从过期字典中随机20个key
2、删除这20个key中已过期的
3、如果超过25%的key过期,则重复第一步
同时,为了保证不出现循环过度的情况,Redis还设置了扫描的时间上限,默认不会超过25ms。

举报

相关推荐

0 条评论