insert编码

是集合(set)的类型编码的一种,内部表现为存储有序、不重复的整数集。当集合只包含整数且长度不超过set-max-intset-entries 配置时被启用。执行以下命令查看intset表现:

redis> sadd set:test 3 4 2 6 8 9 2
(integer) 6
redis> object encoding set:test
"intset"
redis> smembers set:test
"2" "3" "4" "6" "8" "9"
redis> config set set-max-intset-entries 6
OK
redis> sadd set:test 5
"hashtable"
redis> smembers set:test
"8" "3" "5" "9" "4" "2" "6"

以上命令可以看出intset对写入整数进行排序,通过O(logn)时间复杂度实现查找和去重操作,intset编码结构如图所示:

字段结构含义:

1. encoding:整数表示类型,根据结合内最长整数值确定类型,整数类型划分为三种,int-16/int-32/int-64

2. length:表示集合元素个数。

3. contents: 整数数组、按从小到大顺序保存。

intset保存的整数类型根据长度划分,当保存的整数超出当前类型时,将会触发自动升级操作且升级后不再做回退。

升级操作将会导致重新申请内存空间,把原有数据按转换类型后拷贝到新数组中。

控制键的数量

当使用redis存储大量数据时,通常会存在大量键,过多的键同样会消耗大量内存。Redis本质是一个数据结构服务器,它为我们提供多种数据结构,如hash、list、set、zset等。使用Redis时不要进入一个误区,大量使用get/set/这样的API,把redis当错memcached使用。

对于存储相同的数据内容利用Redis的数据结构降低外层键的数量,也可以节省大量内存。如图所示,通过在客户端预估键规模,把大量键分组映射到多个hash结构中减低键的数量。

hash结构降低键数量分析:

1. 根据键规模在客户端通过分组映射到一组hash对象中,如存在100万个键,可以映射到1000个hash中,每个hash保存1000个元素。

2. hash的field可用于记录原始key字符串,方便哈希查找。

3. hash的value保存原始值对象,确保不要超过hash-max-ziplist-value限制。

同样的数据使用ziplist编码的hash类型存储比string类型节约内存。

节省内存量随着value空间的减少越来越明显。

hash-ziplist类型比string类型写入耗时,但随着value空间的减少,耗时逐渐降低。

使用hash重构后节省内存量效果非常明显,特别对于存储小对象的场景,内存只有不到原来的1/5 。下面分析这种内存优化技巧的关键点;

1. hash类型节省内存的原理是使用ziplist编码,如果使用hashtable编码方式反而会增加内存消耗。

2  ziplist长度需要控制在1000以内,否则由于存储操作时间复杂度在O(n) 到O(n2)之间,长列表会导致CPU消耗严重,得不偿失。

3. ziplist适合存储小对象,对于大对象不但内存优化效果不明显还会增加命令操作耗时。

4. 需要预估键的规模,从而确定每个hash结构需要存储的元素数量

5. 根据hash长度和元素大小,调整hash-max-ziplist-entries和hash-max-ziplist-value参数,确保hash类型使用ziplist编码

关于hash键和field键的设计:

1. 当键离散度较高时,可以按字符串位截取,把后三位作为哈希的field,之前部分作为哈希的键。

如:key=1948480哈希key=group:hash:1948,哈希field=480。

2. 当键离散度较低时,可以使用哈希算法打散键,

如:使用crc32(key)&10000函数把所有的键映射到“0-9999”整数范围内,哈希field存储键的原始值。

3. 尽量减少hash键和field的长度,如使用部分键内容

使用hash结构控制键的规模虽然可以大幅降低内存,但同样会带来问题,需要提前做好规避处理

1. 客户端需要预估键的规模并设计hash分组规则,加重客户端开发成本。

2. hash重构后所有的键无法再使用超时(expire)和LRU淘汰机制自动删除,需要手动维护删除

3. 对于大对象,如1KB以上的对象,使用hash-ziplist结构控制键数量反而得不偿失

4. 对于大量小对象的存储场景,非常适合使用ziplist编码的hash类型控制键的规模来降低内存

使用ziplist+hash优化keys后,如果想使用超时删除功能,开发人员可以存储每个对象写入的时间,再通过定时任务使用hscan命令扫描数据,找出hash内超时的数据项删除即可

