redis的五种基础数据类型: stirng 、list 、hash 、set 、sorted set
对象的结构
1. string 字符串对象的编码可以是int、raw或者embstr
2.list 列表对象的编码可以是ziplist或者linkedlist
列表对象保存的所有字符串元素的长度都小于64字节;
列表对象保存的元素数量小于512个;不能满足这两个条件的列表对象需要使用linkedlist编码
3. hash 哈希对象的编码可以是ziplist或者hashtable(字典)
❑哈希对象保存的所有键值对的键和值的字符串长度都小于64字节;
❑哈希对象保存的键值对数量小于512个;不能满足这两个条件的哈希对象需要使用hashtable编码
4. set 集合对象的编码可以是intset或者hashtable
❑集合对象保存的所有元素都是整数值;
❑集合对象保存的元素数量不超过512个
5. sorted set 有序集合的编码可以是ziplist或者zset (skiplist + hashtable)
❑有序集合保存的元素数量小于128个;
❑有序集合保存的所有元素成员的长度都小于64字节
为什么有序集合需要同时使用跳跃表和字典来实现?
如果我们只使用字典来实现有序集合,那么虽然以O(1)复杂度查找成员的分值这一特性会被保留,但是,因为字典以无序的方式来保存集合元素,所以每次在执行范围型操作——比如ZRANK、ZRANGE等命令时,程序都需要对字典保存的所有元素进行排序
如果我们只使用跳跃表来实现有序集合,那么跳跃表执行范围型操作的所有优点都会被保留,但因为没有了字典,所以根据成员查找分值这一操作的复杂度将从O(1)上升为O(logN)
虽然zset结构同时使用跳跃表和字典来保存有序集合元素,但这两种数据结构都会通过指针来共享相同元素的成员和分值,所以同时使用跳跃表和字典来保存集合元素不会产生任何重复成员或者分值,也不会因此而浪费额外的内存
❑Redis的对象系统带有引用计数实现的内存回收机制,当一个对象不再被使用时,该对象所占用的内存就会被自动释放。
❑Redis会共享值为0到9999的字符串对象