Redis 数据存储初识

来源:公司征哥分享

初识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;

扫描二维码关注公众号,回复: 4938311 查看本文章

} 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如何快速存储大量的数据?

是空间换时间,还是时间换空间?

猜你喜欢

转载自blog.csdn.net/weixin_41485592/article/details/86026259