详细解析Redis内存满了怎么去优化


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

详细解析Redis内存满了怎么去优化

推荐学习:Redis学习教程

Redis内存满了怎么办?怎么优化内存?

MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据

redis内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。

Redis主要消耗什么物理资源?

内存。

Redis的内存用完了会发生什么?

如果达到设置的上限,Redis的写命令会返回错误信息(但是读命令还可以正常返回。)或者你可以配置内存淘汰机制,当Redis达到内存上限时会冲刷掉旧的内容。

谈谈缓存数据的淘汰机制

Redis 缓存有哪些淘汰策略?

  • 不进行数据淘汰的策略,只有 noeviction 这一种。

会进行淘汰的 7 种策略,我们可以再进一步根据淘汰候选数据集的范围把它们分成两类:

  • 在设置了过期时间的数据中进行淘汰,包括 volatile-random、volatile-ttl、volatile-lru、volatile-lfu四种。
  • 在所有数据范围内进行淘汰,包括 allkeys-lru、allkeys-random、allkeys-lfu三种。
策略 规则
volatile-ttl 在筛选时,会针对设置了过期时间的键值对,根据过期时间的先后进行删除,越早过期的越先被删除。
volatile-random 在设置了过期时间的键值对中,进行随机删除。
volatile-lru 使用 LRU 算法筛选设置了过期时间的键值对
volatile-lfu 使用 LFU 算法选择设置了过期时间的键值对
策略 规则
allkeys-random 从所有键值对中随机选择并删除数据;
allkeys-lru 使用 LRU 算法在所有数据中进行筛选
vallkeys-lfu 使用 LFU 算法在所有数据中进行筛选

谈谈LRU算法

是按照最近最少使用的原则来筛选数据,最不常用的数据会被筛选出来,而最近频繁使用的数据会留在缓存中。

那具体是怎么筛选的呢?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 字段值最小的数据淘汰出去。

使用建议:

  • 优先使用 allkeys-lru 策略。这样,可以充分利用 LRU 这一经典缓存算法的优势,把最近最常访问的数据留在缓存中,提升应用的访问性能。如果你的业务数据中有明显的冷热数据区分,我建议你使用 allkeys-lru 策略。
  • 如果业务应用中的数据访问频率相差不大,没有明显的冷热数据区分,建议使用 allkeys-random 策略,随机选择淘汰的数据就行。
  • 如果你的业务中有置顶的需求,比如置顶新闻、置顶视频,那么,可以使用 volatile-lru 策略,同时不给这些置顶数据设置过期时间。这样一来,这些需要置顶的数据一直不会被删除,而其他数据会在过期时根据 LRU 规则进行筛选。

如何处理被淘汰的数据?

一旦被淘汰的数据选定后,如果这个数据是干净数据,那么我们就直接删除;如果这个数据是脏数据,我们需要把它写回数据库。

那怎么判断一个数据到底是干净的还是脏的呢?

  • 干净数据和脏数据的区别就在于,和最初从后端数据库里读取时的值相比,有没有被修改过。干净数据一直没有被修改,所以后端数据库里的数据也是最新值。在替换时,它可以被直接删除。
  • 而脏数据就是曾经被修改过的,已经和后端数据库中保存的数据不一致了。此时,如果不把脏数据写回到数据库中,这个数据的最新值就丢失了,就会影响应用的正常使用。

即使淘汰的数据是脏数据,Redis 也不会把它们写回数据库。所以,我们在使用 Redis 缓存时,如果数据被修改了,需要在数据修改时就将它写回数据库。否则,这个脏数据被淘汰时,会被 Redis 删除,而数据库里也没有最新的数据了。

一览妙笔 一览妙笔

自媒体、编剧、营销人员写作工具

一览妙笔 50 查看详情 一览妙笔

Redis怎么优化内存?

1、控制key的数量:当使用Redis存储大量数据时,通常会存在大量键,过多的键同样会消耗大量内存。Redis本质是一个数据结构服务器,它为我们提供多种数据结构,如hash,list,set,zset 等结构。使用Redis时不要进入一个误区,大量使用get/set这样的API,把Redis当成Memcached使用。对于存储相同的数据内容利用Redis的数据结构降低外层键的数量,也可以节省大量内存。
2、缩减键值对象,降低Redis内存使用最直接的方式就是缩减键(key)和值(value)的长度。

  • key长度:如在设计键时,在完整描述业务情况下,键值越短越好。
  • value长度:值对象缩减比较复杂,常见需求是把业务对象序列化成二进制数组放入Redis。首先应该在业务上精简业务对象,去掉不必要的属性避免存储无效数据。其次在序列化工具选择上,应该选择更高效的序列化工具来降低字节数组大小。

