Redis支持的数据结构及命令

第1章 支持数据结构类型

你也许已经知道Redis并不是简单的key-value存储,实际上他是一个数据结构服务器,支持不同类型的值。也就是说,你不必仅仅把字符串当作键所指向的值。下列这些数据类型都可作为值类型:

数据类型

说明

Strings(字符串)

二进制安全的字符串

Lists(列表)

按插入顺序排序的字符串元素的集合。他们基本上就是链表(linked lists

Sets(集合)

不重复且无序的字符串元素的集合。

Sorted sets(有序集合)

类似Sets,但是每个字符串元素都关联到一个叫score浮动数值(floating number value)。里面的元素总是通过score进行着排序,所以不同的是,它是可以检索的一系列元素。(例如你可能会问:给我前面10个或者后面10个元素)。

Hashes(散列)

field和关联的value组成的mapfieldvalue都是字符串的

bitmaps

通过特殊的命令,你可以将   String 值当作一系列 bits 处理:可以设置和清除单独的 bits,数出所有设为 1 bits 的数量,找到最前的被设为 1 0 bit,等等。

hyperloglog

估计一个 set 中元素数量的概率性的数据结构。

geospatial(地理空间)


第2章 Redis常用命令

Redis命令十分丰富,包括的命令组有ClusterConnectionGeoHashesHyperLogLogKeysListsPub/SubScriptingServerSetsSorted SetsStringsTransactions一共14redis命令组两百多个redis命令。

2.1 针对Key的命令

命令

命令说明

DEL

删除给定的一个或多个 key

DUMP

序列化给定key,并返回被序列化的值

EXISTS

检查给定的key是否存在

EXPIRE

key设置生存时间

EXPIREAT

EXPIRE类似,不过接受的时间参数是UNIX的时间戳

KEYS

查询符合给定模式的key

MIGRATE

传输key到目标实例

MOVE

将当前数据库的key移动到给定的数据库db

OBJECT

命令允许从内部察看给定 key  Redis 对象

PRESIST

移除给定key的生存时间,结合EXPIRE使用

PEXPIRE

 EXPIRE 类似,但是它以毫秒为单位设置 key 的生存时间

PEXPIREAT

EXPIREAT类似,但是它以毫秒为单位设置 key 的生存时间

PTTL

TTL类似,但是它以毫秒为单位返回key的剩余生存时间

RANDOMKEY

从当前数据库中随机返回(不删除)一个 key 

RENAME

 key 改名为 newkey 

RENAMENX

当且仅当 newkey 不存在时,将 key 改名为 newkey 

RESTORE

反序列化给定的序列化值,并将它和给定的 key 关联。

SORT

返回或保存给定列表、集合、有序集合 key 中经过排序的元素。

TTL

以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)

TYPE

返回 key 所储存的值的类型。

SCAN

增量迭代

2.1.1 DEL

删除给定的一个或多个 key ,不存在的 key 会被忽略。

q  删除单个key

10.0.0.16:6379> SET name liutao
OK
10.0.0.16:6379> DEL name
(integer) 1

q  删除一个不存在的key

10.0.0.16:6379> EXISTS hehe
(integer) 0
10.0.0.16:6379> DEL hehe    #<==失败,没有key被删除
(integer) 0

q  同时删除多个key

10.0.0.16:6379> SET name "redis"
OK
10.0.0.16:6379> SET type "key-value store"
OK
10.0.0.16:6379> SET website "redis.com"
OK
10.0.0.16:6379> DEL name type website
(integer) 3

2.1.2 EXISTS

检查给定 key 是否存在。若 key 存在,返回 1 ,否则返回 0 

10.0.0.16:6379> SET db "redis"
OK
10.0.0.16:6379> EXISTS db
(integer) 1
10.0.0.16:6379> DEL db
(integer) 1
10.0.0.16:6379> EXISTS db
(integer) 0

2.1.3 EXPIRE

EXPIRE key seconds

为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除。在 Redis 中,带有生存时间的 key 被称为『易失的』(volatile)。使用 PERSIST 命令可以在不删除 key 的情况下,移除 key 的生存时间,让 key 重新成为一个『持久的』(persistent) key 

10.0.0.16:6379> SET cache_page "www.google.com"
OK
10.0.0.16:6379> EXPIRE cache_page 30
(integer) 1
10.0.0.16:6379> TTL cache_page
(integer) 26
10.0.0.16:6379> EXPIRE cache_page 3000
(integer) 1
10.0.0.16:6379> TTL cache_page
(integer) 2999
10.0.0.16:6379> PERSIST cache_page
(integer) 1
10.0.0.16:6379> TTL cache_page
(integer) -1

2.1.4 KEYS

KEYS pattern,查询符合给定模式patternkey

KEYS * :匹配数据库中所有的key

KEYS h?llo :匹配 hello  hallo  hxllo 等。

KEYS h*llo :匹配 hllo  heeeeello 等。

KEYS h[ae]llo :匹配 hello  hallo ,但不匹配 hillo 

注:KEYS 的速度非常快,但在一个大的数据库中使用它仍然可能造成性能问题,如果你需要从一个数据集中查找特定的 key ,你最好还是用 Redis 的集合结构(set)来代替。

10.0.0.16:6379> MSET one 1 two 2 three 3 four 4
OK
10.0.0.16:6379> KEYS *o*
1) "four"
2) "two"
3) "one"
10.0.0.16:6379> KEYS t??
1) "two"
10.0.0.16:6379> KEYS t????
1) "three"
10.0.0.16:6379> KEYS t[w]*
1) "two"
10.0.0.16:6379> KEYS *
1) "three"
2) "four"
3) "two"
4) "one"
5) "greeting"
6) "cache_page"

2.1.5 MIGRATE

MIGRATE host port key destination-db timeout [COPY] [REPLACE]

 key 原子性地从当前实例传送到目标实例的指定数据库上,一旦传送成功, key 保证会出现在目标实例上,而当前实例上的 key 会被删除。这个命令是一个原子操作,它在执行的时候会阻塞进行迁移的两个实例,直到以下任意结果发生:迁移成功,迁移失败,等待超时。

命令的内部实现是这样的:它在当前实例对给定 key 执行 DUMP 命令 ,将它序列化,然后传送到目标实例,目标实例再使用 RESTORE对数据进行反序列化,并将反序列化所得的数据添加到数据库中;当前实例就像目标实例的客户端那样,只要看到 RESTORE 命令返回 OK ,它就会调用 DEL 删除自己数据库上的 key 

timeout 参数以毫秒为格式,指定当前实例和目标实例进行沟通的最大间隔时间。这说明操作并不一定要在 timeout 毫秒内完成,只是说数据传送的时间不能超过这个 timeout 数。

MIGRATE 命令需要在给定的时间规定内完成 IO 操作。如果在传送数据时发生 IO 错误,或者达到了超时时间,那么命令会停止执行,并返回一个特殊的错误: IOERR 。当 IOERR 出现时,有以下两种可能:

1key 可能存在于两个实例

2key 可能只存在于当前实例

唯一不可能发生的情况就是丢失 key ,因此,如果一个客户端执行 MIGRATE 命令,并且不幸遇上 IOERR 错误,那么这个客户端唯一要做的就是检查自己数据库上的 key 是否已经被正确地删除。如果有其他错误发生,那么 MIGRATE 保证 key 只会出现在当前实例中。(当然,目标实例的给定数据库上可能有和 key 同名的键,不过这和 MIGRATE 命令没有关系)。

可选项:

COPY :不移除源实例上的 key 

REPLACE :替换目标实例上已存在的 key 

10.0.0.16上操作:

10.0.0.16:6379> flushdb
OK
10.0.0.16:6379> keys *
(empty list or set)
10.0.0.16:6379> clear
10.0.0.16:6379> SET greeting "Hellp from 10.0.0.16 6379 instance"
OK
10.0.0.16:6379> MIGRATE 10.0.0.11 6379 greeting 0 1000
OK
10.0.0.16:6379> EXISTS greeting
(integer) 0

10.0.0.11上操作:

10.0.0.11:6379> keys *
1) "greeting"
10.0.0.11:6379> get greeting
"Hellp from 10.0.0.16 6379 instance"

2.1.6 TYPE

返回key所存储的值的类型

返回值:

nonekey不存在)

string (字符串)

list (列表)

set (集合)

zset (有序集)

hash (哈希表)

10.0.0.16:6379> SET weather "sunny"
OK
10.0.0.16:6379> TYPE weather
string
10.0.0.16:6379> LPUSH book_list "programming in scala"
(integer) 1
10.0.0.16:6379> TYPE book_list
list
10.0.0.16:6379> SADD pat "dog"
(integer) 1
10.0.0.16:6379> TYPE pat
set

2.2 针对String

命令

命令说明

APPEND

 value 追加到 key 原来的值的末尾

STRLEN

返回 key 所储存的字符串值的长度

INCR

 key 中储存的数字值增一

INCRBY

 key 所储存的值加上增量 increment 

DECR

 key 中储存的数字值减一

DECRBY

 key 所储存的值减去减量 decrement 

GET

返回 key 所关联的字符串值

GETRANGE

返回 key 中字符串值的子字符串

MGET

返回所有(一个或多个)给定 key 的值

MSET

同时设置一个或多个 key-value 对。

2.2.1 APPEND

如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。

如果 key 不存在, APPEND 就简单地将给定 key 设为 value ,就像执行 SET key value 一样。

10.0.0.16:6379> EXISTS myphone
(integer) 0
10.0.0.16:6379> APPEND myphone "nokia"
(integer) 5
10.0.0.16:6379> APPEND myphone "- 1110"
(integer) 11
10.0.0.16:6379> GET myphone
"nokia- 1110"

2.2.2 DECR

DECR key

 key 中储存的数字值减一。

如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECR 操作。

如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。

本操作的值限制在 64 (bit)有符号数字表示之内。

10.0.0.16:6379> SET failure_times 10
OK
10.0.0.16:6379> DECR failure_times
(integer) 9
10.0.0.16:6379> DECR failure_times
(integer) 8
10.0.0.16:6379> EXISTS count
(integer) 0
10.0.0.16:6379> DECR count
(integer) -1
10.0.0.16:6379> set company YOUR_CODE_SUCKS.LIC
OK
10.0.0.16:6379> DECR company
(error) ERR value is not an integer or out of range

2.2.3 DECRBY

DECR key decrement

 key 中储存的数字值减去减量decrement

如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECRBY操作。

如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。

本操作的值限制在 64 (bit)有符号数字表示之内。

10.0.0.16:6379> SET count 100
OK
10.0.0.16:6379> DECRBY count 20
(integer) 80
10.0.0.16:6379> EXISTS pages
(integer) 0
10.0.0.16:6379> DECRBY pages 10
(integer) -10

2.2.4 GET

GET key

返回 key 所关联的字符串值。

如果 key 不存在那么返回特殊值 nil 

假如 key 储存的值不是字符串类型,返回一个错误,因为 GET 只能用于处理字符串值。

10.0.0.16:6379> GET db
(nil)
10.0.0.16:6379> SET db redis
OK
10.0.0.16:6379> GET db
"redis"
10.0.0.16:6379> DEL db
(integer) 1
10.0.0.16:6379> LPUSH db redis mongdb mysql
(integer) 3
10.0.0.16:6379> GET db
(error) WRONGTYPE Operation against a key holding the wrong kind of value

2.2.5 GETRANGE

GETRANGE key start end

返回 key 中字符串值的子字符串,字符串的截取范围由 start  end 两个偏移量决定(包括 start  end 在内)

负数偏移量表示从字符串最后开始计数, -1 表示最后一个字符, -2 表示倒数第二个,以此类推。

GETRANGE 通过保证子字符串的值域(range)不超过实际字符串的值域来处理超出范围的值域请求。

10.0.0.16:6379> SET greeting "hello, my friend"
OK
10.0.0.16:6379> GETRANGE greeting 0 4
"hello"
10.0.0.16:6379> GETRANGE greeting -1 -5         #<==不支持回绕操作
""
10.0.0.16:6379> GETRANGE greeting -5 -1
"riend"
10.0.0.16:6379> GETRANGE greeting 0 -1
"hello, my friend"

2.2.6 INCR

INCR key

 key 中储存的数字值增一。

如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。

如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。

本操作的值限制在 64 (bit)有符号数字表示之内。

10.0.0.16:6379> SET page_view 20
OK
10.0.0.16:6379> INCR page_view
(integer) 21
10.0.0.16:6379> INCR page_view
(integer) 22
10.0.0.16:6379> GET page_view
"22"

2.2.7 INCRBY

INCRBY key increment

 key 所储存的值加上增量 increment 

如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCRBY 命令。

如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。

