文章目录
- 前言
- Redis 官方完整的命令行文档
- 本文实验 Redis 版本为3.2.100
- Redis 列表类型简介
- 常用命令行
- 基本操作
- RPUSH key value [···] 以右为首 将一(多)个元素推入队首
- LPUSH key value [···] 以左为首 将一(多)个元素推入队首
- LRANGE key start end 返回列表中偏移量自start至end的元素
- RPOP key 以右为首 移除并返回列表队首元素
- LPOP key 以左为首 移除并返回列表队首元素
- LINDEX key offset 以左为首 返回列表中偏移量为offset的元素
- LTRIM key start end 以左为首,修剪列表保留start到end区间的元素
- LSET key index value 以左为首,将元素指定偏移量的值进行替换
- RPOPLPUSH source-key dest-key 从源列表右侧队首弹出元素推入目标列表左端队首
- 阻塞式命令
- 线程安全
前言
体能状态先于精神状态,习惯先于决心,聚焦先于喜好。
Redis 官方完整的命令行文档
https://redis.io/commands
本文实验 Redis 版本为3.2.100
在Redis 2.6版本及之前,有些命令是不被支持的,建议读者安装2.6之后的版本。
命令行中 key 表示 key的name,在实际使用中对应 key的名字。
[] 表示被其包括的命令可有可无。
命令行中 value 存储的值 。
对于增、减操作,key不存在于 Redis 时,默认创建一个value为 0 的 key。
append 命令,key不存在于 Redis 时,默认创建一个空串。
Redis 计数默认从左开始,以0为基数。
Redis 命令行中空为 (nil)
弹出:即从列表中返回该元素,并从列表中删除该元素
Redis 列表类型简介
Redis 列表是对链表结构的支持
Redis 列表用以存储有序的字符串,字符串可以重复
Redis 支持对列表的两端进行操作,新增或者删除元素
Redis支持对列表中某一个序数的元素进行操作——序数需合法
Redis支持对列表中指定序数区间的元素的集中获取
Redis列表无法存储null值,“null”字符串是可以的
Redis支持用阻塞的方式经过有限时长等待获取列表即将新增的元素-Redis 列表可以用于实现消息传送和任务队列(task queue)
列表的左右-将列表自上向下罗列,上就是所谓的左,下就是所谓的右,也可以叫队首为左,队尾为右
列表可以认为是一般数据结构中的list
常用命令行
基本操作
RPUSH key value [···] 以右为首 将一(多)个元素推入队首
以右为队首,新元素放到队尾
127.0.0.1:6379> rpush rlist 001 002 003
(integer) 3
127.0.0.1:6379> lrange rlist 0 100
1) "001"
2) "002"
3) "003"
LPUSH key value [···] 以左为首 将一(多)个元素推入队首
以左为队首,新元素放到队首
127.0.0.1:6379> lpush llist 001 002 003
(integer) 3
127.0.0.1:6379> lrange llist 0 100
- “003”
- “002”
- “001”
LRANGE key start end 返回列表中偏移量自start至end的元素
以左为队首,队首为0开始
包含 start和end对应的元素
查看 上面两个命令行的案例
RPOP key 以右为首 移除并返回列表队首元素
127.0.0.1:6379> lrange llist 0 100
1) "003"
2) "002"
3) "001"
127.0.0.1:6379> rpop llist
"001"
127.0.0.1:6379> lrange llist 0 100
1) "003"
2) "002"
LPOP key 以左为首 移除并返回列表队首元素
127.0.0.1:6379> lrange rlist 0 100
1) "100"
2) "200"
3) "300"
127.0.0.1:6379> lpop rlist
"100"
127.0.0.1:6379> lrange rlist 0 100
1) "200"
2) "300"
LINDEX key offset 以左为首 返回列表中偏移量为offset的元素
从左端计数,以0为第一个数
127.0.0.1:6379> lrange rlist 0 100
1) "200"
2) "300"
127.0.0.1:6379> lindex rlist 0
"200"
LTRIM key start end 以左为首,修剪列表保留start到end区间的元素
从左端计数,以0开始
包含 start和end对应的元素
127.0.0.1:6379> lrange rlist 0 100
1) "200"
2) "300"
127.0.0.1:6379> ltrim rlist 1 1
OK
127.0.0.1:6379> lrange rlist 0 100
1) "300"
LSET key index value 以左为首,将元素指定偏移量的值进行替换
从左开始计数,以0开始
127.0.0.1:6379> lrange rlist 0 100
1) "300"
127.0.0.1:6379> lset rlist 0 400
OK
127.0.0.1:6379> lrange rlist 0 100
1) "400"
RPOPLPUSH source-key dest-key 从源列表右侧队首弹出元素推入目标列表左端队首
source-key 源列表
dest-key 目标列表
用于在两个列表之间移动元素
一次只能剪切一个元素
127.0.0.1:6379> lpush llista 100 200 300
(integer) 3
127.0.0.1:6379> lrange llista 0 100
1) "300"
2) "200"
3) "100"
127.0.0.1:6379> rpoplpush llista llistb
"100"
127.0.0.1:6379> rpoplpush llista llistb
"200"
127.0.0.1:6379> lrange llistb 0 100
1) "200"
2) "100"
127.0.0.1:6379> lrange llista 0 100
1) "300"
127.0.0.1:6379>
阻塞式命令
block 阻塞,阻塞式命令以b开头
BLPOP key[···] timeout 如果有元素则从左侧弹出,无可弹元素阻塞等待n秒
如果列表左侧有元素,则立即弹出元素,该元素将从列表去除
如果没有元素,则等待n秒,n秒内有新元素加入则弹出
如果超时没有元素弹出,则返回 (nil)
允许使用多个列表,多个列表按照先后顺序,只要有一个元素存在就弹出并停止
127.0.0.1:6379> lpush list 100 200 300
(integer) 3
127.0.0.1:6379> blpop list 3
1) "list"
2) "300"
127.0.0.1:6379> blpop list 10
1) "list"
2) "200"
127.0.0.1:6379> blpop list 10
1) "list"
2) "100"
127.0.0.1:6379> blpop list 3
(nil)
(3.09s)
BRPOP key[···] timeout 如果有元素则从右侧弹出,无可弹元素阻塞等待n秒
如果列表右侧有元素,则立即弹出元素,该元素将从列表去除
如果没有元素,则等待n秒,n秒内有新元素加入则弹出
如果超时没有元素弹出,则返回 (nil)
允许使用多个列表,多个列表按照先后顺序,只要有一个元素存在就弹出并停止
127.0.0.1:6379> lpush list 100 200 300
(integer) 3
127.0.0.1:6379> brpop list 3
1) "list"
2) "100"
127.0.0.1:6379> brpop list 3
1) "list"
2) "200"
127.0.0.1:6379> brpop list 3
1) "list"
2) "300"
127.0.0.1:6379> brpop list 3
(nil)
(3.04s)
BRPOPLPUSH source-key dest-key timeout 从源列表右侧弹出推入目标列表左端,如果无可弹元素则阻塞n秒等待
source-key 源列表
dest-key 目标列表
用于在两个列表之间移动元素
参考 RPOPLPUSH source-key dest-key 比对,该命令增加了阻塞逻辑
127.0.0.1:6379> brpoplpush lista listb 3
"300"
127.0.0.1:6379> brpoplpush lista listb 3
(nil)
(3.02s)
线程安全
多线程模式下,RPUSH 并不是线程安全的。
http://redisdoc.com/list/rpoplpush.html