
了解一下Redis API和怎么使用它(下)
作者 | 川石信息
来源 | 今日头条
(四)、列表
列表(list)类型是用来存储多个有序的字符串,如图2-18所示,a、b、c、d、e五个元素从左到右组成了一个有序的列表,列表中的每个字符串称为元素(element),一个列表最多可以存储23的2次方减1个元素。在Redis中,可以对列表两端插入(push)和弹出(pop),还可以获取指定范围的元素列表、获取指定索引下标的元素等。
1.添加操作
2.从左边插入元素
3.向某个元素前或者后插入元素
linsert命令会从列表中找到等于pivot的元素,在其前(before)或者后(after)插入一个新的元素value,例如下面操作会在列表的元素b前插入java:
4.获取指定范围内的元素列表
lrange操作会获取列表指定索引范围所有的元素。索引下标有两个特点:
第一,索引下标从左到右分别是0到N-1,但是从右到左分别是-1到-N。
第二,lrange中的end选项包含了自身,这个和很多编程语言不包含end不太相同,例如想获取列表的第2到第4个元素,可以执行如下操作:
5.获取列表指定索引下标的元素
6.从列表左侧弹出元素
7.从列表右侧弹出
8.删除指定元素
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的元素:
9.按照索引范围修剪列表
例如,下面操作会只保留列表listkey第2个到第4个元素:
10.修改指定索引下标的元素
下面操作会将列表listkey中的第3个元素设置为python:
11.阻塞操作
blpop和brpop是lpop和rpop的阻塞版本,它们除了弹出方向不同,使用方法基本相同,所以下面以brpop命令进行说明,brpop命令包含两个参数:
1. key[key...]:多个列表的键。
2. timeout:阻塞时间(单位:秒)。
列表为空:如果timeout=3,那么客户端要等到3秒后返回,如果timeout=0,那么客户端一直阻塞等下去:
如果此期间添加了数据element1,客户端立即返回:
列表不为空:客户端会立即返回。
在使用brpop时,有两点需要注意。第一点,如果是多个键,那么brpop会从左至右遍历键,一旦有一个键能弹出元素,客户端立即返回:
此时另一个客户端分别向list:2和list:3插入元素:
客户端会立即返回list:2中的element2,因为list:2最先有可以弹出的元素:
第二点,如果多个客户端对同一个键执行brpop,那么最先执行brpop命令的客户端可以获取到弹出的值。
以下场景一般会用到列表:
1.消息队列 Redis的lpush+brpop命令组合即可实现阻塞队列,生产者客户端使用lrpush从列表左侧插入元素,多个消费者客户端使用brpop命令阻塞式的“抢”列表尾部的元素,多个客户端保证了消费的负载均衡和高可用性。
2.文章列表 每个用户有属于自己的文章列表,现需要分页展示文章列表。此时可以考虑使用列表,因为列表不但是有序的,同时支持按照索引范围获取元素。
