您的位置:首页 > 数据库 > Redis

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

2017-09-21 16:02 302 查看

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

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

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(消息队列)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: