Redis & 淘汰策略 & 问题

前言


相关系列

在内存耗尽的情况访问Redis会发生什么?


如果是读指令会正常返回,而如果是写指令则会根据实际的淘汰策略抛出异常或删除符合条件的部分数据以空出内存空间。

Redis的淘汰策略有哪些?


Redis淘汰策略用于在内部不足时选定部分数据删除以空出内存空间。

  • ++eviction @ 逐出++
    ++no-eviction:当内存不足以/不允许写入新数据时,写操作会报错(默认,但不推荐);++
  • ++lru @ Least Recently Used @ 最近最少使用++
    ++allkeys-lru:当内存不足以/不允许写入新数据时,删除最近最少使用的数据(常用);++
    ++volatile-lru:当内存不足以/不允许写入新数据时,删除最近最少使用的期限数据,无期限数据时会报错(常用);++
  • ++lfu @ Least Frequently Used @ 最少使用++
    ++allkeys-lfu:当内存不足以/不允许写入新数据时,删除最少使用的数据;++
    ++volatile-lfu:当内存不足以/不允许写入新数据时,删除最少使用的期限数据,无期限数据时会报错;++
  • ++random @ 随机++
    ++allkeys-random:当内存不足以/不允许写入新数据时,删除随机数据;++
    ++volatile-random:当内存不足以/不允许写入新数据时,删除随机期限数据,无期限数据时会报错;++
  • ++ttl @ Time To Live @ 存活时间++
    ++volatile-ttl:当内存不足以/不允许写入新数据时,删除最快过期的期限数据,无期限数据时会报错(常用)。++

Redis的LRU/LFU淘汰策略是精确实现吗?


Redis对LRU/LFU类型的淘汰策略采用的是近似实现,因此统计/对比所有目标数据的最近/完全使用次数/频率是非常耗费性能的行为...近似实现的主要思想具体如下:

  • ++最近/长期使用频率的模拟:Redis并不会对数据的最近/长期使用频率进行精确计算,而是会使用最近访问时间/概率访问总数来进行模拟。Redis会为数据的每次访问记录时间,而LRU淘汰策略便会使用最近访问时间来作为最近使用频率来进行比较。最近访问时间最早的数据会被认为最近使用频率最小,因此该内部数据便会被最终淘汰。此外Redis还会"概率"增长中数据的访问总数,从而便可以在不破坏整体增长趋势的情况下通过避免增长来提升整体性能,并在LFU淘汰策略中充当长期使用频率来进行比较。Redis还考虑了时间衰减因素对长期使用频率的影响,因为数据的时间跨度并不相同, 并且某些数据可能只在早期被频繁使用,而在这之后就被长期闲置。很显然这种数据即使长期使用频率较高也更适合被删除,因此为了令最近使用总数可以占据更高的频率比重Redis在"概率"增长访问总数的同时还会根据当前时间与最近访问时间的差值大小来对应的减少访问总数。++
  • ++局部比较代替全量比较:为了最大程度的提升性能/降低开销,Redis不会去比较全量数据的最近/长期使用频率,而只会随机抽取{maxmemory-samples}配置项数量的数据来进行局部比较,并将最近/长期使用频率最小的数据淘汰。++
相关推荐
CAE虚拟与现实16 分钟前
重置系统后,Postgresql不用重装
数据库·redis·postgresql·kafka
java1234_小锋24 分钟前
Redis 支持哪些数据类型?请分别说明它们的使用场景
java·数据库·redis
半夜修仙2 小时前
Redis中String数据类型的常见命令
数据库·redis·缓存
LB21122 小时前
消灭并发重复调用:基于 Agent 调用 LLM 的分布式 Single-Flight 实战
java·开发语言·redis·分布式·agent
JAVA社区2 小时前
Java进阶全套教程(七)—— Redis超详细实战详解
java·linux·开发语言·redis·面试·职场和发展
小碗羊肉4 小时前
【Redis | 第三篇】缓存(Cache)
数据库·redis·缓存
guslegend6 小时前
1.Redis服务搭建
数据库·redis·bootstrap
半夜修仙6 小时前
Redis中ZSet数据类型的常见命令
数据库·redis·缓存
shuair6 小时前
redis红锁Redlock
数据库·redis·bootstrap
努力努力再努力wz7 小时前
【Redis入门系列】:Redis 内部编码机制与 String 深度解析:SDS 底层实现、三种编码与核心命令详解
c语言·开发语言·数据结构·数据库·c++·redis·缓存