Redis的数据淘汰策略——Java全栈知识(19)

Redis的数据淘汰策略

什么是数据淘汰策略

数据过期策略是 redis 中设置了 TTL 的数据过期的时候 Redis 的处理策略。数据淘汰策略是 Redis 内存不够的时候,

数据的淘汰策略:当 Redis 中的内存不够用时,此时在向 Redis 中添加新的 key, 那么 Redis 就会按照某一种规则将内存中的数据删除掉,这种数据的删除规测被称之为内存的淘汰策略。

redis 的内存删除策略有:

·noeviction: 不会淘汰任何键值对,而是直接返回错误信息。

·allkeys-lru: 从所有 key 中选择最近最少使用的那个 key 并删除。

·volatile-lru: 从设置了过期时间的 key 中选择最近最少使用的那个 key 并删除。

·allkeys-random: 从所有 key 中随机选择一个 key 并删除。

·volatile-random: 从设置了过期时间的 key 中随机选择一个 key 并删除。

·volatile-ttl: 从设置了过期时间的 key 中选择剩余时间最短的 key 并删除。

·volatile-lfu: 淘汰的对象是带有过期时间的键值对中,访问频率最低的那个。

·allkeys-lfu: 淘汰的对象则是所有键值对中,访问频该最低的那个。

大概可以分为几类分别是:LRU,LFU,random 等。

Random 没什么好说的随机就是了。接下来详细谈一下 LRU 和 LFU 算法。

LRU 算法

LRU 算法的思想是:如果一个数据在最近一段时间没有被访问到,那么可以认为在将来它被访问的可能性也很小。

因此,当空间满时,最久没有访问的数据最先被淘汰。

算法的流程是以一个链表实现:

  1. 当我们新插入缓存中的数据添加到链表的头部。
  2. 当我们使用的缓存也放到链表的头部。
  3. 当内存不足需要 Redis 内存淘汰的时候,淘汰链表尾部的缓存(最近访问最少的)即可。

LFU 算法

LFU (Least Frequently Used, 最近最不常用)

顾名思义,LFU 算法的思想是:如果一个数据在最近一段时间很少被访问到,那么可以认为在将来它被访问的可能性也很小。因此,当空间满时,最小频率访问的数据最先被淘汰。

LFU 的每个数据块都有一个引用计数,所有数据块按照引用计数排序,具有相同引用计数的数据块则按照时间排

序。

算法流程:

  1. 当我们新添加的缓存计数为 1 然后添加到队列尾部(按照计数排序)
  2. 每使用一次的数据计数+1
  3. 淘汰队列最后的元素。

推荐使用的方案

Redis 中默认使用的是:noeviction,也就是当内存满的时候不添加新的元素,不删除元素,新添加的元素报错。

当然这不是最优解,上述我们介绍了两种淘汰算法:

  • 当 Redis 作为缓存使用的时候,推荐使用 allkeys-lru 淘汰策略。该策略会将最近最少使用的 Key 淘汰。默认情况下,选择最近最少使用的那个 key 并删除。
  • 当 Redis 作为半缓存半持久化使用时,可以使用 volatile-ru。但因为 Redis 本身不建议保存持久化数据,所以只作为备选方案。
相关推荐
Daniel 大东36 分钟前
BugJson因为json格式问题OOM怎么办
java·安全
登云时刻37 分钟前
Kubernetes集群外连接redis集群和使用redis-shake工具迁移数据(二)
redis·容器·kubernetes
远歌已逝3 小时前
维护在线重做日志(二)
数据库·oracle
qq_433099404 小时前
Ubuntu20.04从零安装IsaacSim/IsaacLab
数据库
Dlwyz4 小时前
redis-击穿、穿透、雪崩
数据库·redis·缓存
Theodore_10225 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
工业甲酰苯胺6 小时前
Redis性能优化的18招
数据库·redis·性能优化
冰帝海岸6 小时前
01-spring security认证笔记
java·笔记·spring
世间万物皆对象6 小时前
Spring Boot核心概念:日志管理
java·spring boot·单元测试
没书读了7 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring