本篇内容介绍了“Redis列表List慢操作”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
Redis的列表是一个双链结构,跟java里面的LinkedList一样,对于链表插入数据非常快时间复杂度为O(1),但是查询需要遍历这个链表时间复杂度为O(n),对于双链表来说既可以从头到尾遍历也可以从尾遍历的双向遍历,这个结构有点跟我们的队列和栈非常相似,该结构常用来做异步队列,将需要延后处理的任务结构体序列化成字符串,放入Redis列表,另一个线程从这个列表中轮询进行处理当然,我们的列表也提供这样的操作,下面我们来试试常见的的命令操作。
列表是一个先进先出的数据结构,常用于消息队列和异步逻辑处理,它会确保元素的访问顺序性
>rpush name hello world(integer)2>llen name(integer)2>lpop name"hello">lpop name"world">lpop name(nil)
栈是先进后出的数据结构,跟队列遍历顺序相反,我们常见的羽毛球桶
>rpush name hello world(integer)2>rpop name"world">rpop name"hello"
lindex是对整个list进行遍历跟java里面的链表的get(int index)方法一样,根据index获取当前位置的值,随着index值越大性能越差,执行时间效率为O(n)。
ltrim这个命令有两个参数获取一段区间范围列表,ltrim命令会清理这个范围外的元素,我们通过这个命令来获取定长的列表
lrange返回列表中指定区间内的元素,与ltrim不同的是ltrim是直接截取某个区间的数据,lrange是返回某个区间的数据
注意:index参数是可以为负数的,如果为-1那么就获取倒数第一个元素,-2就是倒数第二个元素以此类推,有点像约瑟夫环
如果ltrim name 1 0意味着这个获取的区间没有元素,那么将清空整个列表
>rpush name hello world i am mango
(integer)5
>lindex name 1
"world"
>lindex name -1
"mango"
>ltrim name 0 1
OK
>lrange name 0 1
"hello"
"world"
>ltrim name 1 0
OK
>llen name
(integer)0
我们思考一个问题,如果list的结构是一个对象类型,每一个对象保存上一个元素地址和下一个元素地址每块地址都在不同磁盘空间内,每个对象都保留一个指针,在搜索的时候我们势必需要每次来回扫描磁盘,这个开销是非常大的,而且在列表回收的时候整理磁盘碎片会变得非常麻烦,那么咱们可以想象,如果我们的对象是保存在连续空间内,每次查询下一个指针的时候是不是就非常快速找到该元素,不需要来回扫盘,在回收的时候,我们只需要对这块内存标记回收即减少磁盘碎片的整理。
其实redis也是做了这样的优化,在这里我们称之为快速链表(quicklist)的结构,如果列表元素较少的情况下,会使用一个连续的内存存储叫ziplist即压缩列表,当数据量比较大是ziplist会转换成quicklist。Redis将链表和ziplist结合起来组成quicklist,也就是讲ziplist使用双向指针串起来使用,quicklist既满足快速插入删除性能,又不会出现太大的空间冗余。关于list的底层原理在今后的文章中会提出来
“Redis列表List慢操作”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。