redis 从0到1完整学习 (十七):内存回收之内存淘汰策略

文章目录

  • 1. 引言
  • 2. redis 源码下载
  • 3. 内存回收策略
  • 4. 如何设置内存淘汰策略
    • 4.1 在 Redis 配置文件设置(推荐重启后生效)
    • 4.2 运行时动态调整
  • 5. 参考


1. 引言

前情提要:
《redis 从0到1完整学习 (一):安装&初识 redis》
《redis 从0到1完整学习 (二):redis 常用命令》
《redis 从0到1完整学习 (三):redis 数据结构》
《redis 从0到1完整学习 (四):字符串 SDS 数据结构》
《redis 从0到1完整学习 (五):集合 IntSet 数据结构》
《redis 从0到1完整学习 (六):Hash 表数据结构》
《redis 从0到1完整学习 (七):ZipList 数据结构》
《redis 从0到1完整学习 (八):QuickList 数据结构》
《redis 从0到1完整学习 (九):SkipList 数据结构》
《redis 从0到1完整学习 (十):RedisObject 数据结构》
《redis 从0到1完整学习 (十一):RedisObject 之 String 类型》
《redis 从0到1完整学习 (十二):RedisObject 之 List 类型》
《redis 从0到1完整学习 (十三):RedisObject 之 Set 类型》
《redis 从0到1完整学习 (十四):RedisObject 之 ZSet 类型》
《redis 从0到1完整学习 (十五):RedisObject 之 Hash 类型》
《redis 从0到1完整学习 (十六):内存回收之 key 过期处理策略》

之前我们介绍了 redis 的内存回收的 key 过期的处理策略,本文接着主要介绍 redis 内存淘汰策略以及内存淘汰策略的配置方法。

2. redis 源码下载

Redis 源码可以点击这里下载,方便查看其中定义的一些数据结构。
在这里插入图片描述

3. 内存回收策略

Redis 内存淘汰策略:当 Redis 服务器的内存使用达到预设的最大限制时,为了防止内存溢出,Redis 会按照配置的淘汰策略来决定如何删除部分数据以回收内存。以下是一些主要的内存淘汰策略:

  1. noeviction

    • 默认策略。不进行任何内存淘汰,当内存不足以容纳新写入的数据时,所有会导致内存增加的操作(如SETLPUSH等)都会返回错误。
  2. volatile-lru

    • 仅对设置了过期时间(TTL)的键进行淘汰,采用 LRU(Least Recently Used,最近最少使用)算法,即优先移除最近最少访问且已过期的键。
  3. allkeys-lru

    • 对所有键(包括未设置过期时间的键)应用 LRU 算法,选择整个数据库中最久未使用的键进行淘汰。
  4. volatile-lfu

    • 同样只针对设置了过期时间的键,但采用 LFU(Least Frequently Used,最不经常使用)算法,根据键的历史访问频率来淘汰访问次数最少的键。
  5. allkeys-lfu

    • 对于所有键(无论是否设置过期时间)都使用 LFU 算法,淘汰整体上访问频率最低的键。
  6. volatile-random

    • 随机淘汰一个已设置过期时间的键。
  7. allkeys-random

    • 随机淘汰任意一个键,不论其是否设置了过期时间。从 db->dict (db的数据结构参考上一节)中随机挑选
  8. volatile-ttl

    • 根据键的剩余生存时间(TTL)来淘汰,优先淘汰即将过期的键,即 TT L越小,越先淘汰。

4. 如何设置内存淘汰策略

在实际应用中,应根据业务场景需求来选择合适的淘汰策略。Redis 4.0 及以后版本还引入了更精细化的内存管理功能,例如可配置的 LFU 和 LRU 淘汰阈值以及混合淘汰策略。同时,Redis提供了配置选项允许用户自定义内存最大使用量,并可以配合配置文件或运行时动态调整内存淘汰策略。

Redis 设置内存淘汰策略可以在配置文件中进行,或者在运行时动态调整。以下是两种方法的详细步骤:

