文章目录

  • 1.1 小的聚合类型数据的特殊编码处理
  • 1.2 使用32位的redis
  • 1.3 位级别和字级别的操作
  • 1.4 尽可能使用散列表(hashes)
  • 1.5 内存分配

1.1 小的聚合类型数据的特殊编码处理

  Redis2.2版本及以后,存储集合数据的时候会采用内存压缩技术,以使用更少的内存存储更多的数据。如Hashes,Lists,Sets和Sorted Sets,当这些集合中的所有数都小于一个给定的元素,并且集合中元素数量小于某个值时,存储的数据会被以一种非常节省内存的方式进行编码,使用这种编码理论上至少会节省10倍以上内存(平均节省5倍以上内存)。并且这种编码技术对用户和redis api透明。只需在redis.conf里面进行修改更改阈值即可.

hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
zset-max-ziplist-entries 128
zset-max-ziplist-entries 128
zset-max-ziplist-value 64




  (集合中)如果某个值超过了配置文件中设置的最大值,redis将自动把把它(集合)转换为正常的散列表。这种操作对于比较小的数值是非常快的.
  建议最好做一下基准测试(和正常的不采用编码做一下对比).

1.2 使用32位的redis

  使用32位的redis,对于每一个key,将使用更少的内存,因为32位程序,指针占用的字节数更少。但是32的redis整个实例使用的内存将被限制在4G以下。使用make 32bit命令编译生成32位的redis。RDB和AOF文件是不区分32位和64位的(包括字节顺序),所以可以使用64位的reidis恢复32位的RDB备份文件,相反亦然.

1.3 位级别和字级别的操作

  Redis 2.2引入了位级别和字级别的操作: GETRANGE, SETRANGE, GETBIT 和 SETBIT.使用这些命令,可以把redis的字符串当做一个随机读取的(字节)数组。例如应用中,用来标志用户的ID是连续的整数,可使用一个位图标记用户的性别,使用1表示男性,0表示女性,或者其他的方式。这样的话,1亿个用户将仅使用12 M的内存。

1.4 尽可能使用散列表(hashes)

  小散列表(是说散列表里面存储的数少)使用的内存非常小,所以尽可能的将数据模型抽象到一个散列表里面。比如web系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的key,而是应该把这个用户的所有信息存储到一张散列表里面.

1.5 内存分配

  为了存储用户数据,当设置了maxmemory后Redis会分配几乎和maxmemory一样大的内存.

精确的值可以在配置文件中设置,或者在启动后通过 CONFIG SET 命令设置(see Using memory as an LRU cache for more info). Redis内存管理方面,你需要注意以下几点:

  当某些缓存被删除后Redis并不是总是立即将内存归还给操作系统。这并不是redis所特有的,而是函数malloc()的特性。例如你缓存了5G的数据,然后删除了2G数据,从操作系统看,redis可能仍然占用了5G的内存,即使redis已经明确声明只使用了3G的空间。这是因为redis使用的底层内存分配器不会这么简单的就把内存归还给操作系统,可能是因为已经删除的key和没有删除的key在同一个页面(page),这样就不能把完整的一页归还给操作系统.

  上面的一点意味着,你应该基于你可能会用到的 最大内存 来指定redis的最大内存。如果你的程序时不时的需要10G内存,即便在大多数情况是使用5G内存,你也需要指定最大内存为10G.

  内存分配器是智能的,可以复用用户已经释放的内存。所以当使用的内存从5G降低到3G时,你可以重新添加更多的key,而不需要再向操作系统申请内存。分配器将复用之前已经释放的2G内存.

  因为这些,当redis的peak内存非常高于平时的内存使用时,碎片所占可用内存的比例就会波动很大。当前使用的内存除以实际使用的物理内存(RSS)就是fragmentation;因为RSS就是peak memory,所以当大部分key被释放的时候,此时内存的mem_used / RSS就比较高.

  如果 maxmemory 没有设置,redis就会一直向OS申请内存,直到OS的所有内存都被使用完。所以通常建议设置上redis的内存限制。或许你也想设置 maxmemory-policy 的值为 noeviction(在redis的某些老版本默认 并 不是这样)

  设置了maxmemory后,当redis的内存达到内存限制后,再向redis发送写指令,会返回一个内存耗尽的错误。错误通常会触发一个应用程序错误,但是不会导致整台机器宕掉.

