Redis的列表(List)使用

80 阅读5分钟

来自文章集合:一文带你搞懂redis使用过程(持续更新中)

列表(List)

Redis中的List是一个按照插入顺序排序的字符串元素集合,它可以包含重复的元素,而且可以在列表的两端插入元素。

场景

  • 消息队列:使用Redis的List实现一个简单的消息队列,将消息推送到列表的一段,然后从另一端消费这些消息
  • 最新消息排行榜:在社交媒体网站中,使用列表存储最新发布的状态更新,或者最新发布的帖子并且只保留最新的N个状态更新。
  • 任务队列:将需要执行的任务添加到列表中,然后工作线程可以从列表中弹出任务进行处理。
  • 历史数据记录:记录某个用户执行的操作历史记录,比如浏览历史等
  • 最新联系人列表:存储每个用户的最近联系人列表,使得用户可以快速查看和访问最新联系的人

用法示例

//  将一个或多个值插入到列表头部(无key则创建):LPUSH <key_name> <value> [value...]
127.0.0.1:6379> LPUSH redis_list_1 redis_list
(integer) 1
127.0.0.1:6379> LPUSH redis_list_1 redis_set redis_string
(integer) 3


//  范围查询列表:LRANGE <key_name> <start_index> <end_index> 
127.0.0.1:6379> LRANGE redis_list_1 0 10
1) "redis_string"
2) "redis_set"
3) "redis_list"
127.0.0.1:6379> LRANGE redis_list_1 0 -1
1) "redis_string"
2) "redis_set"
3) "redis_list"
127.0.0.1:6379> LRANGE redis_list_1 0 -2
1) "redis_string"
2) "redis_set"

//  查询列表大小:LLEN <key_name>
127.0.0.1:6379> LLEN redis_list_1
(integer) 3

//  根据索引查询列表中的元素:LINDEX <key_name> <index>
127.0.0.1:6379> LRANGE redis_list_1 0 -1
1) "redis_sortset"
2) "redis_hash"
3) "redis_string"
4) "redis_set"
5) "redis_list"
127.0.0.1:6379> LINDEX redis_list_1 0
"redis_sortset"
127.0.0.1:6379> LINDEX redis_list_1 2
"redis_string"

//  移除列表的第一个(顶端)元素:LPOP <key_name>
127.0.0.1:6379> LPOP redis_list_1
"redis_sortset"
127.0.0.1:6379> LRANGE redis_list_1 0 -1
1) "redis_hash"
2) "redis_string"
3) "redis_set"
4) "redis_list"

//  将一个或多个值插入到列表头部(无key则返回0):LPUSHX <key_name> <value> [value...]
127.0.0.1:6379> keys *
1) "redis_list_1"
127.0.0.1:6379> LPUSHX redis_list_2 redis_1 redis_2
(integer) 0

// 指定更新索引对应的值,所以不能大于列表最大索引:LSET <key_name> <index> <key_value>
127.0.0.1:6379> LRANGE redis_list_1 0 -1
1) "redis_hash"
2) "redis_string"
3) "redis_set"
4) "redis_list"
127.0.0.1:6379> LSET redis_list_1 4 redis_insert
(error) ERR index out of range
127.0.0.1:6379> LSET redis_list_1 2 redis_insert
OK
127.0.0.1:6379> LRANGE redis_list_1 0 -1
1) "redis_hash"
2) "redis_string"
3) "redis_insert"
4) "redis_list"

//  将一个或多个值插入到列表尾部(无key则创建):RPUSH <key_name> <value> [value...]
127.0.0.1:6379> LRANGE redis_list_1 0 -1
1) "redis_hash"
2) "redis_string"
3) "redis_insert"
4) "redis_list"
127.0.0.1:6379> RPUSH redis_list_1 redis_list redis_string
(integer) 6
127.0.0.1:6379> LRANGE redis_list_1 0 -1
1) "redis_hash"
2) "redis_string"
3) "redis_insert"
4) "redis_list"
5) "redis_list"
6) "redis_string"

//  将一个或多个值插入到列表尾部(无key则不执行):RPUSH <key_name> <value> [value...]
127.0.0.1:6379> keys *
1) "redis_list_1"
127.0.0.1:6379> RPUSHX redis_list_2 redis_1 redis_2
(integer) 0

//  移除并删除列表最后一个元素:RPOP <key_name>
127.0.0.1:6379> RPOP redis_list_1
"redis_string"
127.0.0.1:6379> RPOP redis_list_1
"redis_list"
127.0.0.1:6379> LRANGE redis_list_1 0 -1
1) "redis_hash"
2) "redis_string"
3) "redis_insert"
4) "redis_list"