4.1 在 Redis 配置文件设置(推荐重启后生效)

打开 Redis 的配置文件 redis.conf,找到与内存淘汰策略相关的配置项 maxmemory-policymaxmemory,并根据需要进行修改。

例如,要设置为 LRU 淘汰策略(当所有键都参与淘汰时),可以添加或修改以下行:

maxmemory <your_memory_limit_in_bytes>
maxmemory-policy allkeys-lru

这里的 <your_memory_limit_in_bytes> 应替换为你的 Redis 实例希望使用的最大内存大小,单位是字节。

4.2 运行时动态调整

对于已经运行中的 Redis 实例,可以通过执行命令来动态调整内存淘汰策略:

config set maxmemory <your_memory_limit_in_bytes>
config set maxmemory-policy <policy_name>

其中 <your_memory_limit_in_bytes> 是新的内存限制值,而 <policy_name> 可以是以下之一:

  • noeviction
  • volatile-lru
  • allkeys-lru
  • volatile-lfu
  • allkeys-lfu
  • volatile-random
  • allkeys-random
  • volatile-ttl
  • noeviction (自 Redis 6.0 开始还支持lfu、volatile-lfu)

例如,若要在运行时将淘汰策略改为 LRU 并设置内存限制为 1GB,则执行:

redis-cli config set maxmemory 1073741824
redis-cli config set maxmemory-policy allkeys-lru

请注意,动态调整内存限制和策略可能会导致立即开始淘汰数据,因此请谨慎操作并在理解业务场景后再做决定。同时,如果已达到内存上限,在不增加可用内存的情况下更改策略可能无法立即缓解内存压力。

5. 参考

《redis 从0到1完整学习 (一):安装&初识 redis》
《redis 从0到1完整学习 (二):redis 常用命令》
《redis 从0到1完整学习 (三):redis 数据结构》
《redis 从0到1完整学习 (四):字符串 SDS 数据结构》
《redis 从0到1完整学习 (五):集合 IntSet 数据结构》
《redis 从0到1完整学习 (六):Hash 表数据结构》
《redis 从0到1完整学习 (七):ZipList 数据结构》
《redis 从0到1完整学习 (八):QuickList 数据结构》
《redis 从0到1完整学习 (九):SkipList 数据结构》
《redis 从0到1完整学习 (十):RedisObject 数据结构》
《redis 从0到1完整学习 (十一):RedisObject 之 String 类型》
《redis 从0到1完整学习 (十二):RedisObject 之 List 类型》
《redis 从0到1完整学习 (十三):RedisObject 之 Set 类型》
《redis 从0到1完整学习 (十四):RedisObject 之 ZSet 类型》
《redis 从0到1完整学习 (十五):RedisObject 之 Hash 类型》
《redis 从0到1完整学习 (十六):内存回收之 key 过期处理策略》

欢迎关注本人,我是喜欢搞事的程序猿; 一起进步,一起学习;

也欢迎关注我的wx公众号:一个比特定乾坤

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/342690.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【java八股文】之MYSQL基础篇

1、数据库三大范式是什么 第一范式&#xff1a;每个列都不可以再拆分。 第二范式&#xff1a;在第一范式的基础上&#xff0c;非主键列完全依赖于主键&#xff0c;而不能是依赖于主键的一部分。 第三范式&#xff1a;在第二范式的基础上&#xff0c;非主键列只依赖于主键&#…

2024 IAA增长变现玩法拆解,NetMarvel提出进阶版攻略!

2023年的国内外市场&#xff0c;很多大甲方都表示消极&#xff0c;字节游戏业务高歌猛进后大撤退更是直接震惊了整个行业&#xff0c;更别说第二第三梯队的服务商了。 动荡和低迷的经济局势还没有消散&#xff0c;这给开发者带来接连不断的挑战。 01 市场反馈是正向的&#x…

VS Code 配置 Vue3 模板 详细步骤

