Redis学习笔记10Redis数据类型之 链表类型
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis学习笔记10Redis数据类型之 链表类型相关的知识,希望对你有一定的参考价值。
1.1.1. lpush
在链表的头部插入一个或多个值。
语法:
LPUSH key value [value ...]
参数:
key 键名。键值为一个链表。
value 要插入的值。
返回值:
整数:在插入之后,链表的长度。
ERROR:key对应的对象不是链表类型。
例子:
redis.coe2coe.me:6379> lpush mylist host redis.coe2coe.me
(integer) 2
redis.coe2coe.me:6379> lpush mylist port 6379
(integer) 4
redis.coe2coe.me:6379> set a 123
OK
redis.coe2coe.me:6379> lpush a port 6379
(error) WRONGTYPE Operation against a key holding the wrong kind of value
redis.coe2coe.me:6379> lpush mylist key1 aaaa
(integer) 6
一次插入2个值。
redis.coe2coe.me:6379> lpush mylist aaa,bbb,ccc
(integer) 7
本次只插入了一个值。
1.1.2. rpush
在链表的末尾加入指定的值。
语法:
RPUSH key value [value ...]
返回值:
整数:在插入之后,链表的长度。
ERROR:key对应的对象不是链表类型。
例子:
redis.coe2coe.me:6379> rpush mylist end3 end2 end1
(integer) 10
1.1.3. lpop
删除链表的头部的第一个值。
语法:
LPOP key
返回值:
第一个元素的值:删除成功了。
nil:删除失败。链表长度为0,或者key对应的链表不存在。
ERROR:key对应的对象存在,但是类型不是链表类型。
例子:
redis.coe2coe.me:6379> lpop mylist
"aaa,bbb,ccc"
redis.coe2coe.me:6379> lpop mylist
"aaaa"
redis.coe2coe.me:6379> lpop nosuchlist
(nil)
redis.coe2coe.me:6379> set a 1243
OK
redis.coe2coe.me:6379> lpop a
(error) WRONGTYPE Operation against a key holding the wrong kind of value
1.1.4. rpop
删除链表的尾部的最后一个值。
语法:
RPOP key
返回值:
最后一个元素的值:删除成功了。
nil:删除失败。链表长度为0,或者key对应的链表不存在。
ERROR:key对应的对象存在,但是类型不是链表类型。
用法与lpop类似,不再赘述。
1.1.5. lrange
获取链表中指定的范围的元素的值。
语法:
LRANGE key start stop
参数:
key 键名。
start:开始位置。
stop:结束位置。
位置从0开始,-1表示最后一个元素的位置,-2表示倒数第2个元素的位置,以此类推。
返回值:
元素的值的数组:操作成功。
例子:
redis.coe2coe.me:6379> lrange mylist 0 -1
1) "key1"
2) "6379"
3) "port"
4) "redis.coe2coe.me"
5) "host"
6) "end3"
7) "end2"
8) "end1"
redis.coe2coe.me:6379> lpop mylist
"key1"
redis.coe2coe.me:6379> lrange mylist 0 -1
1) "6379"
2) "port"
3) "redis.coe2coe.me"
4) "host"
5) "end3"
6) "end2"
7) "end1"
redis.coe2coe.me:6379> rpop mylist
"end1"
redis.coe2coe.me:6379> lrange mylist 0 -1
1) "6379"
2) "port"
3) "redis.coe2coe.me"
4) "host"
5) "end3"
6) "end2"
redis.coe2coe.me:6379> lrange nosuchlist 0 -1
(empty list or set)
redis.coe2coe.me:6379> set a 123
OK
redis.coe2coe.me:6379> lrange a 0 -1
(error) WRONGTYPE Operation against a key holding the wrong kind of value
redis.coe2coe.me:6379> lrange mylist 5 3
(empty list or set)
1.1.6. linsert
在指定元素的前面或后面插入一个新元素。
语法:
LINSERT key BEFORE|AFTER pivot value
参数:
key 键名。键值为一个链表。
位置:BEFORE:在指定元素之前插入,AFTER:在之后插入。
pivot:指定的元素。
value:待插入的值。
返回值:
整数:插入操作之后链表的长度。
-1:在链表中没有找到值为privot的元素。
ERROR:key对应的元素存在,但是类型不是链表。
例子:
redis.coe2coe.me:6379> lrange mylist 0 -1
1) "6379"
2) "port"
3) "redis.coe2coe.me"
4) "host"
5) "end3"
6) "end2"
redis.coe2coe.me:6379> linsert mylist before port value1
(integer) 7
redis.coe2coe.me:6379> lrange mylist 0 -1
1) "6379"
2) "value1"
3) "port"
4) "redis.coe2coe.me"
5) "host"
6) "end3"
7) "end2"
redis.coe2coe.me:6379> linsert mylist after port value2
(integer) 8
redis.coe2coe.me:6379> lrange mylist 0 -1
1) "6379"
2) "value1"
3) "port"
4) "value2"
5) "redis.coe2coe.me"
6) "host"
7) "end3"
8) "end2"
redis.coe2coe.me:6379> linsert mylist before nosuchvalue value3
(integer) -1
redis.coe2coe.me:6379> set a 123
OK
redis.coe2coe.me:6379> linsert a before nosuchvalue value3
(error) WRONGTYPE Operation against a key holding the wrong kind of value
1.1.7. lindex
查找指定位置的元素。
语法:
LINDEX key index
参数:
key:键名。
index:位置。从0开始。-1表示最后一个位置,-2表示倒数第2个位置,以此类推。
返回值:
元素的值:操作成功。
nil:index超出链表范围。
ERROR:key对应的键存在,但是键值的类型不是链表。
例子:
redis.coe2coe.me:6379> lrange mylist 0 -1
1) "6379"
2) "value1"
3) "port"
4) "value2"
5) "redis.coe2coe.me"
6) "host"
7) "end3"
8) "end2"
redis.coe2coe.me:6379> lindex mylist 0
"6379"
redis.coe2coe.me:6379> lindex mylist 2
"port"
redis.coe2coe.me:6379> lindex mylist 7
"end2"
redis.coe2coe.me:6379> lindex mylist 8
(nil)
redis.coe2coe.me:6379> lindex mylist -1
"end2"
redis.coe2coe.me:6379> lindex mylist -2
"end3"
redis.coe2coe.me:6379> lindex mylist -10
(nil)
redis.coe2coe.me:6379> lindex nosuchlist 0
(nil)
redis.coe2coe.me:6379> set a 2134
OK
redis.coe2coe.me:6379> lindex a 0
(error) WRONGTYPE Operation against a key holding the wrong kind of value
llen
取得链表长度。
语法:
LLEN key
返回值:
正整数:链表长度。
0:key对应的链表不存在,或者存在,但是长度为0.
ERROR:key对应的对象存在,但是类型不是链表类型。
例子:
redis.coe2coe.me:6379> lrange mylist 0 -1
1) "6379"
2) "value1"
3) "port"
4) "value2"
5) "redis.coe2coe.me"
6) "host"
7) "end3"
8) "end2"
redis.coe2coe.me:6379> llen mylist
(integer) 8
redis.coe2coe.me:6379> llen nosuchlist
(integer) 0
redis.coe2coe.me:6379> set a 123
OK
redis.coe2coe.me:6379> llen a
(error) WRONGTYPE Operation against a key holding the wrong kind of value
1.1.8. lset
设置指定的位置的元素的值。
语法:
LSET key index value
参数:
index:位置。从0开始。-1表示最后一个位置,-2表示倒数第2个位置,以此类推。
value:值。
返回值:
OK:操作成功。
ERROR:可能的原因如下:
key不存在;
或者key对应的键存在,但是键值的类型不是链表;
或者index超出范围。
例子:
redis.coe2coe.me:6379> lrange mylist 0 -1
1) "6379"
2) "value1"
3) "port"
4) "value2"
5) "redis.coe2coe.me"
6) "host"
7) "end3"
8) "end2"
redis.coe2coe.me:6379> lset mylist 0 first
OK
redis.coe2coe.me:6379> lset mylist -1 theend
OK
redis.coe2coe.me:6379> lset mylist 10 newvalue
(error) ERR index out of range
redis.coe2coe.me:6379> lset nosuchlist 0 first
(error) ERR no such key
redis.coe2coe.me:6379> set a 123
OK
redis.coe2coe.me:6379> lset a 0 first
(error) WRONGTYPE Operation against a key holding the wrong kind of value
redis.coe2coe.me:6379> lrange mylist 0 -1
1) "first"
2) "value1"
3) "port"
4) "value2"
5) "redis.coe2coe.me"
6) "host"
7) "end3"
8) "theend"
1.1.9. blpop
阻塞式取出链表头部的第1个元素,如果等待时间超过timeout秒,则返回nil。
语法:
BLPOP key [key ...] timeout
参数:
key :键名,键值为链表。可以指定一个或多个键名。
timeout:超时时间。单位秒。0表示永不超时。只能为正数或0。
返回值:
链表以及元素:操作成功。成功取得一个元素。
nil:超时,没有取得元素。
ERROR:参数错误。
例子:
在链表为空的情况下,blpop将等待timeout秒。
如果10秒仍没有数据,则返回nil。
redis.coe2coe.me:6379> lrange mylist 0 -1
(empty list or set)
redis.coe2coe.me:6379> blpop mylist 10
(nil)
(10.03s)
如果在等待过程中,另一个客户端连接插入了新的数据,则立即返回该数据,同时该数据从链表中删除掉了。
redis.coe2coe.me:6379> blpop mylist 10
1) "mylist"
2) "aaaaaa"
(6.17s)
结果表明在mylist链表中取出了aaaaaa这个元素。
redis.coe2coe.me:6379> lrange mylist 0 -1
(empty list or set)
如果在blpop操作之前链表中已经有一些数据,则blpop立即返回第1个数据。
redis.coe2coe.me:6379> lrange mylist 0 -1
1) "eeeee"
2) "dddd"
3) "ccccc"
4) "bbbbb"
redis.coe2coe.me:6379> blpop mylist 10
1) "mylist"
2) "eeeee"
redis.coe2coe.me:6379> blpop mylist 10
1) "mylist"
2) "dddd"
redis.coe2coe.me:6379> blpop mylist 10
1) "mylist"
2) "ccccc"
可以一次等待多个链表中的数据,只要任何一个链表中有了数据,将立即返回。
redis.coe2coe.me:6379> blpop mylist mylist2 mylist3 10
1) "mylist"
2) "aaaa"
(6.34s)
当timeout值为0时,表示永久等待,不超时。
redis.coe2coe.me:6379> lrange mylist 0 -1
(empty list or set)
redis.coe2coe.me:6379> blpop mylist mylist2 mylist3 0
1) "mylist2"
2) "ccccccc"
(13.56s)
timeout值为负数,则出错。
redis.coe2coe.me:6379> blpop mylist mylist2 mylist3 -1
(error) ERR timeout is negative
1.1.10. lrem
删除值等于指定值的元素。可以从头部开始删除,也可以从尾部开始删除,可以删除一个或多个元素。
语法:
LREM key count value
参数:
count:>0:从头部开始删除值为value的元素,最多删除count个。
<0:从尾部开始删除值为value的元素,最多删除-count个。
=0:删除全部值为value的元素。
value:待删除的值。
返回值:
整数:删除成功的元素的个数。
0:没有元素被删除。
例子:
redis.coe2coe.me:6379> lrange mylist 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
5) "e"
6) "d"
7) "c"
8) "b"
9) "a"
redis.coe2coe.me:6379> lrem mylist 2 a
(integer) 2
redis.coe2coe.me:6379> lrange mylist 0 -1
1) "d"
2) "c"
3) "b"
4) "e"
5) "d"
6) "c"
7) "b"
redis.coe2coe.me:6379> lrange mylist -1 c
(error) ERR value is not an integer or out of range
redis.coe2coe.me:6379> lrem mylist -1 c
(integer) 1
redis.coe2coe.me:6379> lrange mylist 0 -1
1) "d"
2) "c"
3) "b"
4) "e"
5) "d"
6) "b"
redis.coe2coe.me:6379> lrem mylist 3 a
(integer) 0
redis.coe2coe.me:6379> lrange mylist 0 -1
1) "d"
2) "c"
3) "b"
4) "e"
5) "d"
6) "b"
redis.coe2coe.me:6379> lrem nosuchlist 3 a
(integer) 0
redis.coe2coe.me:6379> set a 123
OK
redis.coe2coe.me:6379> lrem a 3 a
(error) WRONGTYPE Operation against a key holding the wrong kind of value
1.1.11. rpoplpush
从source链表的末尾删除一个元素,将这个元素插入到destination链表的开头。这两个链表可以是同一个链表。
语法:
RPOPLPUSH source destination
参数:
source 待删除末尾元素的链表。
destination:待插入到开头的链表。
返回值:
操作的元素的值:操作成功。
nil:source链表为空。
例子:
redis.coe2coe.me:6379> lrange mylist 0 -1
1) "d"
2) "c"
3) "b"
4) "e"
5) "d"
6) "b"
redis.coe2coe.me:6379> lrange mylist2 0 -1
(empty list or set)
redis.coe2coe.me:6379> rpoplpush mylist mylist2
"b"
redis.coe2coe.me:6379> lrange mylist 0 -1
1) "d"
2) "c"
3) "b"
4) "e"
5) "d"
redis.coe2coe.me:6379> lrange mylist2 0 -1
1) "b"
redis.coe2coe.me:6379> rpoplpush mylist mylist
"d"
redis.coe2coe.me:6379> lrange mylist 0 -1
1) "d"
2) "d"
3) "c"
4) "b"
5) "e"
redis.coe2coe.me:6379> rpoplpush nosuchlist mylist
(nil)
redis.coe2coe.me:6379> lrange mylist 0 -1
1) "d"
2) "d"
3) "c"
4) "b"
5) "e"
1.1.12. ltrim
删除指定位置范围之外的元素。只保留start和stop范围内的元素。
语法:
LTRIM key start stop
参数:
start:开始位置。
stop:结束位置:
位置从0开始,-1表示最后一个位置,-2表示倒数第2个元素的位置。以此类推。
返回值:
OK:操作成功。
例子:
redis.coe2coe.me:6379> lrange mylist 0 -1
1) "d"
2) "d"
3) "c"
4) "b"
redis.coe2coe.me:6379> ltrim mylist 1 2
OK
redis.coe2coe.me:6379> lrange mylist 0 -1
1) "d"
2) "c"
redis.coe2coe.me:6379> ltrim mylist 1 0
OK
redis.coe2coe.me:6379> lrange mylist 0 -1
(empty list or set)
1.1. sets
1.1.1. sadd
向集合中增加若干个元素。集合中的每个元素都是唯一的,不能重复。
语法:
SADD key member [member ...]
参数:
key :键名,键值为集合。
member:待增加的元素的值。
返回值:
>0:插入了至少一个新元素。
0:没有插入新元素,可能是元素已经存在。
例子:
redis.coe2coe.me:6379> sadd myset a b c d e
(integer) 5
redis.coe2coe.me:6379> smembers myset
1) "a"
2) "c"
3) "b"
4) "d"
5) "e"
redis.coe2coe.me:6379> sadd myset a b c
(integer) 0
redis.coe2coe.me:6379> smembers myset
1) "a"
2) "c"
3) "e"
4) "d"
5) "b"
redis.coe2coe.me:6379> set a 123
OK
redis.coe2coe.me:6379> sadd a a b c
(error) WRONGTYPE Operation against a key holding the wrong kind of value
redis.coe2coe.me:6379> sadd myset a 1234 4565
(integer) 2
redis.coe2coe.me:6379> smembers myset
1) "a"
2) "c"
3) "e"
4) "d"
5) "1234"
6) "4565"
7) "b"
1.1.2. srem
删除指定的若干个值。
语法:
SREM key member [member ...]
参数:
member :待删除的值。
返回值:
>0:从集合中删除掉的元素的个数,不包括参数中指定了但是集合中已经不存在的元素。
=0:没有删除掉任何元素。
例子:
redis.coe2coe.me:6379> smembers myset
1) "a"
2) "c"
3) "e"
4) "d"
5) "1234"
6) "4565"
7) "b"
redis.coe2coe.me:6379> srem myset a b c abc
(integer) 3
redis.coe2coe.me:6379> smembers myset
1) "e"
2) "d"
3) "1234"
4) "4565"
redis.coe2coe.me:6379> srem myset a
(integer) 0
1.1.3. smembers
查看集合中的所有元素。
语法:
SMEMBERS key
返回值:
数组:成功返回集合中的所有元素。
例子:
redis.coe2coe.me:6379> smembers myset
1) "e"
2) "d"
3) "1234"
4) "4565"
1.1.4. sismember
判断指定的元素是否在集合中。
语法:
SISMEMBER key member
参数:
key :键名,键值是一个集合。
member:要判断的元素。
返回值:
1:member元素在集合中。
0:member元素不在集合中,或者集合不存在。
ERROR:key对应的对象存在,但是类型不是集合。
例子:
redis.coe2coe.me:6379> smembers myset
1) "e"
2) "d"
3) "1234"
4) "4565"
redis.coe2coe.me:6379> sismember myset d
(integer) 1
redis.coe2coe.me:6379> sismember myset a
(integer) 0
redis.coe2coe.me:6379> sismember nosuchset a
(integer) 0
redis.coe2coe.me:6379> set a 123
OK
redis.coe2coe.me:6379> sismember a 1234
(error) WRONGTYPE Operation against a key holding the wrong kind of value
1.1.5. srandmember
查看集合中的指定个数的随机元素。
语法:
SRANDMEMBER key [count]
参数:
key:键名,键值是集合。
count:待返回元素的个数。
0: 返回空数组。
>0:返回最多count个不同的元素。
<0:返回最多-count个元素,有可能包含相同元素。
返回值:
数组:随机选择的若干个元素。
redis.coe2coe.me:6379> smembers myset
1) "e"
2) "d"
3) "1234"
4) "4565"
redis.coe2coe.me:6379> srandmember myset
"1234"
redis.coe2coe.me:6379> srandmember myset
"4565"
redis.coe2coe.me:6379> srandmember myset
"e"
redis.coe2coe.me:6379> srandmember myset 3
1) "1234"
2) "4565"
3) "d"
redis.coe2coe.me:6379> srandmember myset -3
1) "4565"
2) "d"
3) "d"
redis.coe2coe.me:6379> srandmember myset 10
1) "1234"
2) "4565"
3) "e"
4) "d"
redis.coe2coe.me:6379> srandmember myset 0
(empty list or set)
1.1.6. sdiff
返回在指定的集合中,在第一个集合中存在,而在其它集合中不存在的元素。
本操作只返回差异,但是不会修改任何一个集合。
语法:
SDIFF key [key ...]
返回值:
元素的集合:操作成功。
例子:
redis.coe2coe.me:6379> sadd myset a b c d e f
(integer) 6
redis.coe2coe.me:6379> sadd myset2 a b
(integer) 2
redis.coe2coe.me:6379> sadd myset3 a d
(integer) 2
redis.coe2coe.me:6379> sdiff myset myset2 myset3
1) "e"
2) "c"
3) "f"
sdiffstore
操作与sdiff类似,区别在于将取得的结果集存入一个指定的集合中。
语法:
SDIFFSTORE destination key [key ...]
参数;
destination:将结果存入该集合中。
返回值:
整数:destination中的元素的个数。
例子:
redis.coe2coe.me:6379> sadd myset a b c d e f
(integer) 6
redis.coe2coe.me:6379> sadd myset2 a b
(integer) 2
redis.coe2coe.me:6379> sadd myset3 a d
(integer) 2
redis.coe2coe.me:6379> smembers dest
(empty list or set)
redis.coe2coe.me:6379> sdiffstore dest myset myset2 myset3
(integer) 3
redis.coe2coe.me:6379> smembers dest
1) "e"
2) "c"
3) "f"
redis.coe2coe.me:6379> sadd myset4 c h
(integer) 2
redis.coe2coe.me:6379> sdiffstore dest myset myset2 myset3
(integer) 3
redis.coe2coe.me:6379> smembers dest
1) "e"
2) "c"
3) "f"
redis.coe2coe.me:6379> sadd myset4 f
(integer) 1
redis.coe2coe.me:6379> sdiffstore dest myset myset2 myset3 myset4
(integer) 1
redis.coe2coe.me:6379> smembers dest
1) "e"
1.1.7. sinter
取得指定的集合中每个集合都存在的元素。
语法:
SINTER key [key ...]
返回值:
数组:返回找到的元素。
例子:
redis.coe2coe.me:6379> flushdb
OK
redis.coe2coe.me:6379> sadd myset a b c d e f
(integer) 6
redis.coe2coe.me:6379> sadd myset2 123 a
(integer) 2
redis.coe2coe.me:6379> sadd myset3 345 b
(integer) 2
redis.coe2coe.me:6379> sinter myset myset2 myset3
(empty list or set)
redis.coe2coe.me:6379> flushdb
OK
redis.coe2coe.me:6379> sadd myset a b c d e f
(integer) 6
redis.coe2coe.me:6379> sadd myset2 a b c
(integer) 3
redis.coe2coe.me:6379> sadd myset3 123 a c g h
(integer) 5
redis.coe2coe.me:6379> sinter myset myset2 myset3
1) "a"
2) "c"
1.1.8. sunion
取得在指定的集合中,在至少一个集合中存在的元素。
SUNION key [key ...]
例子:
redis.coe2coe.me:6379> sadd myset a b c d e f
(integer) 6
redis.coe2coe.me:6379> sadd myset2 a b 123
(integer) 3
redis.coe2coe.me:6379> sadd myset3 a c 123
(integer) 3
redis.coe2coe.me:6379> sunion myset myset2 myset3
1) "a"
2) "c"
3) "e"
4) "d"
5) "f"
6) "123"
7) "b"
1.1.9. scard
取得集合的元素的个数。
语法:
SCARD key
返回值:
元素的个数。
例子:
redis.coe2coe.me:6379> sadd myset a b c d
(integer) 4
redis.coe2coe.me:6379> scard myset
(integer) 4
以上是关于Redis学习笔记10Redis数据类型之 链表类型的主要内容,如果未能解决你的问题,请参考以下文章
系统学习redis之五——redis数据类型之list类型及操作