redis 存储之 redisObject
redisObject
redis 是 key-value
存储系统,其中key
类型一般为字符串
,而 value
类型则为 redis 对象(redisObject
)。Redis 对象可以绑定各种类型的数据,譬如 string、list 和set。因此他能很好的将属性和数据分离开。
typedef struct redisObject {
// 刚刚好32 bits
// 对象的类型,字符串/列表/集合/哈希表
unsigned type:4;
// 未使用的两个位
unsigned notused:2;
// 编码的方式,Redis 为了节省空间,提供多种方式来保存一个数据
// 譬如:“123456789” 会被存储为整数123456789
unsigned encoding:4;
// 当内存紧张,淘汰数据的时候用到
unsigned lru:22;
// 引用计数
int refcount;
// 数据指针
void *ptr;
} robj;
其中,void *ptr
执行具体的数据。
redisObject 数据的属性
redis.h
中定义了 struct redisObject
,它是一个简单优秀的数据结构,因为在 redisObject
中数据属性和数据分开来了,其中,数据属性包括数据类型,存储编码方式,淘汰时钟,引用计数。
数据类型
标记了 Redis 对象绑定的是什么类型的数据,有下面几种可能的值;
字符串
define REDIS_STRING 0
列表
define REDIS_LIST 1
集合
define REDIS_SET 2
有序集合
define REDIS_ZSET 3
哈希
define REDIS_HASH 4
存储编码方式
存储编码方式,一个数据,可以以多种方式存储。譬如,数据类型为 REDIS_SET 的数据编码方式可能为 REDIS_ENCODING_HT,也可能为 REDIS_ENCODING_INTSET。
define REDIS_ENCODING_RAW 0
define REDIS_ENCODING_INT 1
define REDIS_ENCODING_HT 2
define REDIS_ENCODING_ZIPMAP 3
define REDIS_ENCODING_LINKEDLIST 4
define REDIS_ENCODING_ZIPLIST 5
define REDIS_ENCODING_INTSET 6
define REDIS_ENCODING_SKIPLIST 7
淘汰时钟
Redis 对数据集占用内存的大小有实时
的计算,当超出限额时,会淘汰超时的数据。
引用计数
一个 Redis 对象可能被多个指针引用。当需要增加或者减少引用的时候,必须调用相应的函数,程序员必须遵守这一准则。因为Redis 是单进程单线程工作的,所以增加/减少引用的操作不必保证原子性,这在 memcache 中是做不到的(memcached 是多线程的工作模式,需要做到互斥)。
ptr
数据指针,真正的数据 保存在 ptr
指向的地址。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341