Redis的5种基础数据结构

string(字符串):

1.字符串是Redis最简单的数据结构,它的内部表示就是一个字符数组。

2.Redis的字符串是动态字符串,是可以修改的字符串,内部结构的实现类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。

3.内部为当前字符串分配的实际空间XXXX一般要高于实际字符串长度XXXX.length。当字符串长度小于1MB时,扩容都是加倍现有的空间。如果字符串长度超过1MB,扩容时一次只会多扩1MB的空间。需要注意的是字符串最大长度为512MB。

4.可以对多个字符串进行批量读写,节省网络耗时开销。

5.可设置过期时间并对值进行自增(自增有范围,范围在signed long的最大值和最小值之间,超出了会报错)。

6.字符串由多个字节组成,每个字节又由8个bit组成,如此便可以将一个字符串看成很多bit的组合,这便是bitmap(位图)数据结构。

 

 

list(列表):

1.Redis的列表相当于Java的LinkedList,注意它是链表而不是数组。这意味着list的插入和删除操作非常快,时间复杂度为O(1),但是索引定位很慢,时间复杂度为O(n)。

2.列表中的每个元素都使用双向指针顺序,串起来可同时支持前向后向遍历。

3.当列表弹出了最后一个元素之后,该数据结构被自动删除,内存被回收。

4.Redis的列表结构常用来做异步队列使用。将需要延后处理的任务结构体序列化成字符串,塞进Redis的列表,另一个线程从这个列表中轮询数据进行处理。

5.队列是先进先出的数据结构,常用于消息排队和异步逻辑处理,它会确保元素的访问顺序性。

6.栈是先进后出的数据结构,跟队列正好相反。拿Redis的列表数据结构来做栈使用的业务场景并不多见。

7.慢操作:lindex相当于Java链表的get(int index)方法,它需要对链表进行遍历,性能随着参数index增大而变差。

8.快速列表:Redis底层存储的不是一个简单的linkedlist,而是称之为“快速链表”(quicklist)的一个结构。首先在列表元素较少的情况下,会使用一块连续的内存存储,这个结构是ziplist,即压缩列表。它将所有的元素彼此紧挨着一起存储,分配的是一块连续的内存。当数量比较多的时候才会改成quicklist。因为普通的链表需要的附加指针空间太大,会浪费空间,还会加重内存的碎片化,比如某普通链表里存的只是int类型的数据,结构上还需要两个额外的指针prev和next。所以Redis将链表和ziplist结合组成了quicklist,也就是将多个ziplist使用双向指针串起来使用。quicklist挤满足了快速的插入删除性能,又不会出现太大的空间冗余。

                   

 

 

hash(字典):

1.Redis的字典相当于Java里面的HashMap,它是无需字典,内部存储了很多键值对,都是“数组+链表”二维结构。第一维hash的数组位置碰撞时,就会将碰撞的元素使用链表串接起来。

2.不同的是,Redis的字典的值只能是字符串,另外它们rehash的方式不一样,因为Java的HashMap在字典很大时,rehash是个耗时的操作,需要一次性全部rehash。Redis为了追求高性能,不能堵塞服务,所以采用了渐进式rehash策略。

3.渐进式rehash会在rehash的同时,保留新旧两个hash结构,查询时会同时查询两个hash结构,然后再后续的定时任务以及hash操作指令中,循序渐进地将旧hash的内容一点点地迁移到新的hash结构中。当搬迁完成了,就会使用新的hash结构取而代之了。

4.当hash移除了最后一个元素之后,该数据结构被自动删除,内存被回收。

5.注意,hash结构的存储消耗要高於单个字符串。

6.同字符串一样,hash结构中的单个子key也可以进行计数,它对应的指令是hincrby,和incr的使用方法基本一样。

 

 

set(集合):

1.Redis的集合相当于Java里面的HashSet,它内部的键值对是无序的、唯一的。他的内部实现相当于一个特殊的字典,字典中所有的value都是一个值NULL。

2.当集合中最后一个元素被移除之后,数据结构被自动删除,内存被回收。

3.用来做涉及到去重的功能很方便。

 

 

zset(有序列表):

1.zset可能是Redis提供的最有特色的数据结构,它类似于Java的SortedSet和HashMap的结合体:一方面它是一个set,保证了内部value的唯一性,另一方面它可以给每个value赋予一个score,代表了这个value的排序权重。它的内部实现用的是一种叫做“跳跃列表”的数据结构。

2.zset中最后一个value被移除之后,数据结构被自动删除,内存被回收。

3.用来做涉及到去重并且需要排序的集合功能很方便.

 

 

容器型数据结构(list、set、hash、zset)的通用规则:

1.如果容器不存在,那就创建一个,再进行操作。

2.如果容器里的元素没有了,那么立即删除容器,释放内存。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章