Redis——数据淘汰策略

文章目录

  • [1. 引入](#1. 引入)
  • [2. 讲解](#2. 讲解)
    • [2.1 Redis 中的 8 种数据淘汰策略](#2.1 Redis 中的 8 种数据淘汰策略)
    • [2.2 LRU 和 LFU 算法](#2.2 LRU 和 LFU 算法)
    • [2.3 建议](#2.3 建议)
  • [3. 总结](#3. 总结)

1. 引入

Redis------数据过期策略 的"引入"部分讲解过,Redis 的数据存在内存中,而内存容量相对较小,不能将大量数据 无限期 地缓存。然而,对于有些场景,例如 缓存击穿 的解决方案二------逻辑过期,需要将一部分数据 "无限期" 地缓存到 Redis 中;或者在某一时间段内,海量查询请求使得大量数据缓存到 Redis 中。

那么当缓存的数据越来越多,直至 Redis 的最大内存限制时,Redis 会如何应对呢?这就涉及到本文要讲的 数据淘汰策略 (缓存淘汰策略 ),即 Redis 在内存达到最大限制时,为了释放空间,选择键删除的方式

2. 讲解

2.1 Redis 中的 8 种数据淘汰策略

Redis 的数据淘汰策略共有 8 种:

  • noeviction:不淘汰任何键,内存达到最大限制后不允许写入新数据,是 默认策略
  • volatile-ttl:对设置了 TTL (Time-to-Live,过期时间) 的键,比较键的剩余 TTL 值,TTL 越小的值,越先淘汰。
  • allkeys-random:对于所有键,随机选择并淘汰。
  • volatile-random:对于设置了 TTL 的键,随机选择并淘汰。
  • allkeys-lru:对于所有键,基于 LRU 算法进行淘汰。
  • volatile-lru:对于设置了 TTL 的键,基于 LRU 算法进行淘汰。
  • allkeys-lfu:对于所有键,基于 LFU 算法进行淘汰。
  • volatile-lfu:对于设置了 TTL 的键,基于 LFU 算法进行淘汰。

在 Redis 的 redis.conf 配置文件中,配置方式如下:

conf 复制代码
maxmemory-policy allkeys-lru # 使用 对所有键按 LRU 淘汰 的策略

2.2 LRU 和 LFU 算法

  • LRU (Least Recently Used,最近最少使用):重点关注数据的 使用时间 ,淘汰 最久未使用 的数据。假如三个键 name, age, weight 从前到后依次缓存到 Redis 中,并且使用的顺序为 age -> name -> weight -> name,如果需要基于 LRU 淘汰,则淘汰的优先级是 age > weight > name
  • LFU (Least Frequently Used,最少频率使用):重点关注数据的 使用频率 ,淘汰 使用频率最低 的数据。

2.3 建议

  • 一般情况下,使用 allkeys-lru 策略,把 最近最常用 的数据留在缓存中。因为大部分情况下,数据都是有 冷热 之分的,也就说有些数据 访问频率 高,有些低;然而 很久之前的 访问频率高的 数据再被访问的可能性不大,所以不需要缓存很久之前的数据。综上所述,一般情况适合使用 allkeys-lru 策略。

3. 总结

当 Redis 的内存达到最大限制时,Redis 会根据指定数据淘汰策略,选择一些数据进行淘汰。其中,需要重点理解 LRU (淘汰最久未使用的数据) 和 LFU (淘汰使用频率最低的数据) 这两种算法。在生产中,建议使用 allkeys-lru 这种数据淘汰策略,保存 最近最常用 的数据。

相关推荐
iPadiPhone2 小时前
Java 泛型与通配符全链路解析及面试进阶
java·开发语言·后端·面试
Coder_Boy_2 小时前
分布式系统“三高”与数据一致性核心实践(基于实操梳理)
java·jvm·spring boot·分布式·微服务·性能优化
青衫客362 小时前
Excel 模板解析实践:基于 Apache POI 的结构化 Excel 解析方案
java·excel
liuyao_xianhui2 小时前
动态规划_简单多dp问题_打家劫舍_打家劫舍2_C++
java·开发语言·c++·算法·动态规划
小鸡脚来咯2 小时前
SQL表连接
java·开发语言·数据库
QC班长2 小时前
如何进行接口性能优化?
java·linux·性能优化·重构·系统架构
聆风吟º2 小时前
直击复杂 SQL 瓶颈:金仓基于代价的连接条件下推技术落地
java·数据库·sql·kingbasees
兆子龙3 小时前
ahooks useMemoizedFn:解决 useCallback 的依赖地狱
java·javascript
曹牧8 小时前
BeanUtils.copyProperties‌
java
QWQ___qwq8 小时前
Java线程安全深度总结:基本类型与引用类型的本质区别
java·安全·面试