了解一下Redis API和怎么使用它(下)

amang2000
发布于 2022-4-30 19:32
浏览
0收藏

作者 | 川石信息
来源 | 今日头条

(四)、列表

列表(list)类型是用来存储多个有序的字符串,如图2-18所示,a、b、c、d、e五个元素从左到右组成了一个有序的列表,列表中的每个字符串称为元素(element),一个列表最多可以存储23的2次方减1个元素。在Redis中,可以对列表两端插入(push)和弹出(pop),还可以获取指定范围的元素列表、获取指定索引下标的元素等。了解一下Redis API和怎么使用它(下)-鸿蒙开发者社区

1.添加操作

rpush key value [value ...] 
127.0.0. 1:6379> rpush listkey c b a 
(integer) 3
lrange0-1命令可以从左到右获取列表的所有元素:
127.0.0.1:6379> lrange listkey 0 -1 
1) "c" 
2) "b" 
3) "a"

2.从左边插入元素

lpush key value [value ...]

3.向某个元素前或者后插入元素

linsert key before|after pivot value

linsert命令会从列表中找到等于pivot的元素,在其前(before)或者后(after)插入一个新的元素value,例如下面操作会在列表的元素b前插入java:

127.0.0.1:6379> linsert listkey before b java 
(integer) 4

4.获取指定范围内的元素列表

lrange key start end

lrange操作会获取列表指定索引范围所有的元素。索引下标有两个特点:

第一,索引下标从左到右分别是0到N-1,但是从右到左分别是-1到-N。

第二,lrange中的end选项包含了自身,这个和很多编程语言不包含end不太相同,例如想获取列表的第2到第4个元素,可以执行如下操作:

127.0.0.1:6379> lrange listkey 1 3 
1) "java" 
2) "b" 
3) "a"

5.获取列表指定索引下标的元素

llen key 
127.0.0.1:6379> llen listkey 
(integer) 4

6.从列表左侧弹出元素

lpop key 
127.0.0.1:6379>t lpop listkey 
"c" 
127.0.0.1:6379> lrange listkey 0 -1 
1) "java" 
2) "b" 
3) "a"

7.从列表右侧弹出

rpop key

8.删除指定元素

lrem key count value 

lrem命令会从列表中找到等于value的元素进行删除,根据count的不同分为三种情况:

1. count>0,从左到右,删除最多count个元素。

2. count<0,从右到左,删除最多count绝对值个元素。

3. count=0,删除所有。

例如向列表从左向右插入5个a,那么当前列表变为“a a a a a java b a”,下面操作将从列表左边开始删除4个为a的元素:

127.0.0.1:6379> lrem listkey 4 a 
(integer) 4 
127.0.0.1:6379> lrange listkey 0 -1 
1) "a" 
2) "java" 
3) "b" 
4) "a"

9.按照索引范围修剪列表

ltrim key start end

例如,下面操作会只保留列表listkey第2个到第4个元素:

127.0.0.1:6379> ltrim listkey 1 3 
OK
127.0.0.1:6379> lrange listkey 0 -1 
1) "java" 
2) "b" 
3) "a"

10.修改指定索引下标的元素

lset key index newValue 

下面操作会将列表listkey中的第3个元素设置为python:

127.0.0.1:6379> lset listkey 2 python 
OK
127.0.0.1:6379> lrange listkey 0 -1 
1) "java" 
2) "b" 
3) "python"

11.阻塞操作

blpop key [key ...] timeout 
brpop key [key ...] timeout

blpop和brpop是lpop和rpop的阻塞版本,它们除了弹出方向不同,使用方法基本相同,所以下面以brpop命令进行说明,brpop命令包含两个参数:

1. key[key...]:多个列表的键。

2. timeout:阻塞时间(单位:秒)。

列表为空:如果timeout=3,那么客户端要等到3秒后返回,如果timeout=0,那么客户端一直阻塞等下去:

127.0.0.1:6379> brpop list:test 3 
(nil) 
(3.10s) 
127.0.0.1:6379> brpop list:test 0 
...阻塞...

如果此期间添加了数据element1,客户端立即返回:

127.0.0.1:6379> brpop list:test 3 
1) "list:test" 
2) "element1" 
(2.06s)

列表不为空:客户端会立即返回。

127.0.0.1:6379> brpop list:test 0 
1) "list:test" 
2) "element1"

在使用brpop时,有两点需要注意。第一点,如果是多个键,那么brpop会从左至右遍历键,一旦有一个键能弹出元素,客户端立即返回:

127.0.0.1:6379> brpop list:1 list:2 list:3 0 
..阻塞..

此时另一个客户端分别向list:2和list:3插入元素:

client-lpush> lpush list:2 element2 
(integer) 1 
client-lpush> lpush list:3 element3 
(integer) 1

客户端会立即返回list:2中的element2,因为list:2最先有可以弹出的元素:

127.0.0.1:6379> brpop list:1 list:2 list:3 0 
1) "list:2" 
2) "element2_1"

第二点,如果多个客户端对同一个键执行brpop,那么最先执行brpop命令的客户端可以获取到弹出的值。了解一下Redis API和怎么使用它(下)-鸿蒙开发者社区

以下场景一般会用到列表:

1.消息队列 Redis的lpush+brpop命令组合即可实现阻塞队列,生产者客户端使用lrpush从列表左侧插入元素,多个消费者客户端使用brpop命令阻塞式的“抢”列表尾部的元素,多个客户端保证了消费的负载均衡和高可用性。

2.文章列表 每个用户有属于自己的文章列表,现需要分页展示文章列表。此时可以考虑使用列表,因为列表不但是有序的,同时支持按照索引范围获取元素。

标签
收藏
回复
举报
回复
    相关推荐