redis 是 key-value
存储系统,其中key
类型通常为字符串
,而 value
类型则为 redis 对象(redisObject
)。Redis 对象能够绑定各类类型的数据,譬如 string、list 和set。所以他能很好的将属性和数据分离开。程序员
typedef struct redisObject { // 刚恰好32 bits // 对象的类型,字符串/列表/集合/哈希表 unsigned type:4; // 未使用的两个位 unsigned notused:2; /* Not used */ // 编码的方式,Redis 为了节省空间,提供多种方式来保存一个数据 // 譬如:“123456789” 会被存储为整数123456789 unsigned encoding:4; // 当内存紧张,淘汰数据的时候用到 unsigned lru:22; /* lru time (relative to server.lruclock) */ // 引用计数 int refcount; // 数据指针 void *ptr; } robj;
其中,void *ptr
执行具体的数据。redis
redis.h
中定义了 struct redisObject
,它是一个简单优秀的数据结构,由于在 redisObject
中数据属性和数据分开来了,其中,数据属性包括数据类型,存储编码方式,淘汰时钟,引用计数。数据结构
标记了 Redis 对象绑定的是什么类型的数据,有下面几种可能的值;多线程
字符串memcached
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。code
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 */
Redis 对数据集占用内存的大小有实时
的计算,当超出限额时,会淘汰超时的数据。
一个 Redis 对象可能被多个指针引用。当须要增长或者减小引用的时候,必须调用相应的函数,程序员必须遵照这一准则。由于Redis 是单进程单线程工做的,因此增长/减小引用的操做没必要保证原子性,这在 memcache 中是作不到的(memcached 是多线程的工做模式,须要作到互斥)。
数据指针,真正的数据 保存在 ptr
指向的地址。