Redis系列-5.列表(List)结构

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hjkl950217/article/details/78053126

Redis系列-5.列表(List)结构

文章中可能有地方描述偏差,欢迎留言指证

1.基本

List是第三种redis结构,在C#中指的是泛型集合,和这里的不太一样。redis里的list更像是数组,而且在使用中也经常会利用它实现队列和栈。

2.常用命令

下面所有描述里 {}都是必需参数,<>是可选参数

添加操作

从右边插入元素
rpush {key} {value} < value >
从左边插入元素
lpush {key} {value} < value>
列表是分方向的,这样才可以实现队列和栈的功能。这个插入是有顺序的。。比如从左边插入123 那遍历之后会发现顺序是321.这个命令可以理解为把这多个参数每次都向左或是向右插入,就不容易搞晕了。
这里写图片描述

查找

lrange {key} {start} {end} 获取范围内的元素
如上面那图,-1是指末尾。
如果是范围查询(end是包括在里面的):
这里写图片描述

lindex {key} {index} 获取指定下标的元素
这里写图片描述

llen {key}获取列表的长度
这里写图片描述

删除(重点)

从列表左侧删除一个
lpop {key}
从列表右侧删除一个
rpop {key}
这两条命令要注意顺序,不然可能你以为你写的是从左删,结果是从右删了。

删除指定的元素
lrem {key} {count} {value}
这条命令会删除列表里值为value的数据,同时删除count个
count>0 从左向右删count个
count<0 从右向左删count个
count=0 删除所有等于value的

按照索引范围修剪元素
ltrim {key} {start} {end}
这条命令只会保留这个范围内的元素,包括开头和结尾的数据。
这里写图片描述
注意:如果键不存在 trim也会返回ok

修改

lset {key} {index} {newValue}
将指定索引的值替换为新值

阻塞(重点)

blpop key < key…> timeout
brpop key < key…> timeout
这两个命令是弹出明亮的阻塞式版本。这个阻塞的意思就是一直等待 直到获取到数据。
timeout是阻塞的时间,0代表一直阻塞,直到可以弹出

1.在阻塞的时间内,如果有数据进来,或是方向上(命令分左右的)有数据可以马上弹出,会马上返回新添加的数据。
2.如果有阻塞多个键,那么redis会从左向右遍历键,只要有一个可以键中有数据可以弹出,会马上返回弹出的键的名字和数据。
3.如果多个客户端对同一个键执行阻塞式弹出操作,第一命令的到达者会最先获取到数据。这时,客户端的发出+网络延迟会导致谁先到达。

3.内部编码

有两种:
ziplist:
内部更加紧凑。
当键的个数小于list-max-ziplist-entries(默认512)的配置时
同时所有值小于listmax-ziplist-value(默认64)的配置时
才会使用ziplist,和哈希结构一样
linkedlist:链表
当不能使用ziplist时,就会使用这个结构,因为不满足上面两个条件时,ziplist的读写效率会降低。

4.适合场景

1.消息队列
lpush+brpop命令的组合可以实现阻塞式队列。生产者从左侧插入,多个客户端在右端“抢”元素2

2.分页
当需要分页时,因列表是有序的,就可以利用按范围获取元素来取得数据。

开发中有许多场景,可以参考以下口诀;
1.lpush+lpop=Stack(栈)
2.lpush+rpop=Queue(队列)
3.lpush+ltrim=Capped Collection(有限集合)
4.lpush+brpop=Message Queue(消息队列)

猜你喜欢

转载自blog.csdn.net/hjkl950217/article/details/78053126
今日推荐