本篇文章给大家带来了关于redis的相关知识,其中主要介绍了redis的内存满了应该怎么优化的相关问题,还包括了淘汰机制、lru算法以及处理淘汰的数据,希望对大家有帮助。

推荐学习:Redis学习教程
redis内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。
内存。
如果达到设置的上限,Redis的写命令会返回错误信息(但是读命令还可以正常返回。)或者你可以配置内存淘汰机制,当Redis达到内存上限时会冲刷掉旧的内容。
Redis 缓存有哪些淘汰策略?
会进行淘汰的 7 种策略,我们可以再进一步根据淘汰候选数据集的范围把它们分成两类:
| 策略 | 规则 |
|---|---|
| volatile-ttl | 在筛选时,会针对设置了过期时间的键值对,根据过期时间的先后进行删除,越早过期的越先被删除。 |
| volatile-random | 在设置了过期时间的键值对中,进行随机删除。 |
| volatile-lru | 使用 LRU 算法筛选设置了过期时间的键值对 |
| volatile-lfu | 使用 LFU 算法选择设置了过期时间的键值对 |
| 策略 | 规则 |
|---|---|
| allkeys-random | 从所有键值对中随机选择并删除数据; |
| allkeys-lru | 使用 LRU 算法在所有数据中进行筛选 |
| vallkeys-lfu | 使用 LFU 算法在所有数据中进行筛选 |
是按照最近最少使用的原则来筛选数据,最不常用的数据会被筛选出来,而最近频繁使用的数据会留在缓存中。
那具体是怎么筛选的呢?LRU 会把所有的数据组织成一个链表,链表的头和尾分别表示 MRU 端和 LRU 端,分别代表最近最常使用的数据和最近最不常用的数据。
LRU 算法背后的想法非常朴素:它认为刚刚被访问的数据,肯定还会被再次访问,所以就把它放在 MRU 端;长久不访问的数据,肯定就不会再被访问了,所以就让它逐渐后移到 LRU 端,在缓存满时,就优先删除它。
问题:LRU 算法在实际实现时,需要用链表管理所有的缓存数据,这会带来额外的空间开销。而且,当有数据被访问时,需要在链表上把该数据移动到 MRU 端,如果有大量数据被访问,就会带来很多链表移动操作,会很耗时,进而会降低 Redis 缓存性能。
解决:
在 Redis 中,LRU 算法被做了简化,以减轻数据淘汰对缓存性能的影响。具体来说,Redis 默认会记录每个数据的最近一次访问的时间戳(由键值对数据结构 RedisObject 中的 lru 字段记录)。然后,Redis 在决定淘汰的数据时,第一次会随机选出 N 个数据,把它们作为一个候选集合。接下来,Redis 会比较这 N 个数据的 lru 字段,把 lru 字段值最小的数据从缓存中淘汰出去。
当需要再次淘汰数据时,Redis 需要挑选数据进入第一次淘汰时创建的候选集合。这儿的挑选标准是:能进入候选集合的数据的 lru 字段值必须小于候选集合中最小的 lru 值。当有新数据进入候选数据集后,如果候选数据集中的数据个数达到了 maxmemory-samples,Redis 就把候选数据集中 lru 字段值最小的数据淘汰出去。
使用建议:
一旦被淘汰的数据选定后,如果这个数据是干净数据,那么我们就直接删除;如果这个数据是脏数据,我们需要把它写回数据库。
那怎么判断一个数据到底是干净的还是脏的呢?
即使淘汰的数据是脏数据,Redis 也不会把它们写回数据库。所以,我们在使用 Redis 缓存时,如果数据被修改了,需要在数据修改时就将它写回数据库。否则,这个脏数据被淘汰时,会被 Redis 删除,而数据库里也没有最新的数据了。
一览妙笔
自媒体、编剧、营销人员写作工具
50
查看详情
1、控制key的数量:当使用Redis存储大量数据时,通常会存在大量键,过多的键同样会消耗大量内存。Redis本质是一个数据结构服务器,它为我们提供多种数据结构,如hash,list,set,zset 等结构。使用Redis时不要进入一个误区,大量使用get/set这样的API,把Redis当成Memcached使用。对于存储相同的数据内容利用Redis的数据结构降低外层键的数量,也可以节省大量内存。
2、缩减键值对象,降低Redis内存使用最直接的方式就是缩减键(key)和值(value)的长度。
3、编码优化。Redis对外提供了string,list,hash,set,zet等类型,但是Redis内部针对不同类型存在编码的概念,所谓编码就是具体使用哪种底层数据结构来实现。编码不同将直接影响数据的内存占用和读写效率。
type字段:
利用集合类型数据,因为通常情况下很多小的Key-Value可以用更紧凑的方式存放到一起。尽可能使用散列表(hashes),散列表(是说散列表里面存储的数少)使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面。比如你的web系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的key,而是应该把这个用户的所有信息存储到一张散列表里面。
encoding字段:
采用不同的编码实现内存占用存在明显差异
lru字段:
开发提示:可以使用scan + object idletime 命令批量查询哪些键长时间未被访问,找出长时间不访问的键进行清理降低内存占用。
refcount字段:
当对象为整数且范围在[0-9999]时,Redis可以使用共享对象的方式来节省内存。
ptr字段 :
开发提示:高并发写入场景中,在条件允许的情况下建议字符串长度控制在39字节以内,减少创建redisObject内存分配次数从而提高性能。
为什么开启maxmemory和LRU淘汰策略后对象池无效?
LRU算法需要获取对象最后被访问时间,以便淘汰最长未访问数据,每个对象最后访问时间存储在redisObject对象的lru字段。对象共享意味着多个引用共享同一个redisObject,这时lru字段也会被共享,导致无法获取每个对象的最后访问时间。如果没有设置maxmemory,直到内存被用尽Redis也不会触发内存回收,所以共享对象池可以正常工作。
综上所述,共享对象池与maxmemory+LRU策略冲突,使用时需要注意。
为什么只有整数对象池?
首先整数对象池复用的几率最大,其次对象共享的一个关键操作就是判断相等性,Redis之所以只有整数对象池,是因为整数比较算法时间复杂度为O(1),只保留一万个整数为了防止对象池浪费。如果是字符串判断相等性,时间复杂度变为O(n),特别是长字符串更消耗性能(浮点数在Redis内部使用字符串存储)。对于更复杂的数据结构如hash,list等,相等性判断需要O(n2)。对于单线程的Redis来说,这样的开销显然不合理,因此Redis只保留整数共享对象池。
字符串结构:
预分配机制:
字符串重构:基于hash类型的二级编码方式。
当Redis内存不足时,首先考虑的问题不是加机器做水平扩展,应该先尝试做内存优化。当遇到瓶颈时,再去考虑水平扩展。即使对于集群化方案,垂直层面优化也同样重要,避免不必要的资源浪费和集群化后的管理成本。
推荐学习:Redis教程
以上就是详细解析Redis内存满了怎么去优化的详细内容,更多请关注其它相关文章!
# 数据结构
# 短视频营销推广品牌排行
# SEO软件学习方法
# 中山精品网站建设接单
# 北京旅行社网站建设
# 如何把网站结构优化好些
# 万源网络营销推广价格
# 在这里
# 这一
# 中有
# 链表
# 就会
# 置顶
# 满了
# 可以使用
# 键值
# Redis
# 河北企业seo方法分析
# 黑帽seo使用技术
# 优化网站建设哪家最好
# 网站建设推广关键词
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
word文档行距怎么调?word文档调行距的操作步骤
win11如何运行chkdsk命令 Win11检查和修复磁盘逻辑错误教程【修复】
铁路12306官网入口 铁路12306中国铁路官网登录首页
悟空浏览器如何恢复关闭的标签页 悟空浏览器撤销关闭网页快捷键设置
《密马》发布账号方法
4399造梦西游3无敌版_4399游戏入口
铁路12306座位怎么选_12306官方选座操作方法
《桃源记2》资源采集攻略
济南公交卡手机充值指南
有道AI翻译入口 智能写作官方网站入口
谷歌学术论文搜索引擎 谷歌学术官网入口论坛永久链接
苹果电脑如何快速截图并编辑 苹果电脑截屏标注快捷操作
解决PHP MySQL数据库更新无响应:SQL查询语法错误解析
键盘声音异常怎么回事_键盘异响怎么处理
企查查官网和爱企查 企查查企业查询官网入口
Flexbox布局:实现粘性导航与底部页脚的完美结合
《微信》视频号原创声明开启方法
淘口令快速解析技巧
QQ邮箱手机版网页版 QQ邮箱登录入口地址
汽水音乐车机版 汽水音乐车机版官方入口
包子漫画在线观看入口 包子漫画网正版全集链接
C++二维数组动态分配方法_C++指针与数组内存布局
《雷电模拟器》截图方法介绍
Win10截图远程协助 Win10远程桌面截屏法【场景应用】
《sketchbook》选中部分图案移动方法
PDF如何批量加注释_PDF多文件批注高亮操作教程
《伊瑟》凶影追缉库卢鲁boss攻略
Final Cut Pro视频加EQ教程
win11讲述人怎么关闭 Win11屏幕朗读辅助功能禁用方法【技巧】
海棠阅读登录教程_详细讲解海棠登录操作
更换小红书群背景怎么换?小红书群规则怎么设置?
j*a中赋值运算符是什么?
Yandex浏览器官方入口_Yandex搜索引擎中文版
微信如何设置字体大小_微信字体设置的阅读舒适
第五人格PC版怎么避免被封号_第五人格PC版防封号注意事项
猫眼电影app如何筛选支持退改签的影院_猫眼电影退改签影院筛选方法
OPPO手机参数配置如何开启护眼模式_OPPO手机参数配置护眼模式开启指南
PHP utf8_encode 字符编码转换陷阱与解决方案
《via浏览器》强制缩放网页设置方法
windows10怎么更改下载路径_windows10默认存储位置修改教程
Highcharts雷达图轴线交点数值标注指南
微信朋友圈怎么设置三天可见 微信朋友圈设置指定天数可见步骤【教程】
《红果免费短剧》下载观看方法
如何在 WordPress 前端实现内容提交:古腾堡编辑器的替代方案与实践
Yandex无需登录畅游 俄罗斯搜索引擎最新官网指南
excel怎么计算平均值 excel平均函数*ERAGE使用教学
Animex动漫社正版在线入口 Animex动漫社动漫官方观看网
Scipy Sparse CSR 矩阵非零元素行级遍历的最佳实践
如何在vscode中关闭it环境
J*aScript与CSS动画:实现平滑顺序淡入淡出效果并解决显示冲突
2022-03-14
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。