Redis 提供了多种内存淘汰策略,用来处理内存满了时该如何清理数据。

常见的内存淘汰策略有:

noeviction:当内存满时,Redis 不会删除任何数据,直接返回错误。
allkeys-lru:删除最久未使用的数据。
volatile-lru:删除那些设置了过期时间的,最久未使用的数据。
allkeys-random:随机删除任何数据。
volatile-random:随机删除那些设置了过期时间的数据。
volatile-ttl:删除过期时间最近的数据。
allkeys-lfu:删除最不常用的数据。
volatile-lfu:删除最不常用的、设置了过期时间的数据。
每种策略适合不同的场景,可以根据需要灵活选择配置。

📚 知识内容
Redis 的内存淘汰策略在内存使用达到最大限制时决定了哪些数据将被清理。以下是几种常见的淘汰策略:

🚫 1. noeviction
解释:当内存达到最大限制时,Redis 将拒绝任何新的写操作,直到有足够的内存空间。

适用场景:适合对数据完整性要求极高的场景,保证不丢失任何数据。

源码示例:

maxmemory-policy noeviction

🎲 2. volatile-random (随机删除过期数据)
解释:此策略会随机删除设置了过期时间的数据。

适用场景:适用于不关心具体哪些数据被删除的场景,只希望在内存满时清除过期数据。

源码示例:

maxmemory-policy volatile-random

⏳ 3. volatile-ttl (优先删除即将过期的数据)
解释:此策略会优先删除那些即将过期的数据。

适用场景:适用于缓存数据需要根据过期时间来控制的场景,优先保留有较长过期时间的数据。

源码示例:

maxmemory-policy volatile-ttl

🕰️ 4. volatile-lru (最近最少使用,针对过期数据)
解释:此策略会对设置了过期时间的数据进行 LRU(Least Recently Used,最近最少使用)淘汰,删除最近最少被使用的键。

适用场景:适用于希望删除那些过期且长时间未被访问的数据。

源码示例:

maxmemory-policy volatile-lru

🧠 5. volatile-lfu (最近最少使用,针对过期数据,Redis 4.0 后新增)
解释:与 volatile-lru 类似,但使用 LFU(Least Frequently Used,最少频繁使用)算法淘汰过期数据,优先删除那些最少被访问的数据。

适用场景:适用于希望删除访问频率较低的过期数据,而不是仅仅依赖于最近使用情况的场景。

源码示例:

maxmemory-policy volatile-lfu

🎰 6. allkeys-random (随机删除任意数据)
解释:当内存满时,Redis 会随机删除任意键,无论该键是否设置了过期时间。

适用场景:适用于不关心具体删除哪些数据的场景,尤其是在缓存中删除一些不再使用的数据。

源码示例:

maxmemory-policy allkeys-random

🔄 7. allkeys-lru (最近最少使用,针对所有数据)
解释:此策略会根据 LRU(最近最少使用)算法删除最近最少被访问的键,适用于没有过期时间的所有键。

适用场景:适合于希望优先保留最常访问的数据的缓存场景。

源码示例:

maxmemory-policy allkeys-lru

📉 8. allkeys-lfu (最少频繁使用,针对所有数据,Redis 4.0 后新增)
解释:此策略会使用 LFU(最少频繁使用)算法淘汰最少被访问的键,适用于没有过期时间的所有键。

适用场景:适合于希望根据访问频率清理缓存的场景,保持常用的数据。

源码示例:

maxmemory-policy allkeys-lfu

🚀 知识拓展
如何设置最大内存限制?
在 Redis 中,可以通过 maxmemory 参数来设置内存的最大限制。设置了这个限制后,Redis 就会根据你配置的淘汰策略来决定何时清理数据。

maxmemory 2gb

这意味着 Redis 的最大内存为 2GB,达到这个限制时就会触发相应的内存淘汰策略。

如何选择合适的内存淘汰策略?
如果你需要精细化地管理带有过期时间的数据,选择 volatile-lru 或 volatile-lfu 可能是更好的选择。
如果你不关心内存中哪些数据被删除,可以选择 allkeys-random 或 volatile-random。
对于缓存系统,通常推荐使用 allkeys-lru 或 allkeys-lfu,具体取决于你是更倾向于删除最少使用的数据,还是最少访问的数据。