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 这种数据淘汰策略,保存 最近最常用 的数据。

相关推荐
纪莫6 分钟前
技术面:MySQL(一条SQL在MySQL的执行过程?、MyISAM和InnoDB的区别?数据库事务机制?)
java·数据库·java面试⑧股
闲人编程11 分钟前
Python协程的演进:从yield到async/await的完整历史
java·前端·python·async·yield·await·codecapsule
q***925119 分钟前
PHP操作redis
开发语言·redis·php
帅中的小灰灰26 分钟前
C++编程建造器设计模式
java·c++·设计模式
动感小麦兜1 小时前
应用-常用工具部署命令
java·开发语言
日日行不惧千万里1 小时前
IDEA 是用什么开发的?
java·ide·intellij-idea
是垚不是土2 小时前
运维新人踩坑记录:Redis与MySQL生产故障排查&优化手册
运维·数据库·redis·mysql·云计算·bootstrap
百***06012 小时前
五大消息模型介绍(RabbitMQ 详细注释版)
java·rabbitmq·java-rabbitmq
转转技术团队3 小时前
MyBatis-Plus踩坑血泪史:那些年我们踩过的坑!
java·面试·mybatis
i***66503 小时前
Spring Boot 整合 Redis 步骤详解
spring boot·redis·bootstrap