Redis数据结构和对象(一)
Redis数据结构和对象(二)
Redis数据结构和对象(三)
Redis数据结构和对象(五)
Redis数据结构和对象(六)
Redis数据结构和对象(七)——对象
一,对象。
- 1,Redis的主要数据结构:简单动态字符串(SDS),双端列表,字典,压缩列表,整数集合,跳跃表等。Redis内包的对象包括以下五种字符串对象,列表对象,哈希对象,集合对象,有序集合对象。这些对象都使用到最少一种的前面介绍的数据结构。
- 2,Redis的对象系统还实现了基于引用计数技术的内存回收机制。
- 3,对象的引用计数还带有对象共享作用。Redis在初始化服务器时就会创建一万个字符串对象。包含了0到9999的所有整数值。当服务器会用到这些整数值时,会直接使用这些共享对象。
- 4,Redis的对象带有访问时间记录信息。采用OBJECT IDLETIME的命令访问对象的lru属性,这个属性记录了对象最后一次被命令程序访问的时间。
二,对象的类型和编码。
- 1,类型。
- 对象类型可以采用TYPE命令。
- 对象的类型:
- 2,编码。
- 对象的编码类型可以采用OBJECT ENCODING命令。
三,字符串对象。
- 1,字符串对象的编码可以是int,raw或embstr。
- a) int编码long类型保存的整数。
- b) embstr编码保存字符串的字符串的长度小于等于39字节。
- c) raw编码保存字符串长度大于39字节。
- 2,embstr编码结构:
- 3,raw编码结构:
- 4,int编码结构:
- 5,raw和embstr编码的区别。
- embstr编码无论是创建字符串对象还是释放内存,都只需1次,而raw编码需要2次。
- embstr编码的字符串对象所有数据都保存在一块连续的内存里面。能够更好地利用缓存带来的优势。
四,列表对象。
- 1,列表对象的编码可以是Ziplist或者是linkedlist。
- 2,ziplist编码结构:
- 3,linkedlist编码结构:
- 4,编码转换,
- 满足以下的两个条件时,列表对象会使用ziplist.
- 1)列表对象保存的所有字符串元素的长度都小于64字节。
- 2)列表对象保存的元素数量小于512.不能满足这两个条件的列表对象需要采用linkedlist编码。
- 满足以下的两个条件时,列表对象会使用ziplist.
五,哈希对象。
- 1,哈希对象的编码可以是ziplist或者hashtable。
- 2,ziplist编码结构:
- 3,hashtable编码结构:
- 4,编码转换:
- 满足一下两个条件,哈希对象使用ziplist编码。
- 1)哈希对象保存的所有键值对的键和值的字符串长度都小于64字节。
- 2)哈希对象保存的键值对数量小于512.不能满足这两个条件的哈希对象需要采用hashtable编码。
- 满足一下两个条件,哈希对象使用ziplist编码。
六,集合对象。
- 1,集合对象的编码可以是inset或者hashtable。
- 2,inset编码结构和hashtable编码结构:
- 3, 编码转换。
- 满足一下两个条件,哈希对象使用inset编码。
- 1)集合对象保存的所有元素都是整数值。
- 2)集合对象保存的键值对数量小于512.不能满足这两个条件的哈希对象需要采用hashtable编码。
- 满足一下两个条件,哈希对象使用inset编码。
七,有序集合对象。
- 1,有序集合对象的编码可以是ziplist或者skiplist。zset结构中dict字典为有序集合创建了一个从成员到分值的映射。zset会同时使用跳跃表和字典来保存有序集合元素。字典可以实现O(1)复杂度查找成员变量。跳跃表具备范围性操作的优点。
- 2,ziplist编码结构:
- 3,skiplist编码结构:
- 4, 编码转换。
- 满足一下两个条件,哈希对象使用ziplist编码。
- 1)有序集合对象保存的所有元素数量小于128个。
- 2)有序集合对象保存的所有元素成员长度都小于64.不能满足这两个条件的哈希对象需要采用skiplist编码。
- 满足一下两个条件,哈希对象使用ziplist编码。