分布式相关

redis的过期策略

2020-05-03  本文已影响0人  从此110

redis中的数据明明设置了过期时间,可是到时间了去看内存大小还是没有减少,但是用客户端打开db检查之后,里边瞬间少了很多过期的数据,那时候很不理解,为什么?这涉及到redis的过期处理机制

默认过期策略
在设置了expire之后,redis使用的过期策略是:定期删除+惰性删除

定期删除
redis默认每隔100ms就随机的抽取一些设置了expire的key去检查是否过期,如果过期了就删除。这种定期删除只会检查一部分的key,不可能遍历全部的key,不然key多的话redis就卡死了。所以定期删除有个弊端就是无法完全的将过期的key全部移除。

惰性删除
redis除了定期删除之外还有一种触发方式,就是在获取一个key的时候,redis会检查一下这个key是否过期,如果过期了,就会删除,且不给你返回,这种方式就是你用到key了,它才删,所以叫惰性删除。我遇到的使用客户端打开db以后key就少了很多的现象,应该就是客户端打开db的时候会自动调用keys *命令吧,把所有的key都扫了一遍

内存淘汰
上面说的定期和惰性删除其实都无法完全解决问题,如果一个key过期了呆了很久,没有被定期抽中,也没有被访问,岂不是一直占内存,所以redis最后还是有一个内存淘汰的机制,这个机制包括以下几种策略
当内存大小不够写入新数据时:

noeviction:写入会报错。这种基本不会去用的
allkeys-lru:移除最近最少使用的key,这个是常用的策略,比较科学
allkeys-random:随机的移除某个key
volatile-lru: 设置了过期时间的key里面,移除最近最少使用的
volatile-random: 设置了过期时间的key里面,随机移除
volatile-ttl:设置了过期时间的key里面,先移除过期时间更早的key

作者:奔跑的Robi
链接:https://www.jianshu.com/p/0cdf2370f227
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

上一篇下一篇

猜你喜欢

热点阅读