Redis数据结构、底层数据结构及使用场景

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。

可用做消息队列,队尾进队头出。


版权声明:本文为weixin_45875621原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。