redis 17.内存优化(小的聚合类型数据的特殊编码处理、内存分配、尽可能使用散列表(hashes))相关推荐

  1. java 内存分布_java的各类型数据在内存中分配情况详解_

    1. 有这样一种说法,如今争锋于IT战场的两大势力,MS一族偏重于底层实现,Java一族偏重于系统架构.说法根据无从考证,但从两大势力各自的社区力量和图书市场已有佳作不难看出,此说法不虚,但掌握Jav ...

  2. android手机内存越来越小,安卓手机因软件安装失败 导致手机内存越来越小解决方法...

    对于很多安卓手机用户来说,手机还没用上多久,尼玛的手机内存怎么就变得越来越少了.看看自己的手机,游戏和软件也没装多少啊?这是为什么捏?其实,每次我们安装软件或者游戏失败之后,就会在手机中留下一些垃圾文 ...

  3. Android内存控制小技巧-使用矢量图来节省你的内存并简化你的开发。

    先上一个 位图和矢量图的 说明.http://zhidao.baidu.com/link?url=xwvs5CBzWeh15O3Ee4bICwCqg4PCQWwg5oZ0a6CVydbVZzufqrI ...

  4. python读取数据库数据释放内存_在使用python处理数据时,为什么其内存无法自动释放掉?...

    这与Python的内存处理机制有关. 我们对内存一定要合理利用,这是每一个程序员必须的基本功.减少垃圾排放,这才是根本,所以每一个程序员他必须得知道自己用了多少内存.别自己这些内存要不要释放,我为什么 ...

  5. Redis系列(四)--内存淘汰机制(含单机版内存优化建议)

    每台redis的服务器的内存都是有限的,而且也不是所有的内存都用来存储信息.而且redis的实现并没有在内存这块做太多的优化,所以实现者为了防止内存过于饱和,采取了一些措施来管控内存. 文章结构: ( ...

  6. Redis如何做内存优化?

    尽可能使用散列表(hashes),散列表(是说散列表里面存储的数少)使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面. 比如你的web系统中有一个用户对象,不要为这个用户的名称, ...

  7. SQL Server 2014内存优化表的使用场景

    最近一个朋友找到走起君,咨询走起君内存优化表如何做高可用的问题 大家知道,内存优化表是从SQL Server 2014开始引入,可能大家对内存优化表还是比较陌生,网上也鲜有内存优化表使用场景的文章 朋 ...

  8. ANDROID内存优化(大汇总——全)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 写在最前: 本文的思路主要借鉴了2014年AnDevCon开发者大会的一个演讲PPT,加上 ...

  9. Windows内存管理机密+揭穿内存优化工具的骗局

    原文:The Memory-Optimization Hoax:RAM optimizers make false promises 作者:Mark Russinovich 译者:盆盆   我们在浏览 ...

最新文章

  1. Weblogic 9.2和10.3 改密码 一站完成
  2. 买笔记本的10大愚蠢表现
  3. 别再傻傻地用这些软件G转P了,修复后不稳定的真相在这里
  4. python-day2~3
  5. Web前端技术分享:全栈工程师常用的开发工具
  6. datagrid只传入了一部分的数据 未显示全_软件开发面试之数据库事务篇
  7. 【PAT甲级 排序】1012 The Best Rank (25 分) C++ 全部AC
  8. 登陆SharePoint站点出现service unavailable----Http错误503
  9. Maven无法下载远程依赖-强制下载也不行
  10. 点击微信网页的a标签直接跳转到淘宝APP打开怎么实现的?附:动图演示效果
  11. 共模电感适用的频率_电感基础知识入门
  12. mariadb 卸载 Kali_Adobe官方卸载工具软件安装教程
  13. 体脂数C语言switch,你真胖么 体脂率是什么 体脂率的计算方法
  14. 汇编语言中的start有什么用?(start只是一个标号,程序不一定非要从这儿才开始执行)
  15. 三角网导线平差实例_导线平差自动计算表(非常实用)
  16. 基于python毕业设计毕设课题选题参考
  17. 微擎弹出确认授权获取用户头像
  18. Java中的switch
  19. CHROME插件 by stormzhang
  20. jenkins html插件,Jenkins插件HTML Publisher Plugin的使用

热门文章

  1. 【中英双语】Python 交易算法:市场中性对冲基金策略
  2. 众安保险面试题和答案
  3. 大数据知识(六):Hadoop练习
  4. 由MTCNN关键点估计人头姿态
  5. 美国十六所大学网上课程 -- 世界上最好的免费网上课程(英文)
  6. Android使用百度地图api获取定位信息(经纬度)
  7. ColorHexa是您的终极色彩百科全书
  8. 软件测试工程师工作经验分享
  9. win10msmpeng占内存_Win10到底需要多大内存才够用?你未必能想到
  10. postman 设置请求编码_Post请求的两种编码格式