
将 Redis 用作缓存时, 如果内存空间用满, 就会自动驱逐老的数据。 默认情况下 memcached 就是这种方式, 大部分开发者都比较熟悉。 (推荐学习:Redis视频教程)
LRU是Redis唯一支持的回收算法. 本文详细介绍用于限制最大内存使用量的 maxmemory 指令, 并深入讲解 Redis 所使用的近似LRU算法。
maxmemory 配置指令
maxmemory 用于指定 Redis 能使用的最大内存。既可以在 redis.conf 文件中设置, 也可以在运行过程中通过 CONFIG SET 命令动态修改。
例如, 要设置 100MB 的内存限制, 可以在 redis.conf 文件中这样配置:
maxmemory 100mb
将 maxmemory 设置为 0, 则表示不进行内存限制。当然, 对32位系统来说有一个隐性的限制条件: 最多 3GB 内存。
当内存使用达到最大限制时, 如果需要存储新数据, 根据配置的策略(policies)的不同, Redis可能直接返回错误信息, 或者删除部分老的数据。
驱逐策略
达到最大内存限制时(maxmemory), Redis 根据 maxmemory-policy 配置的策略, 来决定具体的行为。
当前版本,Redis 3.0 支持的策略包括:
noeviction: 不删除策略, 达到最大内存限制时, 如果需要更多内存, 直接返回错误信息。 大多数写命令都会导致占用更多的内存(有极少数会例外, 如 DEL )。
allkeys-lru: 所有key通用; 优先删除最近最少使用(less recently used ,LRU) 的 key。
volatile-lru: 只限于设置了 expire 的部分; 优先删除最近最少使用(less recently used ,LRU) 的 key。
allkeys-random: 所有key通用; 随机删除一部分 key。
volatile-random: 只限于设置了 expire 的部分; 随机删除一部分 key。
volatile-ttl: 只限于设置了 expire 的部分; 优先删除剩余时间(time to live,TTL) 短的key。
如果没有设置 expire 的key, 不满足先决条件(prerequisites); 那么 volatile-lru, volatile-random 和 volatile-ttl 策略的行为, 和 noeviction(不删除) 基本上一致。
您需要根据系统的特征, 来选择合适的驱逐策略。 当然, 在运行过程中也可以通过命令动态设置驱逐策略, 并通过 INFO 命令监控缓存的 miss 和 hit, 来进行调优。
一般来说:
如果分为热数据与冷数据, 推荐使用 allkeys-lru 策略。 也就是, 其中一部分key经常被读写. 如果不确定具体的业务特征, 那么 allkeys-lru 是一个很好的选择。
如果需要循环读写所有的key, 或者各个key的访问频率差不多, 可以使用 allkeys-random 策略, 即读写所有元素的概率差不多。
假如要让 Redis 根据 TTL 来筛选需要删除的key, 请使用 volatile-ttl 策略。
volatile-lru 和 volatile-random 策略主要应用场景是: 既有缓存,又有持久key的实例中。 一般来说, 像这类场景, 应该使用两个单独的 Redis 实例。
值得一提的是, 设置 expire 会消耗额外的内存, 所以使用 allkeys-lru 策略, 可以更高效地利用内存, 因为这样就可以不再设置过期时间了。
驱逐的内部实现
Trae国内版
国内首款AI原生IDE,专为中国开发者打造
2045
查看详情
驱逐过程可以这样理解:
客户端执行一个命令, 导致 Redis 中的数据增加,占用更多内存。
Redis 检查内存使用量, 如果超出 maxmemory 限制, 根据策略清除部分 key。
继续执行下一条命令, 以此类推。
在这个过程中, 内存使用量会不断地达到 limit 值, 然后超过, 然后删除部分 key, 使用量又下降到 limit 值之下。
如果某个命令导致大量内存占用(比如通过新key保存一个很大的set), 在一段时间内, 可能内存的使用量会明显超过 maxmemory 限制。
近似LRU算法
Redis 使用的并不是完全LRU算法。自动驱逐的 key , 并不一定是最满足LRU特征的那个. 而是通过近似LRU算法, 抽取少量的 key 样本, 然后删除其中访问时间最古老的那个key。
驱逐算法, 从 Redis 3.0 开始得到了巨大的优化, 使用 pool(池子) 来作为候选. 这大大提升了算法效率, 也更接近于真实的LRU算法。
在 Redis 的 LRU 算法中, 可以通过设置样本(sample)的数量来调优算法精度。 通过以下指令配置:
maxmemory-samples 5
为什么不使用完全LRU实现? 原因是为了节省内存。但 Redis 的行为和LRU基本上是等价的. 下面是 Redis LRU 与完全LRU算法的一个行为对比图。
测试过程中, 依次从第一个 key 开始访问, 所以最前面的 key 才是最佳的驱逐对象。
从图中可以看到三种类型的点, 构成了三个不同的条带。
浅灰色部分表示被驱逐的对象。
灰色部分表示 “未被驱逐” 的对象。
绿色部分表示后面加入的对象。
在纯粹的LRU算法实现中, 前半部分旧的key被释放了。而 Redis 的 LRU 算法只是将时间较长的 key 较大概率地(probabilistically)释放了。
如你所见, Redis 3.0 中, 5样本的效果比 Redis 2.8 要好很多。 当然, Redis 2.8 也不错,最后访问的key基本上都还留在内存中. 在 Redis 3.0 中使用 10 样本时, 已经非常接近纯粹的LRU算法了。
注意,LRU只是用来预测将来可能会继续访问某个key的一个概率模型. 此外,如果数据访问的情况符合幂律分布(power law), 那么对于大部分的请求来说, LRU都会表现良好。
在模拟中, 我们发现, 如果使用幂律方式访问, 纯粹的LRU和Redis的结果差别非常, 甚至看不出来。
当然也可以将样本数量提高到10, 以额外消耗一些CPU为代价, 使得结果更接近于真实的LRU, 并通过 cache miss 统计信息来判断差异。
设置样本大小很容易, 使用命令 CONFIG SET maxmemory-samples
更多Redis相关技术文章,请访问Redis入门教程栏目进行学习!
以上就是redis在哪里配置缓存清理策略的详细内容,更多请关注其它相关文章!
# 是一个
# 汕尾网站建设制作费用
# 网站运营seo招聘广告
# 神湾网站优化排名
# 怎么调高网站关键词排名
# 推广网站 成为会员
# 邹城营销推广电话
# 认识网站建设与维护
# 兰州榆中县家装网站建设
# 北海热门seo渠道
# 太仓网站开发建设方案
# redis
# 的是
# 如何实现
# 网络带宽
# 错误信息
# 可以通过
# 只限于
# 过程中
# 国内
# 使用量
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
悟空浏览器网页版链接 悟空浏览器网页版最新有效地址
Win10关闭UAC用户账户控制的方法 Win10降低安全提示等级【技巧】
Lar*el怎么实现全文搜索_Lar*el Scout集成Algolia教程
口腔诊所管理软件推荐
cad加载的线型看不见怎么办_cad线型不可见问题解决方法
使用CSS :has() 选择器实现父元素样式控制:从子元素反向应用样式
@Team是什么?揭秘团队含义
如何使用CSS Grid实现“大方块左侧,小方块右侧垂直堆叠”的水平布局
Safari浏览器自动填表功能失效怎么办 Safari表单管理修复
word邮件合并怎么插入个性化图片_Word邮件合并插入个性化图片方法
优酷官网登录入口电脑版 优酷官网网址入口
抖音火山版如何进行提现
《雷电模拟器》自动点击设置方法
《长生:天机降世》火塔小怪大全
虫虫漫画排行榜单入口_虫虫漫画编辑推荐入口
WPS长文档分栏排版不乱方法_WPS分栏+分节符报纸排版教程
太平年在哪个平台播出
Sublime怎么快速复制文件路径_Sublime右键菜单增强技巧
C++二维数组动态分配方法_C++指针与数组内存布局
PHP中动态类名访问的类实例类型提示与静态分析实践
GBA模拟器手柄按键设置
《U校园》学生登录入口2025
Sublime怎么配置YAML文件格式化_Sublime YAML Formatter插件教程
抖音火山版注销账号抖音会注销吗 抖音火山版与抖音账号注销关系
猫眼app抢票快还是小程序快
动漫岛在线动漫网 动漫岛动漫在线观看官方入口
知音漫客官网首页入口_知音漫客热门漫画推荐
iPhone 14 Pro如何更改区域设置_iPhone 14 Pro地区语言修改教程
139邮箱登录入口官网 139邮箱登录入口官网网址
word怎么将图片设置为页面背景并不影响打印_Word图片背景设置方法
C++怎么解决数值计算中的精度问题_C++浮点数误差与数值稳定性分析
Win10如何关闭开机锁屏界面_Windows10跳过锁屏直接登录设置
sublime怎么快速在浏览器中预览HTML_sublime配置View in Browser教程
Linux如何自动分析系统异常日志_Linux日志智能检测
J*aScript:从子元素中批量移除特定CSS类
掌握产品代码正则表达式:避免常见陷阱与精确匹配
如何在CSS中使用过渡制作按钮边框渐变_border-color transition实现
解决VS Code中Python版本冲突与输出异常的指南
为什么XML解析器对大小写敏感? 理解XML规范中的大小写规则与最佳实践
汽水音乐官方网站登录入口_汽水音乐网页版进入链接
Win11怎么开启HDR_Windows 11显示器画质增强设置
J*aScript包管理器_Npm与Yarn对比
XPath动态元素定位:如何精准选择文本内容变化的元素
《饿了么》拼好饭点外卖教程2025
漫蛙app官方版手机正版入口-漫蛙漫画manwa在线漫画正版入口
实时数据流中高效查找最小值与最大值
抄漫画官网防走失地址_抄漫画最新漫画完整版阅读入口
RxJS中如何高效地在一个函数内处理和合并多个数据集合
顺丰快递单号查询寄件人 顺丰寄件人查询入口
抖音号升级企业号怎么改名字?升级企业号有哪些好处?
2019-11-30
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。