Redis支持的数据结构及命令
第1章 支持数据结构类型
你也许已经知道Redis并不是简单的key-value存储,实际上他是一个数据结构服务器,支持不同类型的值。也就是说,你不必仅仅把字符串当作键所指向的值。下列这些数据类型都可作为值类型:
数据类型 |
说明 |
Strings(字符串) |
二进制安全的字符串 |
Lists(列表) |
按插入顺序排序的字符串元素的集合。他们基本上就是链表(linked lists)。 |
Sets(集合) |
不重复且无序的字符串元素的集合。 |
Sorted sets(有序集合) |
类似Sets,但是每个字符串元素都关联到一个叫score浮动数值(floating number value)。里面的元素总是通过score进行着排序,所以不同的是,它是可以检索的一系列元素。(例如你可能会问:给我前面10个或者后面10个元素)。 |
Hashes(散列) |
由field和关联的value组成的map。field和value都是字符串的 |
bitmaps |
通过特殊的命令,你可以将 String 值当作一系列 bits 处理:可以设置和清除单独的 bits,数出所有设为 1 的 bits 的数量,找到最前的被设为 1 或 0 的 bit,等等。 |
hyperloglog |
估计一个 set 中元素数量的概率性的数据结构。 |
geospatial(地理空间) |
第2章 Redis常用命令
Redis命令十分丰富,包括的命令组有Cluster、Connection、Geo、Hashes、HyperLogLog、Keys、Lists、Pub/Sub、Scripting、Server、Sets、Sorted Sets、Strings、Transactions一共14个redis命令组两百多个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,查询符合给定模式pattern的key。
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 出现时,有以下两种可能:
1)key 可能存在于两个实例
2)key 可能只存在于当前实例
唯一不可能发生的情况就是丢失 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所存储的值的类型
返回值:
none(key不存在)
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