Redis开发与运维之第八章理解内存(五)相关推荐

  1. Redis开发与运维 必备-电子书

    Redis开发与运维电子书 fulei出版 链接: https://pan.baidu.com/s/12rlHhOKP7_72GE8a74lN1g 密码: eep2 复制这段内容后打开百度网盘手机Ap ...

  2. 「Redis开发与运维」读书笔记

    第一章 初识Redis Redis的8个重要特性 速度快 内存存储数据 C语言实现 单线程架构,避免多线程竞争问题 Redis源码优化好 基于键值对的数据结构服务器 Redis 值可支持多种数据结构, ...

  3. <Redis开发与运维>一书阅读笔记记录

    文章目录 前言 第1章:初始redis 盛赞redis redis特性 redis使用场景 第2章:API的理解和使用 预备知识 全局命令 数据结构和内部编码 单线程架构 字符串 命令 内部编码 典型 ...

  4. 读书笔记:redis开发与运维 基础篇

     redis特性    1>速度快:redis所有数据都是存放在内存中,是redis速度快的主要原因,是有c编写,一般来说用c编写的程序距离操作系统近,执行速度更快,非阻塞I/O,使用epoll ...

  5. Redis开发与运维笔记_1 初识2 API

    目录 概述 第1章 初识Redis 1.1 盛赞Redis 1.2 Redis特性 1.3 配置.启动.操作.关闭Redis 第2章 API的理解和使用 2.1 预备 2.1.1 全局命令 2.1.2 ...

  6. 【Redis】《Redis 开发与运维》笔记-Chapter12-开发运维的“ 陷阱”

    十二.开发运维的" 陷阱" 1.Linux配置优化之内存分配控制 1)vm.overcommit_memory Linux操作系统对大部分申请内存的请求都回复yes,以便能运行更多 ...

  7. 《Redis开发与运维》读书笔记--初识Redis(一)

    目录 盛赞Redis Redis特性 redis使用场景 redis可以做什么? redis不可以做什么? 关于用好redis的两点建议 本章重点回顾 写在前面: 想必在写项目的过程中,我们很多时候都 ...

  8. Redis 开发与运维

    Getting Start 高性能 性能优势的体现 C语言实现的内存管理 epoll的I/O多路复用技术+IO连接/关闭/读写通过事件实现异步的非阻塞IO TCP协议 单线程架构,不会因为高并发对服务 ...

  9. 《Redis开发与运维》各章重点回顾

    第 1 章 初识 Redis Redis 8个特性:速度快.基于键值对的数据结构服务器.功能丰富.简单稳定.客户端语言多.持久化.主从复制.支持高可用和分布式. Redis 不是万金油,有些场景不适合 ...

  10. Redis理解内存《Redis开发与运维读书笔记》

    文章目录 内存的消耗 内存划分 内存管理 内存优化 内存的消耗 可以使用info memory 查看内存消耗. 内存划分 对象内存 = sizeof(key) + sizeof(value) 应避免使 ...

最新文章

  1. 杀死linux-zombie僵尸进程
  2. 不是所有邮件服务器都叫智慧邮件系统
  3. html百度地图中心点不正确,百度地图嵌入弹出层,无法准确正确显示marker标记到中心位置的问题...
  4. 大会直击|微软亚洲研究院刘铁岩:深度学习成功的秘密
  5. Java打乱牌的算法_Leetcode 384. 打乱数组 (洗牌算法)
  6. ML之xgboost:解读用法之xgboost库的core.py文件中的get_score(importance_type=self.importance_type)方法
  7. Windows环境下MySQL 8.0 的安装、配置与卸载
  8. python代码模块与模块之间空1行_Day006|Python语法基础
  9. laravel 分词搜索匹配度_搜索引擎工作原理
  10. oracle 分组_大数据分组怎样才会更快
  11. 实战分享:activemq 在灾备双活建设中的研究
  12. 实战案例丨ModelArts在数据标注、数据过滤上的应用技巧:自动分组
  13. 问题3:点击应用icon,会卡几秒后才进入到启动界面
  14. 查看 Visio 是否激活以及激活方法
  15. 一篇通俗易懂的文章初探NIO
  16. 如何掌握程序语言(王垠)
  17. 羊了个羊微信小游戏开发技术解析
  18. 区块链三加一 “成才”路上提个醒:区块链培训机构鱼龙混杂
  19. C语言有参数有返回值的函数
  20. 微信小程序获取用户信息相关问题

热门文章

  1. 平板波导 matlab,非对称平板波导色散曲线求解(附matlab程序).doc
  2. 智能语言-中科院分词系统ICTCLAS(NLPIR)
  3. 数学建模——五大类模型
  4. 数学建模-常见模型整理及分类
  5. 网页上的文本不让你复制下载?老司机教你几招,轻松免费复制
  6. 绿盾加密导致Visual Stdio无法使用
  7. 迅捷PDF虚拟打印机怎么保存文件
  8. linux 小度 驱动_小度Wifi,360随身Wifi2,小米Wifi树莓派驱动下载
  9. Java 垃圾回收机制原理
  10. 计算机系统 基础知识点汇总,超全!!!