3、编码优化。Redis对外提供了string,list,hash,set,zet等类型,但是Redis内部针对不同类型存在编码的概念,所谓编码就是具体使用哪种底层数据结构来实现。编码不同将直接影响数据的内存占用和读写效率。


  • 1、redisObject对象
    在这里插入图片描述

type字段:
利用集合类型数据,因为通常情况下很多小的Key-Value可以用更紧凑的方式存放到一起。尽可能使用散列表(hashes),散列表(是说散列表里面存储的数少)使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面。比如你的web系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的key,而是应该把这个用户的所有信息存储到一张散列表里面。

encoding字段:
采用不同的编码实现内存占用存在明显差异

lru字段:
开发提示:可以使用scan + object idletime 命令批量查询哪些键长时间未被访问,找出长时间不访问的键进行清理降低内存占用。

refcount字段:
当对象为整数且范围在[0-9999]时,Redis可以使用共享对象的方式来节省内存。

ptr字段 :
开发提示:高并发写入场景中,在条件允许的情况下建议字符串长度控制在39字节以内,减少创建redisObject内存分配次数从而提高性能。


  • 2、缩减键值对象
    降低Redis内存使用最直接的方式就是缩减键(key)和值(value)的长度。
    可以使用通用压缩算法压缩json,xml后再存入Redis,从而降低内存占用

  • 3、共享对象池
    对象共享池指Redis内部维护[0-9999]的整数对象池。创建大量的整数类型redisObject存在内存开销,每个redisObject内部结构至少占16字节,甚至超过了整数自身空间消耗。所以Redis内存维护一个[0-9999]的整数对象池,用于节约内存。 除了整数值对象,其他类型如list,hash,set,zset内部元素也可以使用整数对象池。因此开发中在满足需求的前提下,尽量使用整数对象以节省内存。
    当设置maxmemory并启用LRU相关淘汰策略如:volatile-lru,allkeys-lru时,Redis禁止使用共享对象池。

为什么开启maxmemory和LRU淘汰策略后对象池无效?
LRU算法需要获取对象最后被访问时间,以便淘汰最长未访问数据,每个对象最后访问时间存储在redisObject对象的lru字段。对象共享意味着多个引用共享同一个redisObject,这时lru字段也会被共享,导致无法获取每个对象的最后访问时间。如果没有设置maxmemory,直到内存被用尽Redis也不会触发内存回收,所以共享对象池可以正常工作。
综上所述,共享对象池与maxmemory+LRU策略冲突,使用时需要注意。

为什么只有整数对象池?
首先整数对象池复用的几率最大,其次对象共享的一个关键操作就是判断相等性,Redis之所以只有整数对象池,是因为整数比较算法时间复杂度为O(1),只保留一万个整数为了防止对象池浪费。如果是字符串判断相等性,时间复杂度变为O(n),特别是长字符串更消耗性能(浮点数在Redis内部使用字符串存储)。对于更复杂的数据结构如hash,list等,相等性判断需要O(n2)。对于单线程的Redis来说,这样的开销显然不合理,因此Redis只保留整数共享对象池。


  • 4、字符串优化
    Redis没有采用原生C语言的字符串类型而是自己实现了字符串结构,内部简单动态字符串,简称SDS。

字符串结构:

  • 特点:
    O(1)时间复杂度获取:字符串长度,已用长度,未用长度。
    可用于保存字节数组,支持安全的二进制数据存储。
    内部实现空间预分配机制,降低内存再分配次数。
    惰性删除机制,字符串缩减后的空间不释放,作为预分配空间保留。

预分配机制:

  • 开发提示:尽量减少字符串频繁修改操作如append,setrange, 改为直接使用set修改字符串,降低预分配带来的内存浪费和内存碎片化。

字符串重构:基于hash类型的二级编码方式。

  • 二级编码怎么用?
    二级编码方法中采用的 ID 长度是有讲究的。
    涉及到一个问题–Hash 类型底层结构小于设定值时使用压缩列表,大于设定值时使用哈希表。
    一旦从压缩列表转为了哈希表,Hash 类型会一直用哈希表进行保存,而不会再转回压缩列表。
    在节省内存空间方面,哈希表就没有压缩列表那么高效。为能充分使用压缩列表的精简内存布局,一般要控制保存在 Hash 中的元素个数。

  • 5.编码优化
    使用压缩列表ziplist编码的hash类型依然比使用hashtable编码的集合节省大量内存。

  • 6.控制key的数量
    开发提示:使用ziplist+hash优化keys后,如果想使用超时删除功能,开发人员可以存储每个对象写入的时间,再通过定时任务使用hscan命令扫描数据,找出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

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.