本操作的值限制在 64 (bit)有符号数字表示之内。

10.0.0.16:6379> SET rank 50
OK
10.0.0.16:6379> INCRBY rank 20
(integer) 70
10.0.0.16:6379> GET rank
"70"
10.0.0.16:6379> EXISTS counter
(integer) 0
10.0.0.16:6379> INCRBY counter 20
(integer) 20
10.0.0.16:6379> GET counter
"20"
10.0.0.16:6379> SET book "long long ago..."
OK
10.0.0.16:6379> INCRBY book 20
(error) ERR value is not an integer or out of range

2.2.8 MGET

MGET key [key ...]

返回所有(一个或多个)给定 key 的值。

如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。因此,该命令永不失败。

10.0.0.16:6379> SET redis redis.com
OK
10.0.0.16:6379> SET mongodb mongodb.org
OK
10.0.0.16:6379> MGET redis mongodb
1) "redis.com"
2) "mongodb.org"
10.0.0.16:6379> MGET redis mongodb mysql
1) "redis.com"
2) "mongodb.org"
3) (nil)

2.2.9 MSET

MSET key value [key value ...]

同时设置一个或多个 key-value 对。

如果某个给定 key 已经存在,那么 MSET 会用新值覆盖原来的旧值,如果这不是你所希望的效果,请考虑使用 MSETNX 命令:它只会在所有给定 key 都不存在的情况下进行设置操作。

MSET 是一个原子性(atomic)操作,所有给定 key 都会在同一时间内被设置,某些给定 key 被更新而另一些给定 key 没有改变的情况,不可能发生。

10.0.0.16:6379> MSET date "2012.3.30" time "11:00 a.m." weather "sunny"
OK
10.0.0.16:6379> MGET date time weather
1) "2012.3.30"
2) "11:00 a.m."
3) "sunny"
10.0.0.16:6379> SET google "google.hk"
OK
10.0.0.16:6379> MSET google "google.com"
OK
10.0.0.16:6379> GET google
"google.com"

2.2.10 STRING

STRLEN key

返回 key 所储存的字符串值的长度。

 key 储存的不是字符串值时,返回一个错误。

10.0.0.16:6379> SET mykey "Hello World"
OK
10.0.0.16:6379> STRLEN mykey
(integer) 11
10.0.0.16:6379> STRLEN nonexisting
(integer) 0

2.3 针对Hash

命令

命令说明

HDEL

删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略

HEXISTS

查看哈希表 key 中,给定域 field 是否存在

HGET

返回哈希表 key 中给定域 field 的值

HGETALL

返回哈希表 key 中,所有的域和值。

HINCRBY

为哈希表 key 中的域 field 的值加上增量 increment 

HKEYS

返回哈希表 key 中的所有域

HMGET

返回哈希表 key 中,一个或多个给定域的值

HMSET

同时将多个 field-value (-)对设置到哈希表 key 

HSET

将哈希表 key 中的域 field 的值设为 value 

HSETNX

将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在

HVALS

返回哈希表 key 中所有域的值

2.3.1 HDEL

HDEL key field [field ...]

删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。

10.0.0.16:6379> HMSET abbr a apple b banana c cat d dog
OK
10.0.0.16:6379> HGETALL abbr
1) "a"
2) "apple"
3) "b"
4) "banana"
5) "c"
6) "cat"
7) "d"
8) "dog"
10.0.0.16:6379> HDEL abbr a
(integer) 1
10.0.0.16:6379> HDEL abbr not-exists-field
(integer) 0
10.0.0.16:6379> HDEL abbr b c
(integer) 2
10.0.0.16:6379> HGETALL abbr
1) "d"
2) "dog"

2.3.2 HEXISTS

HEXISTS key field

查看哈希表 key 中,给定域 field 是否存在。

10.0.0.16:6379> HEXISTS phone myphone
(integer) 0
10.0.0.16:6379> HSET phone myphone nokia-1110
(integer) 1
10.0.0.16:6379> HEXISTS phone myphone
(integer) 1

2.3.3 HGET

HGET key field

返回哈希表 key 中给定域 field 的值。

10.0.0.16:6379> HSET site redis redis.com
(integer) 1
10.0.0.16:6379> HGET site redis
"redis.com"
10.0.0.16:6379> HGET site mysql
(nil)

2.3.4 HGETALL

HGETALL key

