redis源码分析(四)、redis命令学习总结—链表List
2017-12-20 16:17
751 查看
一、链表List
链表被广泛用于实现 Redis 的各种功能, 比如列表键, 发布与订阅, 慢查询, 监视器, 等等。
每个链表节点由一个 listNode 结构来表示, 每个节点都有一个指向前置节点和后置节点的指针, 所以 Redis 的链表实现是双端链表。
每个链表使用一个 list 结构来表示, 这个结构带有表头节点指针、表尾节点指针、以及链表长度等信息。
因为链表表头节点的前置节点和表尾节点的后置节点都指向 NULL , 所以 Redis 的链表实现是无环链表。
通过为链表设置不同的类型特定函数, Redis 的链表可以用于保存各种不同类型的值。
二、命令学习
1、Blpop命令
Redis Blpop 命令移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
用法:
如果列表为空,返回一个 nil 。 否则,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值。
在以上实例中,操作会被阻塞,如果指定的列表 key list1 存在数据则会返回第一个元素,否则在等待100秒后会返回 nil 。
2、Brpop
Redis Brpop 命令移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
假如在指定时间内没有任何元素被弹出,则返回一个 nil 和等待时长。 反之,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值。
3、 Brpoplpush
从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
语法:
假如在指定时间内没有任何元素被弹出,则返回一个 nil 和等待时长。 反之,返回一个含有两个元素的列表,第一个元素是被弹出元素的值,第二个元素是等待时长。
示例:
4、Lindex
Lindex 命令用于通过索引获取列表中的元素。你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
列表中下标为指定索引值的元素。 如果指定索引值不在列表的区间范围内,返回 nil 。
示例:
5、Linsert
Redis Linsert 命令用于在列表的元素前或者后插入元素。 当指定元素不存在于列表中时,不执行任何操作。 当列表不存在时,被视为空列表,不执行任何操作。 如果 key 不是列表类型,返回一个错误。
语法:
如果命令执行成功,返回插入操作完成之后,列表的长度。 如果没有找到指定元素 ,返回 -1 。 如果 key 不存在或为空列表,返回 0 。
6、Llen
Redis Llen 命令用于返回列表的长度。 如果列表 key 不存在,则 key 被解释为一个空列表,返回 0 。 如果 key 不是列表类型,返回一个错误。
语法:
示例:
7、Lpop
Lpop 命令用于移除并返回列表的第一个元素。
语法:
返回列表的第一个元素。 当列表 key 不存在时,返回 nil
8、Lpush
Lpush 命令将一个或多个值插入到列表头部。 如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作。 当 key 存在但不是列表类型时,返回一个错误。
语法:
返回列表的长度 示例:
9、Lpushx
Lpushx 将一个或多个值插入到已存在的列表头部,列表不存在时操作无效。
用法:
LPUSHX 命令执行之后,返回列表的长度。 示例:
10、Lrange
Redis Lrange 返回列表中指定区间内的元素,区间以偏移量 START 和 END 指定。 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
示例:
11、Lrem
Redis Lrem 根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素。
COUNT 的值可以是以下几种:
count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 。
count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。
count = 0 : 移除表中所有与 VALUE 相等的值。
用法:
被移除元素的数量。 列表不存在时返回 0 。
示例:
12、Lset
Redis Lset 通过索引来设置元素的值。
当索引参数超出范围,或对一个空列表进行 LSET 时,返回一个错误。
操作成功返回 ok ,否则返回错误信息。
13、Ltrim
Redis Ltrim 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
下标 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
用法: 令执行成功时,返回 ok 。
14、Rpop
Redis Rpop 命令用于移除并返回列表的最后一个元素。
列表的最后一个元素。 当列表不存在时,返回 nil 。
示例:
15、 Rpoplpush
Rpoplpush 命令用于移除列表的最后一个元素,并将该元素添加到另一个列表并返回。
示例1:
示例2:
16、Rpush
Redis Rpush 命令用于将一个或多个值插入到列表的尾部(最右边)。
如果列表不存在,一个空列表会被创建并执行 RPUSH 操作。 当列表存在但不是列表类型时,返回一个错误。
17、Rpushx
Redis Rpushx 命令用于将一个或多个值插入到已存在的列表尾部(最右边)。如果列表不存在,操作无效。
链表被广泛用于实现 Redis 的各种功能, 比如列表键, 发布与订阅, 慢查询, 监视器, 等等。
每个链表节点由一个 listNode 结构来表示, 每个节点都有一个指向前置节点和后置节点的指针, 所以 Redis 的链表实现是双端链表。
每个链表使用一个 list 结构来表示, 这个结构带有表头节点指针、表尾节点指针、以及链表长度等信息。
因为链表表头节点的前置节点和表尾节点的后置节点都指向 NULL , 所以 Redis 的链表实现是无环链表。
通过为链表设置不同的类型特定函数, Redis 的链表可以用于保存各种不同类型的值。
二、命令学习
1、Blpop命令
Redis Blpop 命令移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
用法:
redis 127.0.0.1:6379> BLPOP LIST1 LIST2 .. LISTN TIMEOUT
如果列表为空,返回一个 nil 。 否则,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值。
redis 127.0.0.1:6379> BLPOP list1 100
在以上实例中,操作会被阻塞,如果指定的列表 key list1 存在数据则会返回第一个元素,否则在等待100秒后会返回 nil 。
(nil) (100.06s)
2、Brpop
Redis Brpop 命令移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
redis 127.0.0.1:6379> BRPOP LIST1 LIST2 .. LISTN TIMEOUT
假如在指定时间内没有任何元素被弹出,则返回一个 nil 和等待时长。 反之,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值。
3、 Brpoplpush
从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
语法:
redis 127.0.0.1:6379> BRPOPLPUSH LIST1 ANOTHER_LIST TIMEOUT
假如在指定时间内没有任何元素被弹出,则返回一个 nil 和等待时长。 反之,返回一个含有两个元素的列表,第一个元素是被弹出元素的值,第二个元素是等待时长。
示例:
# 非空列表
redis 127.0.0.1:6379> BRPOPLPUSH msg reciver 500
"hello moto" # 弹出元素的值
(3.38s) # 等待时长
redis 127.0.0.1:6379> LLEN reciver
(integer) 1
redis 127.0.0.1:6379> LRANGE reciver 0 0
1) "hello moto"
# 空列表
redis 127.0.0.1:6379> BRPOPLPUSH msg reciver 1
(nil)
(1.34s)
<pre>
(nil) (100.06s)
4、Lindex
Lindex 命令用于通过索引获取列表中的元素。你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
redis 127.0.0.1:6379> LINDEX KEY_NAME INDEX_POSITION
列表中下标为指定索引值的元素。 如果指定索引值不在列表的区间范围内,返回 nil 。
示例:
redis 127.0.0.1:6379> LPUSH mylist "World" (integer) 1 redis 127.0.0.1:6379> LPUSH mylist "Hello" (integer) 2 redis 127.0.0.1:6379> LINDEX mylist 0 "Hello" redis 127.0.0.1:6379> LINDEX mylist -1 "World" redis 127.0.0.1:6379> LINDEX mylist 3 # index不在 mylist 的区间范围内 (nil)
5、Linsert
Redis Linsert 命令用于在列表的元素前或者后插入元素。 当指定元素不存在于列表中时,不执行任何操作。 当列表不存在时,被视为空列表,不执行任何操作。 如果 key 不是列表类型,返回一个错误。
语法:
redis 127.0.0.1:6379> LINSERT KEY_NAME BEFORE EXISTING_VALUE NEW_VALUE
如果命令执行成功,返回插入操作完成之后,列表的长度。 如果没有找到指定元素 ,返回 -1 。 如果 key 不存在或为空列表,返回 0 。
redis 127.0.0.1:6379> RPUSH list1 "foo" (integer) 1 redis 127.0.0.1:6379> RPUSH list1 "bar" (integer) 2 redis 127.0.0.1:6379> LINSERT list1 BEFORE "bar" "Yes" (integer) 3 redis 127.0.0.1:6379> LRANGE mylist 0 -1 1) "foo" 2) "Yes" 3) "bar"
6、Llen
Redis Llen 命令用于返回列表的长度。 如果列表 key 不存在,则 key 被解释为一个空列表,返回 0 。 如果 key 不是列表类型,返回一个错误。
语法:
redis 127.0.0.1:6379> LLEN KEY_NAME
示例:
redis 127.0.0.1:6379> RPUSH list1 "foo" (integer) 1 redis 127.0.0.1:6379> RPUSH list1 "bar" (integer) 2 redis 127.0.0.1:6379> LLEN list1 (integer) 2
7、Lpop
Lpop 命令用于移除并返回列表的第一个元素。
语法:
redis 127.0.0.1:6379> Lpop KEY_NAME
返回列表的第一个元素。 当列表 key 不存在时,返回 nil
redis 127.0.0.1:6379> RPUSH list1 "foo" (integer) 1 redis 127.0.0.1:6379> RPUSH list1 "bar" (integer) 2 redis 127.0.0.1:6379> LPOP list1 "foo"
8、Lpush
Lpush 命令将一个或多个值插入到列表头部。 如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作。 当 key 存在但不是列表类型时,返回一个错误。
语法:
redis 127.0.0.1:6379> LPUSH KEY_NAME VALUE1.. VALUEN
返回列表的长度 示例:
redis 127.0.0.1:6379> LPUSH list1 "foo" (integer) 1 redis 127.0.0.1:6379> LPUSH list1 "bar" (integer) 2 redis 127.0.0.1:6379> LRANGE list1 0 -1 1) "foo" 2) "bar
9、Lpushx
Lpushx 将一个或多个值插入到已存在的列表头部,列表不存在时操作无效。
用法:
redis 127.0.0.1:6379> LPUSHX KEY_NAME VALUE1.. VALUEN
LPUSHX 命令执行之后,返回列表的长度。 示例:
redis 127.0.0.1:6379> LPUSH list1 "foo" (integer) 1 redis 127.0.0.1:6379> LPUSHX list1 "bar" (integer) 2 redis 127.0.0.1:6379> LPUSHX list2 "bar" (integer) 0 redis 127.0.0.1:6379> LRANGE list1 0 -1 1) "bar" 2) "bar" 3) "foo"
10、Lrange
Redis Lrange 返回列表中指定区间内的元素,区间以偏移量 START 和 END 指定。 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
redis 127.0.0.1:6379> LRANGE KEY_NAME START END
示例:
127.0.0.1:6379> LPUSH list1 foo (integer) 1 127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> LPUSH list1 bar (integer) 2 127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> LPUSHX list1 chen (integer) 3 127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> LPUSHX list1 0 -1 (integer) 5 127.0.0.1:6379> Lrang list1 0 -1 (error) ERR unknown command 'Lrang' 127.0.0.1:6379> LRANGE list1 0 -1 1) "-1" 2) "0" 3) "chen" 4) "bar" 5) "foo"
11、Lrem
Redis Lrem 根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素。
COUNT 的值可以是以下几种:
count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 。
count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。
count = 0 : 移除表中所有与 VALUE 相等的值。
用法:
redis 127.0.0.1:6379> LREM KEY_NAME COUNT VALUE
被移除元素的数量。 列表不存在时返回 0 。
示例:
127.0.0.1:6379> LPUSH list1 foo (integer) 1 127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> LPUSH list1 bar (integer) 2 127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> LPUSHX list1 chen (integer) 3 127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> LPUSHX list1 0 -1 (integer) 5 127.0.0.1:6379> Lrang list1 0 -1 (error) ERR unknown command 'Lrang' 127.0.0.1:6379> LRANGE list1 0 -1 1) "-1" 2) "0" 3) "chen" 4) "bar" 5) "foo"
127.0.0.1:6379> LREM list1 -1 -1
(integer) 1
127.0.0.1:6379> LREM list1 -1 0
(integer) 1
127.0.0.1:6379> LREM list1 -1 chen
(integer) 1
127.0.0.1:6379> LRANGE list1 0 -1
1) "bar"
2) "foo"
12、Lset
Redis Lset 通过索引来设置元素的值。
当索引参数超出范围,或对一个空列表进行 LSET 时,返回一个错误。
redis 127.0.0.1:6379> LSET KEY_NAME INDEX VALUE
操作成功返回 ok ,否则返回错误信息。
redis 127.0.0.1:6379> RPUSH mylist "hello" (integer) 1 redis 127.0.0.1:6379> RPUSH mylist "hello" (integer) 2 redis 127.0.0.1:6379> RPUSH mylist "foo" (integer) 3 redis 127.0.0.1:6379> RPUSH mylist "hello" (integer) 4 redis 127.0.0.1:6379> LSET mylist 0 "bar" OK redis 127.0.0.1:6379> LRANGE mylist 0 -1 1: "bar" 2) "hello" 3) "foo" 4) "hello"
13、Ltrim
Redis Ltrim 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
下标 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
用法: 令执行成功时,返回 ok 。
redis 127.0.0.1:6379> LTRIM KEY_NAME START STOP
redis 127.0.0.1:6379> RPUSH mylist "hello" (integer) 1 redis 127.0.0.1:6379> RPUSH mylist "hello" (integer) 2 redis 127.0.0.1:6379> RPUSH mylist "foo" (integer) 3 redis 127.0.0.1:6379> RPUSH mylist "bar" (integer) 4 redis 127.0.0.1:6379> LTRIM mylist 1 -1 OK redis 127.0.0.1:6379> LRANGE mylist 0 -1 1) "hello" 2) "foo" 3) "bar"
14、Rpop
Redis Rpop 命令用于移除并返回列表的最后一个元素。
redis 127.0.0.1:6379> RPOP KEY_NAME
列表的最后一个元素。 当列表不存在时,返回 nil 。
示例:
redis 127.0.0.1:6379> RPUSH mylist "hello" (integer) 1 redis 127.0.0.1:6379> RPUSH mylist "hello" (integer) 2 redis 127.0.0.1:6379> RPUSH mylist "foo" (integer) 3 redis 127.0.0.1:6379> RPUSH mylist "bar" (integer) 4 redis 127.0.0.1:6379> RPOP mylist OK redis 127.0.0.1:6379> LRANGE mylist 0 -1 1) "hello" 2) "hello" 3) "foo"
15、 Rpoplpush
Rpoplpush 命令用于移除列表的最后一个元素,并将该元素添加到另一个列表并返回。
示例1:
redis 127.0.0.1:6379> RPUSH mylist "hello" (integer) 1 redis 127.0.0.1:6379> RPUSH mylist "foo" (integer) 2 redis 127.0.0.1:6379> RPUSH mylist "bar" (integer) 3 redis 127.0.0.1:6379> RPOPLPUSH mylist myotherlist "bar" redis 127.0.0.1:6379> LRANGE mylist 0 -1 1) "hello" 2) "foo"
示例2:
127.0.0.1:6379> rpush list1 chen (integer) 1 127.0.0.1:6379> rpush list1 xun (integer) 2 127.0.0.1:6379> rpush list1 zhang (integer) 3 127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> rpush list1 li (integer) 4 127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> RPOPLPUSH list1 otherlist "li" 127.0.0.1:6379> 127.0.0.1:6379> RPOPLPUSH list1 otherlist "zhang" 127.0.0.1:6379> lrange list1 0 -1 1) "chen" 2) "xun" 127.0.0.1:6379> lrange otherlist 0 -1 1) "zhang" 2) "li" 127.0.0.1:6379>
16、Rpush
Redis Rpush 命令用于将一个或多个值插入到列表的尾部(最右边)。
如果列表不存在,一个空列表会被创建并执行 RPUSH 操作。 当列表存在但不是列表类型时,返回一个错误。
redis 127.0.0.1:6379> RPUSH mylist "hello" (integer) 1 redis 127.0.0.1:6379> RPUSH mylist "foo" (integer) 2 redis 127.0.0.1:6379> RPUSH mylist "bar" (integer) 3 redis 127.0.0.1:6379> LRANGE mylist 0 -1 1) "hello" 2) "foo" 3) "bar"
17、Rpushx
Redis Rpushx 命令用于将一个或多个值插入到已存在的列表尾部(最右边)。如果列表不存在,操作无效。
redis 127.0.0.1:6379> RPUSH mylist "hello" (integer) 1 redis 127.0.0.1:6379> RPUSH mylist "foo" (integer) 2 redis 127.0.0.1:6379> RPUSHX mylist2 "bar" (integer) 0 redis 127.0.0.1:6379> LRANGE mylist 0 -1 1) "hello" 2) "foo"
相关文章推荐
- redis源码分析(9)redis源码链表学习总结 adlist.h adlist.c
- redis源码分析(三)redis命令学习总结—string字符串
- redis源码分析(六)、redis命令学习总结—Redis 集合(Set)
- redis源码分析(五)、redis命令学习总结—哈希Hash
- redis源码分析(七)、redis命令学习总结—Redis 有序集合(sorted set)
- Redis学习——链表源码分析
- 【redis源码分析】双向链表---adlist
- redis源码分析(二)、sds动态字符串学习总结
- redis源码分析之数据结构(一)链表adlist.c
- redis源码分析(八)、redis数据结构之压缩ziplist--------ziplist.c ziplist.h学习笔记
- Redis源码分析(二)——链表adlist
- 源码分析redis的有序集合,学习skiplist跳跃表数据结构
- memcached学习笔记——存储命令源码分析下篇
- Redis的List链表类型命令
- Redis源码分析笔记3-redis的数据类型-链表
- Redis源码分析(九)--- t_list,t_string的分析
- redis源码命令分析--关键字keys命令
- EasyUI学习总结(三)——easyloader源码分析(转载)
- Redis源码学习3-基本数据结构之双向链表
- Redis源码学习-Master&Slave的命令交互