redis数据淘汰策略

数据淘汰策略

介绍

当 Redis 的内存达到配置的最大值(maxmemory)时,为了保证新数据能正常写入,Redis 会按照预设的规则,主动删除一部分旧数据,这个规则就是数据淘汰策略。

它和 "过期删除策略" 是两套独立的机制: 过期删除策略:处理已经过期的 key。 数据淘汰策略:在内存不足时,处理所有 key(无论是否过期)。

二、Redis 支持的 8 种淘汰策略

Redis 提供了 8 种淘汰策略,可分为四大类:

1. 默认策略(不淘汰)
  • noeviction(默认):不淘汰任何 key,当内存满时,拒绝所有新的写入操作并返回错误。

    适合对数据完整性要求极高、不允许丢失任何数据的场景。

2. 基于 TTL 的策略
  • volatile-ttl :仅对设置了过期时间(TTL)的 key,优先淘汰剩余 TTL 最短的 key。

  • volatile-random:仅对设置了过期时间的 key,随机淘汰。

  • volatile-lru:仅对设置了过期时间的 key,使用 LRU(最近最少使用)算法淘汰。

  • volatile-lfu:仅对设置了过期时间的 key,使用 LFU(最少频率使用)算法淘汰。

3. 针对所有 key 的策略
  • allkeys-random:对所有 key,随机淘汰。

  • allkeys-lru:对所有 key,使用 LRU 算法淘汰最近最少使用的 key。

  • allkeys-lfu:对所有 key,使用 LFU 算法淘汰访问频率最低的 key。

三、核心算法:LRU vs LFU

  • LRU(Least Recently Used,最近最少使用)

    1)用当前时间减去最后一次访问时间,值越大的key淘汰优先级越高。

    2)适合场景:热点数据相对稳定,最近访问的就是最有价值的。

  • LFU(Least Frequently Used,最少频率使用)

    1)会统计每个key的访问频率,值越小淘汰优先级越高。

    2)适合场景:存在短时高频访问的场景,比如秒杀活动。

四、建议

优先选择 allkeys-lru:这是最通用的策略,能自动保留最近最常访问的热点数据,适合大多数有明显冷热数据区分的业务场景。

数据访问频率无明显差异 :选择 allkeys-random

需要保留 "置顶" 数据 :选择 volatile-lru,并给 "置顶" 数据不设置过期时间,这样它们永远不会被淘汰。

存在短时高频访问场景 :选择 allkeys-lfuvolatile-lfu,能更好地保留访问频率高的数据。

  1. 问:数据库有 1000 万数据,Redis 只能缓存 20 万,如何保证 Redis 中都是热点数据?

    答:使用 allkeys-lru

  2. 问:Redis 内存用完了会发生什么?

    答:这取决于配置的淘汰策略。如果是默认的 noeviction,Redis 会拒绝所有新的写入操作并返回错误;如果是其他策略,Redis 会按规则淘汰旧数据,为新数据腾出空间。

相关推荐
二宝哥12 小时前
CentOS 7.9 系统下 Redis 5.0.4 单机安装与源码编译安装指南
redis·centos
时空无限17 小时前
vllm 缓存对模型启动时间的影响
缓存·vllm
ShiXZ21318 小时前
Redis docker-compose 部署指南
redis·docker·eureka
青山木21 小时前
Redis 缓存一致性全解:从 Cache Aside 到延迟双删、Canal+MQ 的进阶之路
java·数据库·redis·后端·缓存
YDS8291 天前
大营销平台 —— 活动SKU库存扣减业务及其一致性处理
java·spring boot·redis·rabbitmq·ddd
咏方舟【长江支流】1 天前
【开源】跨语言·跨平台·跨数据库(6) ——一种ORM缓存的接口实现和容错处理
数据库·缓存·开源·咏方舟-长江支流·用宝框架
爬也要爬着前进2 天前
redis主从搭建
数据库·redis·缓存
用户095367515832 天前
在系统的学习 redis 前的疑惑
redis·go
吴声子夜歌2 天前
Redis 3.x——集群故障转移
java·数据库·redis·集群
明豆2 天前
Redis 分布式缓存生产实战
redis·分布式·缓存