Redis对基础数据类型进行了封装,构建出上层的对象系统,这个系统包含:字符串对象、列表对象、哈希对象、集合对象和有序集合对象。

Redis对象结构:
[cce lang=”c”]
typedef struct redisObject {
//类型
unsigned type:4;
//编码
unsigned encoding:4;
//LRU时间
unsigned lru:REDIS_LRU_BITS; /* lru time (relative to server.lruclock) */
//引用计数
int refcount;
//底层实现数据结构的指针
void *ptr;
} robj;
[/cce]

相关宏定义:
[cce lang=”c”]
#define REDIS_LRU_BITS 24
#define REDIS_LRU_CLOCK_MAX ((1<<REDIS_LRU_BITS)-1) /* Max value of obj->lru */
#define REDIS_LRU_CLOCK_RESOLUTION 1 /* LRU clock resolution in seconds */
[/cce]

Redis对象类型:(使用type命令查看)
[cce lang=”c”]
/* Object types */
#define REDIS_STRING 0
#define REDIS_LIST 1
#define REDIS_SET 2
#define REDIS_ZSET 3
#define REDIS_HASH 4

//对象编码类型:(使用object encoding命令)
#define REDIS_ENCODING_RAW 0 /* Raw representation */
#define REDIS_ENCODING_INT 1 /* Encoded as integer */
#define REDIS_ENCODING_HT 2 /* Encoded as hash table */
#define REDIS_ENCODING_ZIPMAP 3 /* Encoded as zipmap */
#define REDIS_ENCODING_LINKEDLIST 4 /* Encoded as regular linked list */
#define REDIS_ENCODING_ZIPLIST 5 /* Encoded as ziplist */
#define REDIS_ENCODING_INTSET 6 /* Encoded as intset */
#define REDIS_ENCODING_SKIPLIST 7 /* Encoded as skiplist */
[/cce]

不同类型和编码的对象:

类型 编码 对象
REDIS_STRING REDIS_ENCODING_INT 使用整数值实现的字符串对象
REDIS_STRING REDIS_ENCODING_EMBSTR 这货redis3.0引入的,不管
REDIS_STRING REDIS_ENCODING_RAW sds实现的字符串对象
REDIS_LIST REDIS_ENCODING_ZIPLIST 使用压缩列表实现的列表对象
REDIS_LIST REDIS_ENCODING_LINKEDLIST 使用双向链表实现的列表对象
REDIS_HASH REDIS_ENCODING_ZIPLIST 使用压缩列表实现的哈希对象
REDIS_HASH REDIS_ENCODING_HT 使用字典实现的哈希对象
REDIS_SET REDIS_ENCODING_INTSET 使用整数集合实现的集合对象
REDIS_SET REDIS_ENCODING_HT 使用字典实现的集合对象
REDIS_ZSET REDIS_ENCODING_ZIPLIST 使用压缩列表实现的有序集合对象
REDIS_ZSET REDIS_ENCODING_SKIPLIST 使用跳跃表想和字典实现的有序集合对象

字符串对象:
整数(long)被保存为int类型
浮点保存为字符串,浮点运算(INCRYBYFLOAT)redis先转成浮点,进行运算后再转回字符串

列表对象:
列表对象同时满足一下两个条件时,列表对象使用ziplist编码
列表对象保存的所有字符串元素的长度都小于64个字节(list-max-ziplist-value)
列表对象保存的元素数量小于512个(list-max-ziplist-entries)
不能满足条件的都需要使用linkedlist编码。

哈希对象:
使用压缩列表,键和值分别作为节点按顺序放入列表
使用ziplist的条件:
哈希对象保存的所有键值对的键和值的字符串长度小于64个字节(hash-max-ziplist-value)
哈希对象保存的键值对数量小于512个(hash-max-ziplist-entries)

集合对象:
hashtable编码,字典的每个键都是一个字符串对象,字典的值全部设置为NULL
使用intset编码条件:
集合对象保存的所有元素是整数值
集合对象保存的元素数量不超过512个(set-max-intset-entries)
不满足条件的集合对象需要使用hashtable编码

有序集合对象:
ziplist编码的有序集合,每个集合元素使用两个紧挨在一起的压缩节点列表来保存,第一个节点保存元素的成员,第二个节点保存元素的分值。
skiplist编码的有序集合,采用一个skiplist和一个hashtable实现。
使用ziplist编码条件:
有序集合保存的元素数量小于128个(zset-max-ziplist-entries)
有序集合保存的所有元素成员的长度都小于64字节(zset-max-ziplist-value)

对象共享:
Redis在初始化时,会创建1w个字符串对象(REDIS_SHARED_INTEGERS),包含整数0~9999,当需要使用这些对象的时候,会使用这些对象的引用(引用计数)而不新创建。
[cce lang=”c”]
if (value >= 0 && value < REDIS_SHARED_INTEGERS) {
incrRefCount(shared.integers[value]);
o = shared.integers[value];
}
[/cce]

转载自:https://coolex.info/blog/454.html