返回哈希表 key 中,所有的域和值。

在返回值里,紧跟每个域名(field name)之后是域的值(value),所以返回值的长度是哈希表大小的两倍。

10.0.0.16:6379> HMSET people jacak "Jack Sparrow" gump "Forrest Gump"
OK
10.0.0.16:6379> HGETALL people
1) "jacak"
2) "Jack Sparrow"
3) "gump"
4) "Forrest Gump"

2.3.5 HINCRBY

HINCRBY key field increment

为哈希表 key 中的域 field 的值加上增量 increment 

增量也可以为负数,相当于对给定域进行减法操作。

如果 key 不存在,一个新的哈希表被创建并执行 HINCRBY 命令。

如果域 field 不存在,那么在执行命令前,域的值被初始化为 0 

对一个储存字符串值的域 field 执行 HINCRBY 命令将造成一个错误。

本操作的值被限制在 64 (bit)有符号数字表示之内。

# increment 为正数
redis> HEXISTS counter page_view    # 对空域进行设置
(integer) 0
redis> HINCRBY counter page_view 200
(integer) 200
redis> HGET counter page_view
"200"
# increment 为负数
redis> HGET counter page_view
"200"
redis> HINCRBY counter page_view -50
(integer) 150
redis> HGET counter page_view
"150"
# 尝试对字符串值的域执行HINCRBY命令
redis> HSET myhash string hello,world       # 设定一个字符串值
(integer) 1
redis> HGET myhash string
"hello,world"
redis> HINCRBY myhash string 1              # 命令执行失败,错误。
(error) ERR hash value is not an integer
redis> HGET myhash string                   # 原值不变
"hello,world"

2.3.6 HKEYS

HKEYS key

返回哈希表 key 中的所有域。

# 哈希表非空
redis> HMSET website google www.google.com yahoo www.yahoo.com
OK
redis> HKEYS website
1) "google"
2) "yahoo"
 
# 空哈希表/key不存在
redis> EXISTS fake_key
(integer) 0
redis> HKEYS fake_key
(empty list or set)

2.3.7 HMGET

HMGET key field [field ...]

返回哈希表 key 中,一个或多个给定域的值。

如果给定的域不存在于哈希表,那么返回一个 nil 值。

因为不存在的 key 被当作一个空哈希表来处理,所以对一个不存在的 key 进行 HMGET 操作将返回一个只带有 nil 值的表。

redis> HMSET pet dog "doudou" cat "nounou"    # 一次设置多个域
OK
 
redis> HMGET pet dog cat fake_pet             # 返回值的顺序和传入参数的顺序一样
1) "doudou"
2) "nounou"
3) (nil)                                      # 不存在的域返回nil值

2.3.8 HMSET

HMSET key field value [field value ...]

同时将多个 field-value (-)对设置到哈希表 key 中。

此命令会覆盖哈希表中已存在的域。

如果 key 不存在,一个空哈希表被创建并执行 HMSET 操作。


redis> HMSET website google www.google.com yahoo www.yahoo.com
OK
 
redis> HGET website google
"www.google.com"
 
redis> HGET website yahoo
www.yahoo.com


2.3.9 HSET

HSET key field value

将哈希表 key 中的域 field 的值设为 value 

如果 key 不存在,一个新的哈希表被创建并进行 HSET 操作。

如果域 field 已经存在于哈希表中,旧值将被覆盖。

redis> HSET website google "www.g.cn"       # 设置一个新域
(integer) 1
 
redis> HSET website google "www.google.com" # 覆盖一个旧域
(integer) 0

2.3.10 HVALS

HVALS key

返回哈希表 key 中所有域的值。

# 非空哈希表
redis> HMSET website google www.google.com yahoo www.yahoo.com
OK
redis> HVALS website
1) "www.google.com"
2) "www.yahoo.com"
 
# 空哈希表/不存在的key
redis> EXISTS not_exists
(integer) 0
redis> HVALS not_exists
(empty list or set)

2.4 针对List

命令

命令说明

LINDEX

返回列表 key 中,下标为 index 的元素

LINSERT

将值 value 插入到列表 key 当中,位于值 pivot 之前或之后

LPOP

移除并返回列表 key 的头元素

LPUSH

将一个或多个值 value 插入到列表 key 的表头

RPOP

移除并返回列表 key 的尾元素

RPUSH

