深入理解Redis的淘汰策略

devtools/2024/9/23 14:35:26/

内存淘汰是什么?

Redis作为一款非关系型数据库,数据是存储到内存中的,和传统常规数据库相比,这给予可很高的并发访问量,但是相应的,存储空间就不如那些存储在磁盘中的数据库了。
而内存淘汰就是为了应对Redis内存存储空间无法再放置新数据时,所设置的一种机制,即把老数据进行删除淘汰,来保证新数据的顺哪里插入。

内存淘汰的意义?

内存淘汰将Redis的存储空间由固态的变为了动态的,即数据对应的存储空间并非一成不变的。而是”流动“的,可以存储比字面规定的存储大小更灵活的空间大小。

Redis中的内存淘汰策略

8种内存淘汰策略:

当 Redis 达到最大内存限制时,Redis会确切地使用配置好的最大内存策略指令来执行。相关策略如下:

  1. noeviction(默认策略): 不会删除任何数据,拒绝所有写入操作并返回客户端错误消息(error)OOM command not allowed when used memory,此时 Redis 只响应删和读操作;

  2. allkeys-lru: 从所有 key 中使用 LRU 算法进行淘汰(LRU 算法:最近最少使用算法);

  3. allkeys-lfu: 从所有 key 中使用 LFU 算法进行淘汰(LFU 算法:最不常用算法,根据使用频率计算,4.0 版本新增);

  4. volatile-lru: 从设置了过期时间的 key 中使用 LRU 算法进行淘汰;

  5. volatile-lfu: 从设置了过期时间的 key 中使用 LFU 算法进行淘汰;

  6. allkeys-random: 从所有 key 中随机淘汰数据;

  7. volatile-random: 从设置了过期时间的 key 中随机淘汰数据;

  8. volatile-ttl: 在设置了过期时间的key中,淘汰过期时间剩余最短的。

注意: 当使用 volatile-lru、volatile-lfu、volatile-random、volatile-ttl 这四种淘汰策略时,如果没有 key 可以淘汰,则和 neoviction 一样返回错误。

内存淘汰策略的选用

这几种淘汰策略各有优缺点,且Redis支持手动配置淘汰策略。

所以在实际应用场景中,我们要根据具体的业务情况以及性能开销等情况去选用合适的淘汰策略。

  • 业务需求为主: 在自定义淘汰策略时,始终以业务需求为主导。深入了解数据的访问模式、重要性以及访问频率,有助于制定更合理的策略。

  • 评估性能开销: 自定义淘汰策略可能会引入一定的计算开销。在设计策略时,需要评估性能开销,确保不会影响整体系统性能。

  • 定期优化策略: 随着业务的演变,自定义淘汰策略可能需要进行优化和调整。定期审查和优化策略,保证其与业务需求保持一致。

  • 数据冷热分离: 一些业务场景中,数据的热度是变化的。可以考虑将热数据和冷数据分开存储,采用不同的淘汰策略,从而更好地平衡性能和存储消耗。

通过自定义淘汰策略,你可以更好地满足复杂业务需求,优化数据管理,并在实际项目中获得更好的性能和效果。

淘汰策略选用示例:

  • allkeys-lru:如果我们的应用对缓存的访问符合幂律分布,也就是存在相对热点数据,或者我们不太清楚我们应用的缓存访问分布状况,我们可以选择allkeys-lru策略。

  • allkeys-random:如果我们的应用对于缓存key的访问概率相等,则可以使用这个策略。

  • volatile-ttl:这种策略使得我们可以向Redis提示哪些key更适合被eviction。

Redis 4.0 版本开始增加了 LFU 缓存淘汰策略,也采用数据随机筛选规则,然后依据数据的热度值排序,淘汰掉热度值较低的数据。

另外,值得一提的是将key设置过期时间实际上会消耗更多的内存,因此建议使用allkeys-lru策略从而更有效率的使用内存。


http://www.ppmy.cn/devtools/24184.html

相关文章

[Java EE] 多线程(五):单例模式与阻塞队列

1. 单例模式 单例模式是校招中最长考的设计模式之一,首先我们来谈一谈什么是设计模式: 设计模式就好像象棋中的棋谱一样,如果红方走了什么样的局势,黑方就有一定地固定地套路,来应对这样的局势,按照固定地套路来,可以保证在该局势下不会吃亏. 软件开发也是同样的道理,有很多…

运营如何实现月入过万?这3个思路一定要有!

要想在竞争激烈的流量市场中脱颖而出并取得成功,并非易事。 今天将分享3个运营的关键思路,帮助大家实现月入过万的运营目标。 第一个:搭建素材库 搭建专属素材库是提升运营效率的重要一步。运营者需要收集、整理和管理与目标受众相关的素材…

Cesium学习——渲染、加载GeoJSON、调整位置

渲染概述 作者:当时明月在曾照彩云归 出处:https://www.cnblogs.com/jiujiubashiyi/p/17124717.html 1. 引言 Cesium是一款三维地球和地图可视化开源JavaScript库,使用WebGL来进行硬件加速图形,使用时不需要任何插件支持&#xf…

各类数据引擎指定schema或者数据库

背景 以hive为例,如果某个hive引擎,有my_test、test_dd、test_xx、aqtest0228数据库某张表的数据,如果需要查询某个库的数据,需要带库名,否则会报错。 sql语句如下 SELECT * FROM aqtest0228.t_bz_zl_ss_zyxx_wrw…

客户端连接ZK失败处理方案

文章目录 背景介绍报错信息处理方案第一步、查看zookeeper启动是否正常第二步、检查本地网络是否正常第三步、检查本地JDK版本 对于zookeeper服务注册中心,在前期【 Dubbo框架注册中心-Zookeeper搭建】博客中有环境搭建部署介绍,感兴趣可以参考安装。 背…

【Unity动画系统】详解Root Motion动画在Unity中的应用(二)

Root Motion遇到Blend Tree 如果Root Motion动画片段的速度是1.8,那么阈值就要设置为1.8,那么在代码中的参数就可以直接反映出Root Motion的最终移动速度。 Compute Thresholds:根据Root Motion中某些数值自动计算这里的阈值。 Velocity X/…

mysql面试题九(SQL优化)

目录 1.一条 SQL 是如何执行的 2.索引失效的几种情况 3.EXPLAIN 4.Where 子句如何优化 5.超大分页或深度分页如何处理 6.大表查询如何优化 7.分库分表 基本概念 分库分表方法 水平拆分 垂直拆分 分库分表后的注意事项 1.一条 SQL 是如何执行的 在MySQL中&#xff0…

【Spring Data JPA】实体对象生命周期相关注解

文章目录 PrePersist 注解PreUpdate 注解PreRemove 注解PostLoad 注解PostPersist 注解PostRemove 注解使用案例启动类Entity 对象生命周期(Listener) PrePersist 注解 PrePersist 注解用于指定在将实体对象持久化到数据库之前执行的方法。通常用于设置…