论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com技术社区
»
论坛
›
数据库
›
图数据库
›
面试官:Redis 数据库内存数据满了,会宕机吗?有内存接 ...
面试官:Redis 数据库内存数据满了,会宕机吗?有内存接纳? ...
一给
论坛元老
|
2025-2-14 18:42:54
|
显示全部楼层
|
阅读模式
楼主
主题
1842
|
帖子
1842
|
积分
5526
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
Redis 数据库内存数据满了,会宕机吗?答案是:不会让他出现存满的情况,在利用Redis的时候我们要设置Redis能利用的最大的内存大小,存到一定容量的时候还有Redis的内存镌汰策略呢,还有LRU算法进行镌汰,等等。。。接下来就跟着作者一起探讨,Redis的内存镌汰策略。
Redis占用内存大小
我们知道Redis是基于内存的key-value数据库,由于系统的内存大小有限,所以我们在利用Redis的时候可以设置Redis能利用的最大的内存大小。
1、通过设置文件设置
通过在Redis安装目录下面的redis.conf设置文件中添加以下设置设置内存大小
//设置Redis最大占用内存大小为100M`
maxmemory 100mb`
复制代码
redis的设置文件不一定利用的是安装目录下面的redis.conf文件,启动redis服务的时候是可以传一个参数指定redis的设置文件的
2、通过命令修改
Redis支持运行时通过命令动态修改内存大小
//设置Redis最大占用内存大小为100M`
127.0.0.1:6379> config set maxmemory 100mb`
//获取设置的Redis能使用的最大内存大小`
127.0.0.1:6379> config get maxmemory`
复制代码
假如不设置最大内存大小或者设置最大内存大小为0,在64位操作系统下不限制内存大小,在32位操作系统下最多利用3GB内存
Redis的内存镌汰
既然可以设置Redis最大占用内存大小,那么设置的内存就有效完的时候。那在内存用完的时候,还继承往Redis里面添加数据不就没内存可用了吗?
实际上Redis界说了几种策略用来处理这种情况:
noeviction(默认策略)
:对于写请求不再提供服务,直接返回错误(DEL请求和部分特别请求除外)
allkeys-lru
:从全部key中利用LRU算法进行镌汰
volatile-lru
:从设置了逾期时间的key中利用LRU算法进行镌汰
allkeys-random
:从全部key中随机镌汰数据
volatile-random
:从设置了逾期时间的key中随机镌汰
volatile-ttl
:在设置了逾期时间的key中,根据key的逾期时间进行镌汰,越早逾期的越优先被镌汰
当利用
volatile-lru
、
volatile-random
、
volatile-ttl
这三种策略时,假如没有key可以被镌汰,则和
noeviction
一样返回错误
怎样获取及设置内存镌汰策略
获取当前内存镌汰策略:
127.0.0.1:6379> config get maxmemory-policy
复制代码
复制代码
通过设置文件设置镌汰策略(修改redis.conf文件):
maxmemory-policy allkeys-lru
复制代码
复制代码
通过命令修改镌汰策略:
127.0.0.1:6379> config set maxmemory-policy allkeys-lru`
复制代码
LRU算法
什么是LRU?
上面说到了Redis可利用最大内存利用完了,是可以利用LRU算法进行内存镌汰的,那么什么是LRU算法呢?
LRU(Least Recently Used)
,即近来最少利用,是一种缓存置换算法。在利用内存作为缓存的时候,缓存的大小一样平常是固定的。当缓存被占满,这个时候继承往缓存里面添加数据,就须要镌汰一部分老的数据,释放内存空间用来存储新的数据。这个时候就可以利用LRU算法了。其核心头脑是:假如一个数据在近来一段时间没有被用到,那么将来被利用到的可能性也很小,所以就可以被镌汰掉。
LRU在Redis中的实现
近似LRU算法
Redis利用的是近似LRU算法,它跟常规的LRU算法还不太一样。近似LRU算法通过随机采样法镌汰数据,每次随机出5(默认)个key,从里面镌汰掉近来最少利用的key。
可以通过maxmemory-samples参数修改采样数量:例:maxmemory-samples 10 maxmenory-samples设置的越大,镌汰的结果越接近于严格的LRU算法
Redis为了实现近似LRU算法,给每个key增长了一个额外增长了一个24bit的字段,用来存储该key最后一次被访问的时间。
Redis3.0对近似LRU的优化
Redis3.0对近似LRU算法进行了一些优化。新算法会维护一个候选池(大小为16),池中的数据根据访问时间进行排序,第一次随机选取的key都会放入池中,随后每次随机选取的key只有在访问时间小于池中最小的时间才会放入池中,直到候选池被放满。当放满后,假如有新的key须要放入,则将池中最后访问时间最大(近来被访问)的移除。
当须要镌汰的时候,则直接从池中选取近来访问时间最小(最久没被访问)的key镌汰掉就行。
LRU算法的对比
我们可以通过一个实行对比各LRU算法的正确率,先往Redis里面添加一定数量标数据n,使Redis可用内存用完,再往Redis里面添加n/2的新数据,这个时候就须要镌汰掉一部分的数据,假如按照严格的LRU算法,应该镌汰掉的是开始加入的n/2的数据。天生如下各LRU算法的对比图
你可以看到图中有三种差异颜色的点:
浅灰色是被镌汰的数据
灰色是没有被镌汰掉的老数据
绿色是新加入的数据
我们能看到Redis3.0采样数是10天生的图最接近于严格的LRU。而同样利用5个采样数,Redis3.0也要优于Redis2.8。
LFU算法
LFU算法是Redis4.0里面新加的一种镌汰策略。它的全称是
Least Frequently Used
,它的核心头脑是根据key的近来被访问的频率进行镌汰,很少被访问的优先被镌汰,被访问的多的则被留下来。
LFU算法能更好的表示一个key被访问的热度。假如你利用的是LRU算法,一个key好久没有被访问到,只刚刚是偶尔被访问了一次,那么它就被以为是热门数据,不会被镌汰,而有些key将来是很有可能被访问到的则被镌汰了。假如利用LFU算法则不会出现这种情况,由于利用一次并不会使一个key成为热门数据。
LFU一共有两种策略:
volatile-lfu:在设置了逾期时间的key中利用LFU算法镌汰key
allkeys-lfu:在全部的key中利用LFU算法镌汰数据
设置利用这两种镌汰策略跟前面讲的一样,不过要留意的一点是这两周策略只能在Redis4.0及以上设置,假如在Redis4.0以下设置会报错
问题
最后留一个小问题,可能有的人留意到了,我在文中并没有解释为什么Redis利用近似LRU算法而不利用正确的LRU算法,可以在评论区给出你的答案,各人一起讨论学习。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
一给
论坛元老
这个人很懒什么都没写!
楼主热帖
手把手教你如何使用kali破解wifi密码( ...
3.2操作系统(基本分页存储管理的基本 ...
C++面试八股文:std::array如何实现编 ...
嵌入式 Linux 内核驱动开发【The first ...
零基础入门 Java 后端开发,有哪些值得 ...
你真的了解二叉树吗?(上篇) ...
Wireshark学习笔记(一)常用功能案例 ...
Kubernetes(K8S) Deployment 升级和回 ...
当“超融合”邂逅“奥 ...
上古神兵,先天至宝,Win11平台安装和配 ...
标签云
AI
运维
CIO
存储
服务器
浏览过的版块
物联网
开源技术
运维.售后
虚拟化与私有云
数据安全
备份
Postrge-SQL技术社区
MES
云原生
快速回复
返回顶部
返回列表