1. 9IM首页
  2. 热点

谈谈对Redis中List,Set,ZSet的理解

对Redis中List的理解

在Redis中,存储的value可以是一个列表List,跟Java中的LinkedList很像,底层数据结构是一个链表,插入和删除很快,随机访问较慢,时间复杂度是O(N)。Java中的列表数据进行缓存时一般是序列化成JSON,以字符串的形式存储在Redis上,而不是使用Redis中的List来进行存储。Redis中的List可以作为一个队列来使用,也可以作为一个栈来使用。在实际使用中,常用来做异步队列使用,将可以延时处理的任务序列化成字符串塞进Redis的列表,另外一个线程从列表中轮询数据进行处理

quicklist

老版本中的Redis,元素较少时,使用ziplist来作为底层编码,元素较多时使用双向链表linkedList作为底层编码。因为链表每个节点需要prev,next指针,需要占用16字节,而且每个节点内存都是单独分配,加剧内存碎片化,所以新版本使用quiklist作为底层编码,quicklist的是一个双向链表,但是它的每一个节点是一个ziplist。(默认每个ziplist最大长度为8k字节)

对Redis中Set的理解

Set是一个无序的,不重复的字符串集合,底层编码有inset和hashtable两种。

inset

当元素都为整数,且元素个数较少时会使用inset作为底层编码,inset结构中的有一个contents属性,content是是一个整数数组,从小到大保存了所有元素。

hashtable

当元素个数较多时,Set使用hashtable来保存元素,元素的值作为key,value都是NULL。

对Redis中有序集合ZSet的理解

Zset与Set的区别在于每一个元素都有一个Score属性,并且存储时会将元素按照Score从低到高排列。底层是通过跳跃表实现的。

ziplist

当元素较少时,ZSet的底层编码使用ziplist实现,所有元素按照Score从低到高排序。

skiplist+dict

当元素较多时,使用skiplist+dict来实现, skiplist存储元素的值和Score,并且将所有元素按照分值有序排列。便于以O(logN)的时间复杂度插入,删除,更新,及根据Score进行范围性查找。

dict存储元素的值和Score的映射关系,便于以O(1)的时间复杂度查找元素对应的分值。

原创文章,作者:9IM,如若转载,请注明出处:https://www.9im.cn/647.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注