将一个或多个值 value 插入到列表 key 的表尾(最右边)

2.4.1 LINDEX

LINDEX key index

返回列表 key 中,下标为 index 的元素。

下标(index)参数 start  stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。

你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。

如果 key 不是列表类型,返回一个错误。

redis> LPUSH mylist "World"
(integer) 1
redis> LPUSH mylist "Hello"
(integer) 2
redis> LINDEX mylist 0
"Hello"
redis> LINDEX mylist -1
"World"
redis> LINDEX mylist 3        # index不在 mylist 的区间范围内
(nil)

2.4.2 LINSERT

LINSERT key BEFORE|AFTER pivot value

将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。

 pivot 不存在于列表 key 时,不执行任何操作。

 key 不存在时, key 被视为空列表,不执行任何操作。

如果 key 不是列表类型,返回一个错误。

redis> RPUSH mylist "Hello"
(integer) 1
redis> RPUSH mylist "World"
(integer) 2
redis> LINSERT mylist BEFORE "World" "There"
(integer) 3
redis> LRANGE mylist 0 -1
1) "Hello"
2) "There"
3) "World"
 
# 对一个非空列表插入,查找一个不存在的 pivot
redis> LINSERT mylist BEFORE "go" "let's"
(integer) -1                                    # 失败
 
# 对一个空列表执行 LINSERT 命令
redis> EXISTS fake_list
(integer) 0
redis> LINSERT fake_list BEFORE "nono" "gogogog"
(integer) 0                                      # 失败

2.4.3 LPOP

LPOP key

移除并返回列表 key 的头元素。

redis> LLEN course
(integer) 0
redis> RPUSH course algorithm001
(integer) 1
redis> RPUSH course c++101
(integer) 2
redis> LPOP course  # 移除头元素
"algorithm001"

2.4.4 LPUSH

LPUSH key value [value ...]

将一个或多个值 value 插入到列表 key 的表头

如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表头: 比如说,对空列表 mylist 执行命令 LPUSH mylist a b c ,列表的值将是 c b a ,这等同于原子性地执行 LPUSH mylist a  LPUSH mylist b  LPUSH mylist c 三个命令。

如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作。

 key 存在但不是列表类型时,返回一个错误。

# 加入单个元素
redis> LPUSH languages python
(integer) 1
 
# 加入重复元素
redis> LPUSH languages python
(integer) 2
redis> LRANGE languages 0 -1     # 列表允许重复元素
1) "python"
2) "python"
 
# 加入多个元素
redis> LPUSH mylist a b c
(integer) 3
redis> LRANGE mylist 0 -1
1) "c"
2) "b"
3) "a"

2.4.5 RPOP

RPOP key

移除并返回列表 key 的尾元素。

redis> RPUSH mylist "one"
(integer) 1
redis> RPUSH mylist "two"
(integer) 2
redis> RPUSH mylist "three"
(integer) 3
redis> RPOP mylist           # 返回被弹出的元素
"three"
redis> LRANGE mylist 0 -1    # 列表剩下的元素
1) "one"
2) "two"

2.4.6 RPUSH

RPUSH key value [value ...]

将一个或多个值 value 插入到列表 key 的表尾(最右边)

如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表尾:比如对一个空列表 mylist 执行 RPUSH mylist a b c ,得出的结果列表为 a b c ,等同于执行命令 RPUSH mylist a  RPUSH mylist b  RPUSH mylist c 

如果 key 不存在,一个空列表会被创建并执行 RPUSH 操作。

 key 存在但不是列表类型时,返回一个错误。

# 添加单个元素
redis> RPUSH languages c
(integer) 1
# 添加重复元素
redis> RPUSH languages c
(integer) 2
redis> LRANGE languages 0 -1 # 列表允许重复元素
1) "c"
2) "c"
# 添加多个元素
redis> RPUSH mylist a b c
(integer) 3
redis> LRANGE mylist 0 -1
1) "a"
2) "b"
3) "c"

2.5 针对SET

命令

命令说明

SADD

将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略

SCARD

返回集合 key 的基数(集合中元素的数量)

SDIFF

返回一个集合的全部成员,该集合是所有给定集合之间的差集

SISMEMBER

判断 member 元素是否集合 key 的成员

SMEMBERS

返回集合 key 中的所有成员

SMOVE

 member 元素从 source 集合移动到 destination 集合

