高并发架构系列:Redis的内存回收原理,及内存过期淘汰策略详解
Redis内存回收机制
Redis的内存回收主要围绕以下两个方面:
1.Redis过期策略
删除过期时间的key值
**2.Redis淘汰策略
**内存使用到达maxmemory上限时触发内存淘汰数据
Redis的过期策略和内存淘汰策略不是一件事,实际研发中不要弄混淆了,下面会完整的介绍两者。
Redis过期策略
过期策略通常有以下三种:
1.定时过期
每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。
2.惰性过期
只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。
3.定期过期
每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。
Redis中同时使用了惰性过期和定期过期两种过期策略。
Redis淘汰策略
1.简介
Redis的内存淘汰策略,是指当内存使用达到maxmemory极限时,需要使用LAU淘汰算法来决定清理掉哪些数据,以保证新数据的存入。
**2、LRU算法
**
Redis默认情况下就是使用LRU策略算法。
LRU算法(least RecentlyUsed),最近最少使用算法,也就是说默认删除最近最少使用的键。
但是一定要注意一点!redis中并不会准确的删除所有键中最近最少使用的键,而是随机抽取3个键,删除这三个键中最近最少使用的键。
那么3这个数字也是可以可以设置采样的大小,如果设置为10,那么效果会更好,不过也会耗费更多的CPU资源。对应位置是配置文件中的maxmeory-samples。
3.缓存清理配置
maxmemory用来设置redis存放数据的最大的内存大小,一旦超出这个内存大小之后,就会立即使用LRU算法清理掉部分数据。
对于64 bit的机器,如果maxmemory设置为0,那么就默认不限制内存的使用,直到耗尽机器中所有的内存为止;,但是对于32 bit的机器,有一个隐式的闲置就是3GB
4.Redis数据淘汰策略
maxmemory-policy,可以设置内存达到最大闲置后,采取什么策略来处理。
对应的淘汰策略规则如下:
1)noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。
2)allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。
3)allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。
4)volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。
5)volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。
6)volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。
5.缓存清理的流程
1)客户端执行数据写入操作
2)redis server接收到写入操作之后,检查maxmemory的限制,如果超过了限制,那么就根据对应的policy清理掉部分数据
3)写入操作完成执行。
总结
redis的内存淘汰策略用于处理内存不足时的需要申请额外空间的数据,内存淘汰策略的选取并不会影响过期的key的处理。过期策略用于处理过期的缓存数据。
以上就是redis内存回收机制的详解,更多Kafka消息队列、Dubbo、分库分表等高并发架构设计,具体请参考高并发架构66期专题,想要领取66期专题资料,关注 mikechen优知 ,回复【高并发】。
觉得内容不错请点赞支持,更多BAT技术架构+面试真经等干货,查看我的往期博文。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
移动开发架构师进阶路线,与德雷福斯模型的初次触碰
我总结了一下,Android移动开发,大抵分如下 12 个阶段: 看书,看视频,看博客,听课等等 对着书敲代码 脱离书自己敲代码 自己实现一些小DEMO 进项目看代码 在别人指点下写代码 自己独立在别人搭建好的框架内填写代码 自己独立负责别人设计好的模块的实现 自己独立负责一个软件模块的设计和实现 负责较大的软件模块,拆分模块,分子任务给他人 负责一个小项目,设计,拆分,分派任务 做较大的软件系统的架构设计(架构师),或专注特定领域,解决疑难杂症 你在哪个阶段呢?欢迎留言讨论。 实际上,有一个知名的德雷福斯模型,描述了专业技能的成长阶段; 德雷福斯模型将技术人才的成长分为五个阶段,相应匹配Android开发的简要介绍下。 阶段一:新手(Android初学者)< 10% 新手在该领域很少或根本没有经验 新手非常在乎他们能否成功。没有太多经验指导他们,不知道自己的行为是对是错 如果给新手提供与情景无关的规则去参照,他们就会变得能干起来 阶段二:高级新手(Android初级开发)55~60% 他们可以独自尝试任务,但仍难以解决问题 他们想要快速获取信息。他们不想在此刻寻根究...
- 下一篇
阿里毕玄:阿里十年,从分布式到云时代的架构演进之路
编者按:这是一篇来自鲲鹏会的文章,其内容是毕玄在TGO 鲲鹏会杭州分会活动现场分享的《云时代的软件架构》的整理。特别转载到云栖社区,让更多开发者深入了解阿里架构的变迁和对云技术的一些新的想法。 2018 年 12 月 15 日,TGO 鲲鹏会杭州分会拉开了 TGO 特有的技术人年会「E 家宴」的帷幕,60+CTO/ 技术 VP 相聚在杭州殊胜龙井酒店。其中,阿里巴巴系统软件、中间件、研发效能负责人毕玄,连尚网络副总裁 &WiFi 万能钥匙万能接入业务群 CEO、TGO 鲲鹏会上海会员万玉权, 同盾科技联合创始人 & 技术 VP、TGO 鲲鹏会杭州会长张新波,及 TGO 鲲鹏会杭州会员、大搜车技术 VP 沈淦、尚尚签 CTO 陶真,和浪潮集团 AI 首席架构师 张清等重磅嘉宾应邀出席,与参会者一起探讨云时代的软件架构、
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作