[redis设计与实现][7]基本数据结构——对象相关推荐

  1. [redis设计与实现][5]基本数据结构——整数集合

    整数集合(intset)用于集合键.当一个集合只包含整数值元素,并且数量不多的时候,会使用整数集合作为集合键的底层实现.相对于直接保存字符串,整数集合能够很好地节约内存,但是由于是数组保存,需要特别关 ...

  2. 《Redis 设计与实现》读书笔记-Redis 对象

    一.Redis 对象 1.1 Redis 对象简介 Redis 使用对象来表示数据库中键和值,当我们在数据库中存储一个键值对时,至少会创建两个对象,一个对象用于存储键值对的键,另一个对象用于存储键值对 ...

  3. Redis数据结构-对象

    目录 前言 1.对象的类型与编码 1.1.类型 2.编码和底层实现 2.1.字符串对象 2.2.列表对象 2.3.哈希对象 2.4.集合对象 2.5.有序集合对象 参考 最后 前言 Redis并没有直 ...

  4. Redis源码篇(1)——底层数据结构与对象

    一:底层数据结构 1.SDS struct sdshdr {int len;int free;char buf[]; } 注: 1.1.'\0'结尾遵循C语言规范,可以直接调用C语言字符串的部分api ...

  5. Redis设计与实现——对象

    文章目录 对象的类型与编码 字符串对象 编码转换 列表对象 编码转换 哈希对象 编码转换 集合对象 编码转换 有序集合对象 为什么zset同时使用跳跃表和字典来实现? 编码转换 Redis 的底层数据 ...

  6. 【一图流思维导图】Redis设计与实现 包括( 数据类型-数据结构) 及应用场景(登录次数校验,在线人数统计,分布式session,redis分页,判断重复注册,社交领域共同喜好,排行榜 ,topN)

    参照 Redis详解(一)------ redis的简介与安装 Redis详解(二)------ redis的配置文件介绍 Redis详解(三)------ redis的六大数据类型详细用法 Redi ...

  7. redis数据结构对象

    redis的数据结构对象包括 字符串 列表 哈希 集合 有序集合五种数据结构对象,由底层的8种数据结构组成这五种对象,每种对象的实现不同的数据都是不一样的. 结构 typedef struct red ...

  8. 《Redis设计与实现》笔记|SDS动态字符串|链表字典跳跃表整数集合压缩列表结构|redis中的对象|数据库原理|RDB持久化|AOF持久化|事件与多路利用模型|发布订阅原理|事务原理|慢查询日志

    <Redis设计与实现>笔记 前记: 参考配套网站:http://redisbook.com 带注释的源码地址:https://github.com/huangz1990/redis-3. ...

  9. Redis 源码走读(二)对象系统

    Redis设计了多种数据结构,并以此为基础构建了多种对象,每种对象(除了新出的 stream 以外)都有超过一种的实现. redisObject 这个结构体反应了 Redis 对象的内存布局 type ...

最新文章

  1. 通过仿真和综合认识D触发器(Verilog HDL语言描述D触发器)
  2. IDA+GDB远程调试android平台 - Aarch64- elf64程序
  3. python如何处理异常,让程序不结束继续运行?
  4. 小到年货大到产业,刘村长的扶贫模式有点厉害!
  5. LSGO软件技术团队2015~2016学年第六周(1005~1011)总结
  6. Sentinel服务熔断只配置fallback_客户自定义限流处理_削峰填谷_流量控制_速率控制_服务熔断_服务降级---微服务升级_SpringCloud Alibaba工作笔记0050
  7. Android快速入门之使用AdapterView展示不同风格的列表
  8. Latex:大于等于号和小于等于号
  9. Mac访达查看隐藏文件的快捷键、命令行设置两种方式
  10. python获取今日头条搜索信息_python 爬取今日头条关键词搜索
  11. 微信小程序在苹果上出现[request:fail 发生了 SSL 错误无法建立与该服务器的安全连接。]错误的解决方案
  12. SpringBoot数据库密码动态配置
  13. java 绘制图形实验心得体会_绘图实习心得体会3篇
  14. 在腾讯云中配置服务器外网可以访问
  15. 理清web服务器跟应用服务器的基本概念(纯拷贝)
  16. python制作聊天软件_一步一步教你做聊天软件(Python实现+非阻塞)
  17. 微信支付分支付免押订单租赁订单thinkphp5
  18. CKEditor插件的使用
  19. 差分隐私 深度学习_深度学习中的差异隐私
  20. shell小技巧(一百三十三)n个人报数出局游戏

热门文章

  1. 硬件结构图_那曲地表水电子除垢仪结构图
  2. Python之数据聚合——aggregate()方法
  3. leetcode122. 买卖股票的最佳时机 II
  4. leetcode105 前序中序遍历序列构造二叉树
  5. 判断微信小游戏用户是否真的分享
  6. valgrind工具使用详解
  7. windows下关于Objective-C开发环境的配置
  8. LeetCode - Easy - 155. Min Stack
  9. 如何保证接口的幂等性
  10. python安装好的界面_手把手教你配置最漂亮的PyCharm界面,Python程序员必备!