//  移除列表最后一个元素,并创建一个新的列表插入删除的元素:RPOPLPUSH <key_name> <new_key_name>
127.0.0.1:6379> RPOPLPUSH redis_list_1 redis_list_2
"redis_list"
127.0.0.1:6379> LRANGE redis_list_1 0 -1
1) "redis_hash"
2) "redis_string"
3) "redis_insert"
127.0.0.1:6379> LRANGE redis_list_2 0 -1
1) "redis_list"

//  对列表中进行裁剪,让列表只保留指定区间元素
127.0.0.1:6379> RPUSH redis_list_1 redis_insert redis_list
(integer) 5
127.0.0.1:6379> LRANGE redis_list_1 0 -1
1) "redis_hash"
2) "redis_string"
3) "redis_insert"
4) "redis_insert"
5) "redis_list"
127.0.0.1:6379> LTRIM redis_list_1 1 -3
OK
127.0.0.1:6379> LRANGE redis_list_1 0 -1
1) "redis_string"
2) "redis_insert"


//  Redis Linsert命令用于列表的元素前或元素后插入元素:LINSERT <key_name> <BEFORE|AFTER> <existing_value> <new_value>
127.0.0.1:6379> LRANGE redis_list_1 0 -1
1) "redis_string"
2) "redis_insert"
127.0.0.1:6379> LINSERT redis_list_1 BEFORE redis_insert redis_list
(integer) 3
127.0.0.1:6379> LRANGE redis_list_1 0 -1
1) "redis_string"
2) "redis_list"
3) "redis_insert"
127.0.0.1:6379> LINSERT redis_list_1 AFTER redis_list redis_set
(integer) 4
127.0.0.1:6379> LINSERT redis_list_1 AFTER redis_sortset redis_set
(integer) -1
127.0.0.1:6379> LRANGE redis_list_1 0 -1
1) "redis_string"
2) "redis_list"
3) "redis_set"
4) "redis_insert"

//  Redis Blpop命令用于移除并获取列表的第一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
127.0.0.1:6379> BLPOP redis_list_1 10
1) "redis_list_1"
2) "redis_string"
127.0.0.1:6379> LRANGE redis_list_1 0 -1
1) "redis_list"
2) "redis_set"
3) "redis_insert"
...删除所有元素后
127.0.0.1:6379> BLPOP redis_list_1 10
(nil)
(10.01s)


//  Redis Brpop命令用于移除并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止:BRPOP <key_name> <timeout_seconds>
127.0.0.1:6379> BRPOP redis_list_1 10
1) "redis_list_1"
2) "redis_insert"
127.0.0.1:6379> LRANGE redis_list_1 0 -1
1) "redis_string"
2) "redis_list"
3) "redis_set"
...删除所有元素后
127.0.0.1:6379> BLPOP redis_list_1 10
(nil)
(10.01s)


//  Redis BRPOPLPUSH命令用于移除并获取列表最后一个元素,并将其插入到指定key中(key不存在则创建),如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止:BRPOPLPUSH <key_name> <target_key_name> <timeout_seconds>
127.0.0.1:6379> LRANGE redis_list_1 0 -1
(empty list or set)
127.0.0.1:6379> LPUSH redis_list_1 redis_string redis_set
(integer) 2
127.0.0.1:6379> BRPOPLPUSH redis_list_1 redis_list_2 6
"redis_string"
127.0.0.1:6379> BRPOPLPUSH redis_list_1 redis_list_2 6
"redis_set"
127.0.0.1:6379> lrange redis_list_2 0 -1
1) "redis_set"
2) "redis_string"

/*
Redis LREM移除列表中的元素,使用count来控制:
count > 0  从列表头开始向列表尾搜索,移除与VALUE相等的元素,数量为COUNT;
count < 0 从列表尾开始向列表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值; 
count == 0 移除表中所有与value相同的元素

LREM <key_name> <count> <value>
*/
127.0.0.1:6379> LRANGE redis_list_1 0 -1
1) "redis_list"
2) "redis_string"
3) "redis_set"
4) "redis_string"
5) "redis_list"
6) "redis_string"
7) "redis_set"
8) "redis_string"
127.0.0.1:6379> LREM redis_list_1 1 redis_set
(integer) 1
127.0.0.1:6379> LRANGE redis_list_1 0 -1
1) "redis_list"
2) "redis_string"
3) "redis_string"
4) "redis_list"
5) "redis_string"
6) "redis_set"
7) "redis_string"
127.0.0.1:6379> LREM redis_list_1 -2 redis_string
(integer) 2
127.0.0.1:6379> LRANGE redis_list_1 0 -1
1) "redis_list"
2) "redis_string"
3) "redis_string"
4) "redis_list"
5) "redis_set"
127.0.0.1:6379> LREM redis_list_1 0 redis_string
(integer) 2
127.0.0.1:6379> LRANGE redis_list_1 0 -1
1) "redis_list"
2) "redis_list"
3) "redis_set"