Redis学习笔记(3)——内存淘汰策略

设置键的过期时间

  • 使用EXPIRE或者PEXPIRE命令,经过指定的秒/毫秒数之后,服务器会自动删除过期的键。
  • Redis通过一个过期字典来保存所有键的过期时间,它的键为指向某个键的指针,它的值为该键的过期时间(一个毫秒精度的时间戳,为long long类型的整数)。
  • 通过过期字典,可以得知给定的键是否存在于过期字典,如果存在,可知其过期时间是否在当前UNIX时间戳之前,从而判断键是否过期。

过期键删除策略

  • 定时删除:设置键过期时间的同时设置一个定时器,定时器会在键过期的同时触发对键的删除操作。
  • 惰性删除:放任过期的键不管,当获取键时会检查该键是否过期,如果过期则删除该键。
  • 定期删除:每隔一段时间就对数据库中的键进行一次抽查,删除其中过期的键。
  • 定时删除会占用大量的CPU时间,影响服务器的响应时间和吞吐量;惰性删除会浪费太多内存;定期删除是前两者的折中。Redis实际采用的是惰性删除和定期删除相结合的策略。

内存淘汰策略

  • 惰性删除和定期删除只能删除部分过期的键,当缓存的数据超过设定的最大内存时,需要借助内存淘汰策略清理无效的键。Redis中有以下8种淘汰策略:
    • volatile-lru:从配置了过期时间的键中,删除最久未使用的键;
    • volatile-lfu:从配置了过期时间的键中,删除使用频率最少的键;
    • volatile-ttl:从配置了过期时间的键中,删除即将要过期的键;
    • volatile-random:从配置了过期时间的键中,随机删除;
    • allkeys-lru:从所有键中,删除最久未使用的键;
    • allkeys-lfu:从所有键中,删除使用频率最少的键;
    • allkeys-random:从所有键中,随机删除;
    • noeviction:超过内存时报错,不会删除任何键。
  • Redis的LRU是近似LRU,通过比较当前时间戳与键的时间戳之差来得到最久未使用的键,目的是节省内存、提高性能。