redis之redisObject对象
2024-10-21 10:08:00
redisObject对象
无论什么数据类型,redis都是以key-value形式保存,并且所有的key都是字符串
redis每存储一条数据,都会生成一个redisObject对象,通过redisObject对象来表示存储的数据
redisObject对象是联结外部数据类型和redis底层数据结构的桥梁,其实是指向底层数据结构
redisObject对象至少包括:
1) 用来描述具体数据的类型
2) 存储的具体数据
1 redisObject对象的底层结构
结构如下:
typedef struct redisObject {
unsigned type:4;
unsigned encoding:4;
unsigned lru:LRU_BITS;
int refcount;
void *ptr;
} robj;
其中:
type:数据类型,占4bit,目前包括:REDIS_STRING(字符串)、REDIS_LIST(列表)、REDIS_HASH(哈希)、REDIS_SET(集合)、REDIS_ZSET(有序集合)
encoding:储存的具体数据对应的redis底层编码,占4bit
lru:对象最后一次被访问的时间,用于redis内存回收算法淘汰key
refcount:引用计数,允许redisObject对象在某些情况下被共享
ptr:指向数据的指针,实际指向数据类型对应的底层数据结构
2 redisObject对象示意图
3 使用redisObjec对象的好处
1) 执行redis命令时,可以通过redisObject 的type和encoding属性来确定是否可以执行相应的命令,不用等操作具体的数据时才发现命令不可执行
2) 同一数据类型可以使用不同的底层编码,优化不同场景下的使用效率和节省内存
3) 支持共享和引用计数。当对象被共享时,只占用一份内存拷贝,节省内存
4) 根据lru属性并结合redis内存回收算法淘汰长时间未使用的key
4 type,encoding,数据类型和底层数据结构的关系
相同的type,可能对应不同的encoding:同一个数据类型,redis使用了不同的底层数据结构,导致在内存占用和查找性能上会有所不同
redis中每种数据类型都会有至少对应2种底层数据结构
type | redis数据类型 | 编码 | encoding | 底层数据结构 |
REDIS_STRING | String(字符串) | int | REDIS_ENCODING_INT | long型整数的简单动态字符串 |
REDIS_STRING | String(字符串) | embstr | REDIS_ENCODING_EMBSTR | embstr编码的简单动态字符串 |
REDIS_STRING | String(字符串) | raw | REDIS_ENCODING_RAW | 简单动态字符串 |
REDIS_LIST | List(列表) | ziplist | REDIS_ENCODING_ZIPLIST | 压缩列表 |
REDIS_LIST | List(列表) | linkedlist | REDIS_ENCODING_LINKEDLIST | 双向链表 |
REDIS_SET | Set(集合) | intset | REDIS_ENCODING_INTSET | 整数集合 |
REDIS_SET | Set(集合) | hashtable | REDIS_ENCODING_HT | 字典 |
REDIS_ZSET | Sorted Set(有序集合) | ziplist | REDIS_ENCODING_ZIPLIST | 压缩列表 |
REDIS_ZSET | Sorted Set(有序集合) | skiplist | REDIS_ENCODING_SKIPLIST | 跳表+字典 |
REDIS_HASH | Hash(哈希) | ziplist | REDIS_ENCODING_ZIPLIST | 压缩列表 |
REDIS_HASH | Hash(哈希) | hashtable | REDIS_ENCODING_HT | 字典 |
最新文章
- 自发行python版本制作(一)
- JavaScript面试题
- poj 1325 Machine Schedule
- Grid++Report的几点总结
- Hanganalyze 使用
- (转)RabbitMQ 集群与高可用配置
- sh脚本执行Java程序
- light oj 1354 - IP Checking
- 使用Eclipse提供的Axis1.x生成WSDL文件以及Server和Client代码
- git rebase实战
- java 定义mysql树形菜单
- Python之路第三天,基础(3)-set,函数,内置函数,文件,三元运算,lambda
- 删除sql计划 调用的目标发生了异常。 (mscorlib) 其他信息: 用户 'sa' 登录失败。
- Java线程:线程交互
- 伸展树(Splay树)的简要操作
- Nginx反向代理以及负载均衡配置
- P1013
- git知识总结-2.git基本操作之操作汇总
- Java 数据库程序设计
- 洛谷 [USACO17OPEN]Bovine Genomics G奶牛基因组(金) ———— 1道骗人的二分+trie树(其实是差分算法)
热门文章
- (app笔记)Appium如何开启、配置、启用
- web基础(7): JavaScript 简介/语法
- jquery 中根据日期计算天数,以及去掉字符串中的空格
- shell脚本实战笔录-在PATH中查找程序
- 「postOI」Lost Array
- 安装指定版本homeassistant
- MARKDOWN操作
- DDL数据定义--Hive中数据可和表的基本操作(增删改查)
- vue3 门户网站搭建3-pinia
- Salesforce 发送Email时遇到的问题(Case当中的Filed不出现Email选项:ケースのフィールドにメールタブが表示されない)。