来源:公司征哥分享
初识redis
一)万物皆对象:
typedef struct redisObject {
unsigned type:4;
unsigned encoding:4;
unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or
* LFU data (least significant 8 bits frequency
* and most significant 16 bits access time). */
int refcount;
void *ptr;
} robj;
redisObject size is:16
二)五种用户态的数据结构
- String : set get hset hget ...
- Hash : hset hget hgetall ...
- Set : sadd smembers srem sismember...
- ZList : 自己查手册
- ZSet : 自己查手册
这是直接提供给用户使用的数据结构。而他又有错综复杂的实现方式,那这几种实现方式又集中在了这八种
三)八种内核态的数据结构
1)数字
太简单了可以直接略过
2)raw 复杂的sds 对象
3)empstr 简单的sds 对象。
算字符串存储的时候还要考虑附属字段带来的字节开销 均值可以按照 sizeof(int) + sizeof(int) =16 来计算。
4) linkedlist
单个node的结构
typedef struct listNode { // 前置节点 struct listNode *prev; // 后置节点 struct listNode *next; // 节点的值 void *value; } listNode;
可以看到 。 value是多态的实现关键。可以指向 redisObject.
5) ht/dict
ht里面需要注意的是rehash,和渐进式hash
v的值可以是void也可以是int,如果是void那么就实现了多态。
6) ziplist
节省空间法宝。
7) 数组集合
当数绝对值比较大的时候,需要重新分配内存。叫结构升级。
8) 跳表 多级索引
四) 思考问题
既然五种用户态的数据结构都有自己的实现方案。那么存储用户态数据的大池子用的是什么数据结构?
如何估算空间?
如何估算存取速度?
mget 是怎么实现的?set如何快速存储大量的数据?
是空间换时间,还是时间换空间?