Redis是一个高性能的内存数据库,它支持多种数据结构和过期时间设置。Redis的key过期后,不会立即从内存中删除,而是采用了一种惰性删除和定期删除的混合策略。
惰性删除是指当一个key被访问时,Redis会检查它是否已经过期,如果是,就删除它,并返回nil。这样可以避免浪费资源去扫描不常用的key,但是也有一个缺点,就是如果一个key很长时间没有被访问,它就会一直占用内存,造成内存浪费。
定期删除是指Redis每隔一段时间,会从一定数量的随机key中选择一些已经过期的key进行删除。这样可以减少内存浪费,但是也有一个缺点,就是如果随机选择的key中没有过期的key,或者过期的key很少,那么这个操作就会很低效,而且可能会导致过期key积累过多,影响性能。
为了平衡惰性删除和定期删除的优缺点,Redis提供了一个参数maxmemory-policy,用来控制当内存达到上限时,如何回收内存。这个参数有以下几种取值:
1.noeviction:不进行任何回收,只返回错误。
2.allkeys-lru:从所有的key中选择最近最少使用的key进行回收。
3.volatile-lru:从设置了过期时间的key中选择最近最少使用的key进行回收。
4.allkeys-random:从所有的key中随机选择一个key进行回收。
5.volatile-random:从设置了过期时间的key中随机选择一个key进行回收。
6.volatile-ttl:从设置了过期时间的key中选择剩余时间最短的key进行回收。
根据不同的业务场景和需求,可以选择合适的回收策略。一般来说,如果希望尽可能保留所有的数据,可以选择noeviction或者allkeys-lru;如果希望优先保留没有设置过期时间的数据,可以选择volatile-lru或者volatile-random;如果希望优先保留剩余时间较长的数据,可以选择volatile-ttl。
Redis的key过期后没有删除是一种有利于提高性能和节省资源的设计,但是也需要注意内存管理和回收策略,以避免内存溢出或者性能下降。