来自文章集合:
一文带你搞懂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"