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"

List慢操作

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 1OK>lrange name 0 1"hello""world">ltrim name 1 0OK>llen name(integer)0

快速列表

我们思考一个问题,如果list的结构是一个对象类型,每一个对象保存上一个元素地址和下一个元素地址每块地址都在不同磁盘空间内,每个对象都保留一个指针,在搜索的时候我们势必需要每次来回扫描磁盘,这个开销是非常大的,而且在列表回收的时候整理磁盘碎片会变得非常麻烦,那么咱们可以想象,如果我们的对象是保存在连续空间内,每次查询下一个指针的时候是不是就非常快速找到该元素,不需要来回扫盘,在回收的时候,我们只需要对这块内存标记回收即减少磁盘碎片的整理。

其实redis也是做了这样的优化,在这里我们称之为快速链表(quicklist)的结构,如果列表元素较少的情况下,会使用一个连续的内存存储叫ziplist即压缩列表,当数据量比较大是ziplist会转换成quicklist。Redis将链表和ziplist结合起来组成quicklist,也就是讲ziplist使用双向指针串起来使用,quicklist既满足快速插入删除性能,又不会出现太大的空间冗余。关于list的底层原理在今后的文章中会提出来

 

一名正在抢救的coder

笔名:mangolove

CSDN地址:https://blog.csdn.net/mango_love

GitHub地址:https://github.com/mangoloveYu

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redislist常用命令包括LPUSH、RPUSH、LPOP、RPOP、LINSERT、LREM、LTRIM、BLPOP、BRPOP、BRPOPLPUSH和LRANGE。LPUSH命令用于将元素从列表的左端推入,RPUSH命令用于将元素从列表的右端推入。LPOP命令用于从列表的左端弹出元素,RPOP命令用于从列表的右端弹出元素。LINSERT命令用于将新元素插入到列表中已有元素的前面或后面。LREM命令用于从列表中移除指定的元素。LTRIM命令用于修剪列表,即保留指定范围内的元素,其它元素将被删除。BLPOP、BRPOP和BRPOPLPUSH是阻塞版本的弹出和推入命令,它们会阻塞执行命令的客户端,直到某个给定列表非空或超过给定的阻塞时限。LRANGE命令用于获取列表中的某一片段,返回索引范围内的所有元素。 #### 引用[.reference_title] - *1* *2* [Redis 基础 -- 列表 List 类型 和 List 类型的常用命令](https://blog.csdn.net/I_r_o_n_M_a_n/article/details/124543459)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Redis list常用命令](https://blog.csdn.net/jungeCSND/article/details/125099951)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值