Redis 基础数据结构

5种基础数据结构: string(字符串), list(列表) , set(集合), hash(哈希), zset(有序集合)。

Redis所有的数据结构都是唯一的 key字符串作为名称,然后通过这个唯一key值来获取相应的value数据。

不同类型的数据结构的差异就在于value的结构不一样。

String(字符串)

Redis的字符串是动态字符串,可以修改的字符串,内部结构实现上类似于Java的ArrayList,采用预分配冗余空间的方式

来减少内存的频繁分配。 需要注意: 字符串最大长度为 512M

键值对

批量键值对

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

过期和 set命令扩展

可以对key 设置过期时间,到点自动删除,这个功能常用来控制缓存的失效时间。

不过这个【自动删除】机制比较复杂,之后会详细探讨。

 计数

如果value值是一个整数,还可以对它进行自增操作。自增是有范围的,它的范围是

signed long 的最大最小值,超过了这个值,Redis会报错。

 

 字符串是由多个字节组成,每个字节又是由8个bit组成,如此便可以将一个字符串看成

很多bit的组合,这便是bitmap[位图] 数据结构(后面会详细探讨。)

list(列表)

Redis的列表相当于Java语言里面的 LinkedList,注意它是链表而不是数组。这意味着

list的插入和删除操作非常快,时间复杂度为O(1),但是索引定位很慢,时间复杂度为O(n),这点让人非常意外。

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

Redis的列表结构常用来做异步队列使用。将需要延后的任务结构体序列化成字符串塞进

Redis的列表,另一个线程从这个列表中轮询数据进行处理。 (讲道理,真正会选择MQ处理)

右边进左边出:队列

右边进右边出: 栈

慢操作

lindex相当于Java链表的 get(int index)方法,他需要对链表进行遍历,性能随着参数index

增大而变差。ltrim 和字面上的含义不太一样,个人觉得它叫 lretain(保留) 更适合一些,因为

ltrim 跟的两个参数 start_indexend_index 定义了一个区间,在这个区间内的值,ltrim要保留,区间之外

统统砍掉。我们可以通过ltrim来实现一个定长的链表,这一点非常有用。index可以为复数,index=-1表示倒数

第一个元素,同样index=-2表示倒数第二个元素。

快速列表

 如果再深入一点,会发现 Redis底层存储的还不是一个简单的linkedlist, 而是称之为快速链表 quicklist的一个结构。

首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是 ziplist,也即是压缩列表。它将所有的元素紧挨着

一起存储,分配的是一块连续的内存。当数据量比较多的时候才会改成quicklist。因为普通的链表需要的附加指针

空间太大,会比较浪费空间,而且会加重内存的碎片化。比如 这个列表里存的只是int类型的数据

 

原文地址:https://www.cnblogs.com/s686zhou/p/13029293.html