Redis的数据类型总结

1:String

String有三种编码方式:

int(整数型,直接以RedisObject存储)、

raw(大于等于32位,使用sds进行存储)、内存结构为*ptr指向一个sdshdr,需要申请两次内存,可以修改!)

embstr(小于32位),其中embstr只需要一次内存分配,数据比较小的时候使用,但他是只读的,如果需要修改会变为raw再执行修改

2:List

List的编码方式有ZipList(压缩列表——可类比数组,压缩列表的内存块是连续的,并分配内存的次数一次即可,也就是类似于embstr,内存只分配一次)、Linkedlist(一个双向不循环链表)

当列表对象同时满足以下两个条件时,列表对象使用ziplist进行存储,否则使用linkedlist存储

  1. 列表对象保存的所有字符串元素的长度小于64字节

  2. 列表对象保存的元素数量小于512个

3:Hash

  编码方式有ZipList、HashTable,ziplist编码的哈希对象底层实现是压缩列表,hashtable底层实现是字典,哈希对象中的每个key-value对都使用一个字典键值对来保存。字典键值对即是,字典的键和值都是字符串对象,字典的键保存key-value的key,字典的值保存key-value的value。

4:Set:

使用set增加的时候可以保证去重,比如文章中用户每次点赞的时候不允许重复

  1. 集合对象的编码可以是intset和hashtable之一。从名称就可以知道,IntSet即为整数类集合对象

intset编码的集合对象底层实现是整数集合,所有元素都保存在整数集合中。IntSet底层实现是有序集合,集合对象使用intset编码需要满足两个条件:一是所有元素都是整数值二是元素个数小于等于512个;不满足任意一条都将使用hashtable编码。

intset 使用一个唯一且有序排列的数组来保存元素,在查找时使用二分查找,支持类型升级

hashtable编码的集合对象底层实现是字典,字典的每个键都是一个字符串对象,保存一个集合元素,不同的是字典的值都是NULL;可以参考java中的hashset结构。

5:ZSet

编码方式有 ziplist和skiplist

使用ziplist时保存key-value的键值对,为了保证范围查找和单独查找分值,采用了字典+跳表的形式,字典和跳表共享entry的地址

posted @ 2023-05-24 12:17  B站读研  阅读(14)  评论(0)    收藏  举报