Redis中的过期策略
redis过期策略
定时过期、惰性过期、定期过期
问题:使用expire key 60,在key60s之后key就会过期,之后如何清除key
定时过期
每个设置过期时间的key都创建一个定时器,到时间就会对key进行清除。该策略可以立即清除过期key,对内存友好,但是需要消耗大量的cpu时间去清理过期数据,从而影响响应时间和吞吐量。
惰性过期
只有当访问一个key时,才会判断这个key是否过期,过期就清除。该策略可以节省cpu资源,但是对内存不够友好。极端情况下会出现大量的过期key没有被清理,占用内存。
定期过期
每隔一段时间,扫描一定数量数据库中的expires字典中的key,清除过期的key。该策略是前两种的一个折中策略,cpu和内存达到最优平衡。
expires字典:当我们在 Redis 中设置一个键的过期时间时,该键会被添加到 expires 字典中,并在指定的过期时间后自动从数据库中删除。expires 字典以键为索引,值为键的过期时间戳。当 Redis 中的某个键过期时,Redis 服务器会在后台自动将其从数据库中删除。Redis 服务器使用定时器来监视 expires 字典中键的过期时间,定期检查键是否已过期。当键过期时,定时器会将其标记为即将删除,并在适当的时候释放该键所占用的内存空间。
redis采用的了惰性过期和定期过期两种过期策略,定期过期。
极端情况:定期过期漏掉了很多过期key,又没有走惰性过期。就会有很多过期key在内存中。就需要淘汰策略。
内存淘汰机制
Redis的内存淘汰策略是为了解决内存不足的问题,当Redis的内存使用达到上限时,需要根据事先设置的内存淘汰策略来选择一些键,使其被删除以释放内存空间。Redis提供了多种内存淘汰策略,可以根据实际需求进行配置。
以下是Redis常见的内存淘汰策略:
-
LRU(Least Recently Used,最近最少使用):淘汰最近最少被使用的键。当内存不足时,会优先删除最近最少使用的键来释放空间。
-
LFU(Least Frequently Used,最不经常使用):淘汰最不经常被使用的键。当内存不足时,会优先删除访问频率最低的键来释放空间。
-
TTL(Time To Live,生存时间):淘汰设置了过期时间的键。当键的过期时间到期时,会被自动删除。
-
Random(随机):随机选择一些键进行删除。这种策略简单且随机性较高,但不保证删除的是最不重要的键。
-
Allkeys-LRU:除了设置了过期时间的键外,其他键按照LRU策略进行淘汰。
-
Allkeys-Random:除了设置了过期时间的键外,其他键按照随机策略进行淘汰。
-
noeviction:在Redis中,默认的内存淘汰策略是noeviction,即当内存不足时,不会自动淘汰键,而是拒绝新写入的操作,直到有足够的内存空间。但为了保证数据存储的稳定性和可用性,一般建议配置合适的内存淘汰策略,避免因为内存不足而导致系统出现问题。
可以通过配置Redis的maxmemory-policy参数来设置所需的内存淘汰策略,根据实际情况选择适合的策略来满足应用的需求。