Redis 过期策略+内存淘汰机制

关于过期有一个标识过期时间的,针对String类型的,有 setex(String key, int seconds, String value)--字符串独有的方式这个命令,其他的数据类型,则有expire key time(以秒为单位) 这个命令去设置过期时间。

redis 的过期策略有一下几种{这些知识网上一查一大堆,都整理的很好,但是自己整理一遍,记忆理解都会加深很多}

过期策略:

    • 定时删除
      在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除。
      优点:这样做内存就能尽快被释放掉,
      缺点:每一个key 创建一个定时器,大量的定时器会被创建。
    • 惰性删除
      • 含义:key过期的时候不删除,每次从数据库获取key的时候去检查是否过期,若过期,则删除,返回null。
      • 优点:删除操作只发生在从数据库取出key的时候发生,而且只删除当前key,所以对CPU时间的占用是比较少的,而且此时的删除是已经到了非做不可的地步(如果此时还不删除的话,我们就会获取到了已经过期的key了)
      • 缺点:若大量的key在超出超时时间后,很久一段时间内,都没有被获取过,那么可能发生内存泄露(无用的垃圾占用了大量的内存)

            定期删除

            每隔一段时间执行一次删除过期key操作
      优点:
      • 通过限制删除操作的时长和频率,来减少删除操作对CPU时间的占用--处理"定时删除"的缺点
      • 定期删除过期key--处理"惰性删除"的缺点
      缺点:定时删除和惰性删除的优点被弱化了
    redis 是惰性删除和定期删除结合使用的。

内存淘汰策略:

最大内存设置:maxmemory   ,redis 一共有六种淘汰策略,默认是volatile-lru

  • volatile-lru:使用LRU算法进行数据淘汰(淘汰上次使用时间最早的,且使用次数最少的key),只淘汰设定了有效期的key ;
  • allkeys-lru:使用LRU算法进行数据淘汰,所有的key都可以被淘汰;
  • volatile-random:随机淘汰数据,只淘汰设定了有效期的key;
  • allkeys-random:随机淘汰数据,所有的key都可以被淘汰;
  • volatile-ttl:淘汰剩余有效期最短的key;
  • no-enviction:不删除任意数据(但redis还会根据引用计数器进行释放),这时如果内存不够时,会直接返回错误 。
原文地址:https://www.cnblogs.com/junbaba/p/12910699.html