SREM

移除集合中的一个或多个 member 元素,不存在的 member 元素会被忽略

SUNION

返回一个集合的全部成员,该集合是所有给定集合的并集



2.5.1 SADD

SADD key member [member ...]

将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。

假如 key 不存在,则创建一个只包含 member 元素作成员的集合。

 key 不是集合类型时,返回一个错误。

# 添加单个元素
redis> SADD bbs "discuz.net"
(integer) 1
 
# 添加重复元素
redis> SADD bbs "discuz.net"
(integer) 0
 
# 添加多个元素
redis> SADD bbs "tianya.cn" "groups.google.com"
(integer) 2
redis> SMEMBERS bbs
1) "discuz.net"
2) "groups.google.com"
3) "tianya.cn"

2.5.2 SCARD

SCARD key

返回集合 key 的基数(集合中元素的数量)

redis> SADD tool pc printer phone
(integer) 3
redis> SCARD tool   # 非空集合
(integer) 3
redis> DEL tool
(integer) 1
redis> SCARD tool   # 空集合
(integer) 0

2.5.3 SDIFF

SDIFF key [key ...]

返回一个集合的全部成员,该集合是所有给定集合之间的差集。

不存在的 key 被视为空集。

redis> SMEMBERS peter's_movies
1) "bet man"
2) "start war"
3) "2012"
redis> SMEMBERS joe's_movies
1) "hi, lady"
2) "Fast Five"
3) "2012"
redis> SDIFF peter's_movies joe's_movies
1) "bet man"
2) "start war"

2.5.4 SISMEMBER

SISMEMBER key member

判断 member 元素是否集合 key 的成员。

如果 member 元素是集合的成员,返回 1 

如果 member 元素不是集合的成员,或 key 不存在,返回 0 

redis> SMEMBERS joe's_movies
1) "hi, lady"
2) "Fast Five"
3) "2012"
redis> SISMEMBER joe's_movies "bet man"
(integer) 0
redis> SISMEMBER joe's_movies "Fast Five"
(integer) 1

2.5.5 SMEMBERS

SMEMBERS key

返回集合 key 中的所有成员。

不存在的 key 被视为空集合。

# key 不存在或集合为空
redis> EXISTS not_exists_key
(integer) 0
redis> SMEMBERS not_exists_key
(empty list or set)
 
# 非空集合
redis> SADD language Ruby Python Clojure
(integer) 3
redis> SMEMBERS language
1) "Python"
2) "Ruby"
3) "Clojure"

2.5.6 SMOVE

SMOVE source destination member

 member 元素从 source 集合移动到 destination 集合。

SMOVE 是原子性操作。

如果 source 集合不存在或不包含指定的 member 元素,则 SMOVE 命令不执行任何操作,仅返回 0 。否则, member 元素从 source 集合中被移除,并添加到 destination 集合中去。

 destination 集合已经包含 member 元素时, SMOVE 命令只是简单地将 source 集合中的 member 元素删除。

 source  destination 不是集合类型时,返回一个错误。

redis> SMEMBERS songs
1) "Billie Jean"
2) "Believe Me"
redis> SMEMBERS my_songs
(empty list or set)
redis> SMOVE songs my_songs "Believe Me"
(integer) 1
redis> SMEMBERS songs
1) "Billie Jean"
redis> SMEMBERS my_songs
1)  "Believe Me"

2.5.7 SREM

SREM key member [member ...]

移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略。

 key 不是集合类型,返回一个错误。

# 测试数据
redis> SMEMBERS languages
1) "c"
2) "lisp"
3) "python"
4) "ruby"
# 移除单个元素
redis> SREM languages ruby
(integer) 1
 
# 移除不存在元素
redis> SREM languages non-exists-language
(integer) 0
 
# 移除多个元素
redis> SREM languages lisp python c
(integer) 3
redis> SMEMBERS languages
(empty list or set)

2.5.8 SUNION

SUNION key [key ...]

返回一个集合的全部成员,该集合是所有给定集合的并集。

不存在的 key 被视为空集。

redis> SMEMBERS songs
1) "Billie Jean"
 
redis> SMEMBERS my_songs
1) "Believe Me"
 
redis> SUNION songs my_songs
1) "Billie Jean"
2) "Believe Me"

 详细命令列表请查看官方帮助文档:https://redis.io/commands