redis的过期策略-----为什么设置了过期时间redis内存却还是不减

以前遇到过一个神奇的问题,就是redis中的数据明明设置了过期时间,可是到时间了去看内存大小还是没有减少,但是用客户端打开db检查之后,里边瞬间少了很多过期的数据,那时候很不理解,后来去看了官网了解了过期的处理机制

默认过期策略

在设置了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

你可能感兴趣的:(redis的过期策略-----为什么设置了过期时间redis内存却还是不减)