1:String
String有三种编码方式:
int(整数型,直接以RedisObject存储)、
raw(大于等于32位,使用sds进行存储)、内存结构为*ptr指向一个sdshdr,需要申请两次内存,可以修改!)
embstr(小于32位),其中embstr只需要一次内存分配,数据比较小的时候使用,但他是只读的,如果需要修改会变为raw再执行修改
2:List
List的编码方式有ZipList(压缩列表——可类比数组,压缩列表的内存块是连续的,并分配内存的次数一次即可,也就是类似于embstr,内存只分配一次)、Linkedlist(一个双向不循环链表)
当列表对象同时满足以下两个条件时,列表对象使用ziplist进行存储,否则使用linkedlist存储
-
列表对象保存的所有字符串元素的长度小于64字节
-
列表对象保存的元素数量小于512个
3:Hash
编码方式有ZipList、HashTable,ziplist编码的哈希对象底层实现是压缩列表,hashtable底层实现是字典,哈希对象中的每个key-value对都使用一个字典键值对来保存。字典键值对即是,字典的键和值都是字符串对象,字典的键保存key-value的key,字典的值保存key-value的value。
4:Set:
使用set增加的时候可以保证去重,比如文章中用户每次点赞的时候不允许重复
-
集合对象的编码可以是intset和hashtable之一。从名称就可以知道,IntSet即为整数类集合对象
intset编码的集合对象底层实现是整数集合,所有元素都保存在整数集合中。IntSet底层实现是有序集合,集合对象使用intset编码需要满足两个条件:一是所有元素都是整数值;二是元素个数小于等于512个;不满足任意一条都将使用hashtable编码。
intset 使用一个唯一且有序排列的数组来保存元素,在查找时使用二分查找,支持类型升级
hashtable编码的集合对象底层实现是字典,字典的每个键都是一个字符串对象,保存一个集合元素,不同的是字典的值都是NULL;可以参考java中的hashset结构。
5:ZSet
编码方式有 ziplist和skiplist
使用ziplist时保存key-value的键值对,为了保证范围查找和单独查找分值,采用了字典+跳表的形式,字典和跳表共享entry的地址
标签:总结,对象,数据类型,Redis,value,列表,key,集合,字典 From: https://www.cnblogs.com/studyConfig/p/17427942.html