Redis是一种基于内存的高性能键值数据库,它支持为每个key设置过期时间,当key过期后,它就不能被访问了。但是,Redis并不会立即删除过期的key,而是采用了一种惰性删除和定期删除的混合策略,来平衡内存使用和性能。
惰性删除是指当一个key被访问时,Redis会检查它是否过期,如果过期了,就删除它,并返回nil。这种方式可以保证过期的key不会占用内存太久,但是也有一个缺点,就是如果有很多过期的key没有被访问,它们就会一直留在内存中,造成内存浪费。
定期删除是指Redis每隔一段时间(默认是每秒10次),会从数据库中随机抽取一些key,检查它们是否过期,如果过期了,就删除它们。这种方式可以避免惰性删除的缺点,但是也有一个问题,就是如果抽取的key都没有过期,或者抽取的数量太少,那么过期的key就不能及时被清理。
为了解决这个问题,Redis引入了一个参数叫做maxmemory-policy,它决定了当内存达到上限时,Redis应该如何淘汰key。有以下几种可选的策略:
1.noeviction:不淘汰任何key,只有当写入新数据时才会报错。
2.allkeys-lru:从所有的key中选择最近最少使用(LRU)的key淘汰。
3.volatile-lru:从设置了过期时间的key中选择最近最少使用(LRU)的key淘汰。
4.allkeys-random:从所有的key中随机选择一个key淘汰。
5.volatile-random:从设置了过期时间的key中随机选择一个key淘汰。
6.volatile-ttl:从设置了过期时间的key中选择剩余时间最短的key淘汰。
根据不同的业务场景和需求,可以选择合适的策略来优化Redis的内存使用和性能。一般来说,如果希望尽可能保留热点数据,可以选择LRU相关的策略;如果希望尽可能保留有效数据,可以选择TTL相关的策略;如果没有特别的偏好,可以选择随机相关的策略。