Redis是一种高性能的内存数据库,它支持多种数据结构和过期时间设置。过期时间可以用来控制数据的生命周期,当一个key到达过期时间后,它就会被自动删除,从而释放内存空间。但是,Redis并不是实时地删除过期的key,而是采用了一种惰性删除和定期删除的混合策略。这种策略既能保证内存的高效利用,又能避免对性能造成太大的影响。
惰性删除是指当一个key被访问时,Redis会检查它是否已经过期,如果是,就立即删除它。这样可以保证不会有过期的key被返回给客户端。但是,这种方式也有一个缺点,就是如果有很多key从来不被访问,那么它们就会一直占用内存,造成内存浪费。
定期删除是指Redis每隔一段时间会执行一个后台任务,随机地从一些设置了过期时间的key中选取一部分,检查它们是否已经过期,如果是,就删除它们。这样可以避免内存被无用的key占满。但是,这种方式也有一个缺点,就是无法保证所有的过期key都能及时被清理,而且可能会对性能造成一定的波动。
为了平衡惰性删除和定期删除的优缺点,Redis提供了一些参数来调整过期key清理策略。其中最重要的参数是maxmemory和maxmemory-policy。maxmemory用来设置Redis可以使用的最大内存量,当内存达到这个限制时,Redis就会触发过期key清理策略。maxmemory-policy用来设置当内存达到限制时,Redis应该如何选择要删除的key。Redis提供了以下几种选择:
1.noeviction:不删除任何key,只返回错误。
2.allkeys-lru:从所有的key中选择最近最少使用(LRU)的key进行删除。
3.volatile-lru:从设置了过期时间的key中选择最近最少使用(LRU)的key进行删除。
4.allkeys-random:从所有的key中随机选择一个进行删除。
5.volatile-random:从设置了过期时间的key中随机选择一个进行删除。
6.volatile-ttl:从设置了过期时间的key中选择剩余时间最短的进行删除。
根据不同的业务场景和需求,可以选择合适的参数来优化Redis的过期key清理策略。一般来说,如果内存不是很紧张,可以使用noeviction或者volatile-lru等策略,让Redis尽可能地保留数据。如果内存比较紧张,可以使用allkeys-lru或者volatile-ttl等策略,让Redis更加积极地释放内存空间。