Redis-API理解和使用-列表(list)

列表(list) 类型是用来存储多个有序的字符串, 如图2-18所示, a、b、 c、 d、 e五个元素从左到右组成了一个有序的列表, 列表中的每个字符串称为元素(element) , 一个列表最多可以存储232-1个元素。 在Redis中, 可以对列表两端插入(push) 和弹出(pop) , 还可以获取指定范围的元素列表、 获取指定索引下标的元素等(如图2-18和图2-19所示) 。 列表是一种比较灵活的数据结构, 它可以充当栈和队列的角色, 在实际开发上有很多应用场景。

列表类型有两个特点:

第一、 列表中的元素是有序的
第二、 列表中的元素可以是重复的

1 命令

1.添加操作
(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, 代表当前命令的长度, 当前列表变为:

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

2.查找
(1) 获取指定范围内的元素列表
lrange key start end
第一, 索引下标从左到右分别是0到N-1, 但是从右到左分别是-1到-N。
第二, lrange中的end选项包含了自身

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

(2) 获取列表指定索引下标的元素
lindex key index
例如当前列表最后一个元素为a:

127.0.0.1:6379> lindex listkey -1
"a"

(3) 获取列表长度
llen key
例如, 下面示例当前列表长度为4:

127.0.0.1:6379> llen listkey
(integer) 4

3.删除
(1) 从列表左侧弹出元素
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"

(2) 从列表右侧弹出
rpop key
(3) 删除指定元素
lrem key count value
lrem命令会从列表中找到等于value的元素进行删除, 根据count的不同
分为三种情况:
·count>0, 从左到右, 删除最多count个元素。
·count<0, 从右到左, 删除最多count绝对值个元素。
·count=0, 删除所有。

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"

(4) 按照索引范围修剪列表
ltrim key start end

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"

4.修改
修改指定索引下标的元素:
lset key index newValue

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"

5.阻塞操作
阻塞式弹出如下:
blpop key [key ...] timeout
brpop key [key ...] timeout
1) 列表为空: 如果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)

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

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

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

2 内部编码

列表类型的内部编码有两种。
·ziplist(压缩列表) : 当列表的元素个数小于list-max-ziplist-entries配置(默认512个) , 同时列表中每个元素的值都小于list-max-ziplist-value配置时(默认64字节) , Redis会选用ziplist来作为列表的内部实现来减少内存的使用。
·linkedlist(链表) : 当列表类型无法满足ziplist的条件时, Redis会使用linkedlist作为列表的内部实现。
1) 当元素个数较少且没有大元素时, 内部编码为ziplist:

127.0.0.1:6379> rpush listkey e1 e2 e3
(integer) 3
127.0.0.1:6379> object encoding listkey
"ziplist"

2.1) 当元素个数超过512个, 内部编码变为linkedlist:

127.0.0.1:6379> rpush listkey e4 e5 ...忽略... e512 e513
(integer) 513
127.0.0.1:6379> object encoding listkey
"linkedlist"

2.2) 或者当某个元素超过64字节, 内部编码也会变为linkedlist:

127.0.0.1:6379> rpush listkey "one string is bigger than 64 byte...............
................."
(integer) 4
127.0.0.1:6379> object encoding listkey
"linkedlist"

开发提示
Redis3.2版本提供了quicklist内部编码, 简单地说它是以一个ziplist为节点的linkedlist, 它结合了ziplist和linkedlist两者的优势, 为列表类型提供了一种更为优秀的内部编码实现, 它的设计原理可以参考Redis的另一个作者
Matt Stancliff的博客: https://matt.sh/redis-quicklist。

3 使用场景

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

2.文章列表
每个用户有属于自己的文章列表, 现需要分页展示文章列表。 此时可以考虑使用列表, 因为列表不但是有序的, 同时支持按照索引范围获取元素。
开发提示
实际上列表的使用场景很多, 在选择时可以参考以下口诀:
·lpush+lpop=Stack(栈)
·lpush+rpop=Queue(队列)
·lpsh+ltrim=Capped Collection(有限集合)
·lpush+brpop=Message Queue(消息队列)


备注:文章参考《Redis开发与运维》,作者:付磊,张益军

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值