大家好 我是积极向上的湘锅锅
Redis 数据结构SDS,Intset,Dict,Ziplist,Quicklist详解
typedef struct redisObject
{
unsigned type:4;
unsigned encoding:4;
unsigned lru:REDIS_LRU_BITS;
/* lru time (relative to server.lruclock) */
int refcount;
void *ptr;
} robj;
如图
如图
总结:
可以看到Redis在string类型所做的优化已经十分完善,根据数据类型,数据大小采用不同的编码方式,以此来节省空间,提高效率
Redis的List类型可以从首,尾操作列表中的元素
在3.2版本之前,Redis的List采用ZipList和LinkedList来实现
在3.2版本之后,Redis的List底层是统一采用QuickList来实现
Set是Redis中的集合,不一定确保元素有序,可以满足元素唯一,查询效率要求极高
Redis中的ZSet满足键值存储,键唯一,可排序
所以ZSet采用俩种编码结构
整个zset结构如下,没有什么是加一层解决不了的
整个ZSet就显得比较庞大,也比较容易看出来是非常消耗内存的
当元素不多的时候,用HT和SkipList那就很浪费内存那有没有不浪费内存的编码结构有的,那就是ZipList
但是需要满足俩个条件
问题来了,ZipList也可以满足ZSet的特性?
这就不得不感叹大佬的设计思想
其实Hash跟Zset只有一点区别,就是是否是排序,那就直接去掉SkipList
那整个编码就是HT+ZipList