首页 > 代码库 > Redis学习笔记10Redis数据类型之(3) 链表类型

Redis学习笔记10Redis数据类型之(3) 链表类型

1.1.1. lpush

在链表的头部插入一个或多个值。

 

语法:

LPUSH key value [value ...]

参数:

key 键名。键值为一个链表。

value  要插入的值。

返回值:

整数:在插入之后,链表的长度。

ERRORkey对应的对象不是链表类型。

 

例子:

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 ...]

返回值:

整数:在插入之后,链表的长度。

ERRORkey对应的对象不是链表类型。

 

例子:

redis.coe2coe.me:6379> rpush mylist end3 end2 end1

(integer) 10

 

 

 

 

1.1.3. lpop

删除链表的头部的第一个值。

 

语法:

LPOP key

返回值:

第一个元素的值:删除成功了。

nil:删除失败。链表长度为0,或者key对应的链表不存在。

ERRORkey对应的对象存在,但是类型不是链表类型。

 

例子:

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对应的链表不存在。

ERRORkey对应的对象存在,但是类型不是链表类型。

用法与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的元素。

ERRORkey对应的元素存在,但是类型不是链表。

 

例子:

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个位置,以此类推。

返回值:

元素的值:操作成功。

nilindex超出链表范围。

ERRORkey对应的键存在,但是键值的类型不是链表。

 

例子:

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

返回值:

正整数:链表长度。

0key对应的链表不存在,或者存在,但是长度为0.

ERRORkey对应的对象存在,但是类型不是链表类型。

例子:

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:待插入到开头的链表。

返回值:

操作的元素的值:操作成功。

nilsource链表为空。

 

例子:

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

 

删除指定位置范围之外的元素。只保留startstop范围内的元素。

语法:

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:要判断的元素。

返回值:

1member元素在集合中。

0member元素不在集合中,或者集合不存在。

ERRORkey对应的对象存在,但是类型不是集合。

 

例子:

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数据类型之(3) 链表类型