1、打开 VS Code &#xff0c;在页面左下角找到这个设置图标&#xff0c;然后找到 “用户代码片段” 2、接着点击 “新建全局代码片段文件” 3、在输入框中输入你要设置的模板名&#xff0c;然后回车确认 4、接下来配置自己想要模板代码&#xff0c;或者也可以借鉴我写的这个&…

JavaScript(第二篇)浮点数运算精度问题,一网打尽所有相关面试题

前言 本篇文章是《面试题一网打尽》专栏的 javascript 第二篇文章&#xff0c;彻底解决浮点数运算精度相关的面试题目。欢迎大家关注我的这个专栏。 一、IEEE 754 标准 我们经常在文档中看到这个标准感觉是什么高深的东西&#xff0c;其实 IEEE 是一个组织类似公司名称&…

Sublime Text 3配置 Python 开发环境

Sublime Text 3配置 Python 开发环境 一、引言二、主要内容1. 初识 Sublime Text 32. 初识 Python2. 接入 Python2.1 下载2.2 安装和使用 python2.2 环境变量配置 3. 配置 Python 开发环境4. 编写 Python 代码5. 运行 Python 代码 三、总结 一、引言 Python 是一种简洁但功能强…

记录一次数据中包含转义字符\引发的bug

后端返回给前端的数据是: { "bizObj": { "current": 1, "orders": [ ], "pages": 2, "records": [ { "from": "1d85b8a4bd33aaf99adc2e71ef02960e", …

LInux初学之路linux的磁盘分区/远程控制/以及关闭图形界面/查看个人身份

虚拟机磁盘分配 hostname -I 查看ip地址 ssh root虚拟就ip 远程连接 win10之后才有 远程控制重新启动 reboot xshell 使用&#xff08;个人和家庭版 免费去官方下载&#xff09; init 3 关闭界面 减小内存使用空间 init 5 回复图形界面 runlevel显示的是状态 此时和上…

抄代码对提升编程能力有用吗?

我毕业12年&#xff0c;做开发10年&#xff0c;一直用c语言在写程序&#xff0c;编程水平从菜&#xff0c;到能应付各种项目&#xff0c;我可以肯定告诉你&#xff0c;抄代码很有用&#xff0c;新手也只能先从抄开始。 刚开始&#xff0c;啥也不懂&#xff0c;就跟着教程&#…

简单明了,汽车级LM317系列LM317D2TR4G线性电压稳压器电源设计-参数应用方案分享

低压差线性稳压器&#xff08;LDO&#xff09;&#xff0c;是指一种具有恒定电流输出电压的装置&#xff0c;主要由输入变压器、整流器、输出变压器三部分构成&#xff0c;工业原理为将输入的交流电压经过整流、滤波后得到直流输出电压&#xff0c;再经过控制元件和开关器件将稳…

Kali Linux —— 漏洞分析工具

Cisco-torch与Global Exploiter专攻Cisco漏洞 一、Cisco 工具 Kali 有许多工具&#xff0c;比如信息收集工具、密码爆破工具等等&#xff0c;还有一些可用于攻击 Cisco 路由器的工具。Cisco-torch就是这样&#xff0c;用于大规模扫描、指纹识别和利用的工具之一。 打开终端控…

查询速度提升15倍!银联商务基于 Apache Doris 的数据平台升级实践

本文导读&#xff1a; 在长期服务广大规模商户的过程中&#xff0c;银联商务已沉淀了庞大、真实、优质的数据资产数据&#xff0c;这些数据不仅是银联商务开启新增长曲线的基础&#xff0c;更是进一步服务好商户的关键支撑。为更好提供数据服务&#xff0c;银联商务实现了从 H…

互信息法的原理详解

文章目录 互信息法&#xff08;上&#xff09;互信息是什么从信息增益角度理解互信息从变量分布一致角度理解互信息 卡方检验与离散变量的互信息法 互信息法&#xff08;上&#xff09; 尽管f_regression巧妙的构建了一个F统计量&#xff0c;并借此成功的借助假设检验来判断变…