Redis的五种数据结构
String
底层数据结构有int,SDS(raw,embstr)分别为整型与动态字符串,动态字符串内有预留空间,拼接不用每次扩展空间。
可以做缓存序列化的对象如JSON,计数
Hash
底层HashTable与ziplist,字典底层也是HashTable,hashtable中计算出hash值得到在哪一个数组后,还要通过sizemask 属性和哈希值再次得到数组下标,冲突解决链地址法。
rehash,有两个地址ht0 ht1,当rehash时将ht0的内容移到ht1上然后ht1改为ht0并重新创建ht1。
渐进式rehash,ht0,同时操作更新、删除、查询,新增就在ht1中,更新二者同时,删除如果ht1没有则只删ht0,如此ht0只减不增,等变为空表rehash完成。
ziplist是特殊的linkedlist,因为linkedlist内存是不连续的通过双向指针相连,而ziplist内存相连,当中含有ziplist占用大小、尾地址偏移量、节点个数、节点、链表结束标志,每个节点中含前一个节点长度、当前节点类型与大小、节点内容。
Hash结构可用来缓存用户信息,key为id value为信息(value也为hash性能更高)。
Set
底层是value为空的Hash
也可能是有序集合intset长度又16 32 64升级不降级
可用做用户关注集合,当要知道用户是否关注某个其他用户时判断对象是否存在。
ZSet
有序集合,按照score升序排序,值不可以重复,score可以重复,对象唯一,skiplist与hash,hash关联socre与value。
skiplist是一种加快链表查询速度的数据结构,通过建立索引的方式实现快速查找,如底层10个数据,上层5个,在上层2个,在上1个,底层的元素存在于上层索引。
可用用在文章按阅读量排序。
List
ziplist与linkedlist,3.2后又quicklist,双向链表,内容较少时使用ziplist,长时使用linkedlist,quicklist时二者的结合,是一个通过指针连接的ziplist的linkedlist。
可用做消息队列,队尾进队头出。