RedisObject
时间:2020-04-21
本文章向大家介绍RedisObject,主要包括RedisObject使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
RedisObject结构
typedef struct redisObject {
// 类型
unsigned type:4;
// 编码
unsigned encoding:4;
// 对象最后一次被访问的时间
unsigned lru:REDIS_LRU_BITS; /* lru time (relative to server.lruclock) */
// 引用计数
int refcount;
// 指向实际值的指针
void *ptr;
} robj;
type类型
#define OBJ_STRING 0
#define OBJ_LIST 1
#define OBJ_SET 2
#define OBJ_ZSET 3
#define OBJ_HASH 4
encoding类型
encoding 表示 ptr 指向的具体数据结构,即这个对象使用了什么数据结构作为底层实现。
#define OBJ_ENCODING_RAW 0 /* Raw representation */
#define OBJ_ENCODING_INT 1 /* Encoded as integer */
#define OBJ_ENCODING_HT 2 /* Encoded as hash table */
#define OBJ_ENCODING_ZIPMAP 3 /* Encoded as zipmap */
#define OBJ_ENCODING_LINKEDLIST 4 /* Encoded as regular linked list */
#define OBJ_ENCODING_ZIPLIST 5 /* Encoded as ziplist */
#define OBJ_ENCODING_INTSET 6 /* Encoded as intset */
#define OBJ_ENCODING_SKIPLIST 7 /* Encoded as skiplist */
#define OBJ_ENCODING_EMBSTR 8 /* Embedded sds string encoding */
#define OBJ_ENCODING_QUICKLIST 9 /* Encoded as linked list of ziplists */
string
- 如果一个字符串对象保存的是整数值,并且这个整数值可以用 long 类型标识,那么字符串对象会讲整数值保存在 ptr 属性中,并将 encoding 设置为 int。
- 如果字符串对象保存的是一个字符串值,并且这个字符串的长度大于 32 字节,那么字符串对象将使用SDS来保存这个字符串值,并将对象的编码设置为 raw。
- 如果字符串对象保存的是一个字符串值,并且这个字符串的长度小于等于 32 字节,那么字符串对象将使用 embstr 编码的方式来保存这个字符串。
embstr
如果字符串对象保存的是一个字符串值, 并且这个字符串值的长度小于等于 39 字节, 那么字符串对象将使用 embstr 编码的方式来保存这个字符串值
embstr是字符串长度小于32字节的字符串编码类型,其中object的ptr与sds的数据地址相邻。由于redisObject的头结构占16个字节,sds的头结构为3字节,加上字符串末尾的\0
字节,所有embstr的最大存储长度为64-16-3-1=44
字节(使用jemalloc或tcmalloc分配的内存大小最大64字节)
为什么还会有 embstr 的编码方式呢?
- embstr 编码将创建字符串对象所需的内存分配次数从 raw 编码的两次降低为一次。
- 释放 embstr 编码的字符串对象只需要调用一次内存释放函数,而释放 raw 编码的字符串对象需要调用两次内存释放函数。
- 因为 embstr 编码的字符串对象的所有数据都保存在一块连续的内存里面,所以这种编码的字符串对象比起 raw ,编码的字符串对象能够更好地利用缓存带来的优势。
hash
- 当哈希对象保存的键值对数量小于 512,并且所有键值对的长度都小于 64 字节时,使用压缩列表存储
- 否则使用 hashtable 存储
list
- 当列表的长度小于 512,并且所有元素的长度都小于 64 字节时,使用压缩列表存储
- 否则使用 linkedlist 存储
set
- 当集合的长度小于 512,并且所有元素都是整数时,使用整数集合存储
- 否则使用 hashtable 存储
zset
- 当有序集合的长度小于 128,并且所有元素的长度都小于 64 字节时,使用压缩列表存储
- 否则使用 dict、skiplist 存储
参考
原文地址:https://www.cnblogs.com/weiweng/p/12743607.html
- Android热修复实践应用—AndFix
- Android主题换肤 无缝切换
- Android RxJava/RxAndroid结合Retrofit使用
- 网络犯罪和网络间谍对经济的影响(长文,阅读需勇气)
- FireEye:2013年度APT攻击报告(多图)
- linux下利用一次性口令实现安全管理
- HTTPS对于用户隐私泄露无能为力
- 移动APP安全在渗透测试中的应用
- ASLR在Windows与Linux系统之间的差别
- 基于RDP的SSL中间人攻击
- 软件漏洞分析技巧分享
- 撞库攻击:一场需要用户参与的持久战
- Android自定义下拉刷新动画--仿百度外卖下拉刷新
- Android自定义View之高仿QQ健康
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android使用DrawerLayout实现侧滑菜单效果
- android语音即时通讯之录音、播放功能实现代码
- win10 装centos7 虚拟机
- 怎样给centos系统扩展磁盘分区的实现方法
- android系统分享的自定义功能的示例代码
- Linux centOS安装JDK和Tomcat的教程
- Android ContentProvider实现获取手机联系人功能
- Centos 安装 PHP7.4 和 Nginx的操作方法
- vsftpd用户禁止ssh登陆的实现方法
- Android实现EditText图文混合插入上传功能
- Android实现红包雨动画效果
- 手把手教你启用Win10的Linux子系统(图文超详细)
- Android onCreateOptionsMenu的使用方法总结
- android截图事件监听的原理与实现
- 我常用的一些linux命令小结