String字符串

Redis 字符串是字节序列。Redis 字符串是二进制安全的,意味着他们有一个已知的长度没有任何特殊字符终止,所以可以存储任何东西,512 M为上限,主要的还是操作键值对。String的数据结构是简单的Key-Value模型,Value可以是字符串,也可以是数字

set key value

普通添加

  1. # 添加key=name value=wangpengliang
  2. 127.0.0.1:6379> set name wangpengliang
  3. OK
  4. 127.0.0.1:6379> get name
  5. "wangpengliang"
  6. 127.0.0.1:6379>

setex key seconds value

添加时设置过期时间

  1. # 添加key=name value=wangpengliang 设置30秒后过期
  2. 127.0.0.1:6379> setex name 30 wangpengliang
  3. OK
  4. 127.0.0.1:6379> get name
  5. "wangpengliang"

ttl

检查key还有多少秒过期

  1. 127.0.0.1:6379> setex name 30 wangpengliang
  2. OK
  3. 127.0.0.1:6379> get name
  4. "wangpengliang"
  5. # 查看距离过期时间还有多少秒
  6. 127.0.0.1:6379> ttl name
  7. (integer) 18
  8. 127.0.0.1:6379>

setnx key value

如果key不存在,则创建一个key,如果key存在,则创建失败并返回0;setnx在分布式锁中经常使用到

  1. # 设置key=name value=wangpengliang
  2. 127.0.0.1:6379> set name wangpengliang
  3. OK
  4. # 检查是否设置成功
  5. 127.0.0.1:6379> get name
  6. "wangpengliang"
  7. # 使用setnx设置key=name:因为已存在所以创建失败返回0
  8. 127.0.0.1:6379> setnx name wangpengliang
  9. (integer) 0
  10. # 清空数据库
  11. 127.0.0.1:6379> FLUSHDB
  12. OK
  13. # 重新使用setnx设置key=name:返回1说明创建成功
  14. 127.0.0.1:6379> setnx name wangpengliang
  15. (integer) 1
  16. # 检查是否设置成功
  17. 127.0.0.1:6379> get name
  18. "wangpengliang"

get key

获取指定key的value

  1. 127.0.0.1:6379> set name wangpengliang
  2. OK
  3. 127.0.0.1:6379> get name
  4. "wangpengliang"

mset/mget

用于同时设置/获取一个或多个键值对,批量操作;同时设置多个值,如果其中有一个存在,那么就都创建失败;要么一起成功,要么一起失败,这是一个原子性操作

  1. # 使用mset同时设置多个k-v
  2. 127.0.0.1:6379> mset name1 wangpengliang name2 lizimeng name3 shijiangtao
  3. OK
  4. # 使用met同时读取多个k-v
  5. 127.0.0.1:6379> mget name1 name2 name3
  6. 1) "wangpengliang"
  7. 2) "lizimeng"
  8. 3) "shijiangtao"

incr

让当前键值以 1 的数量递增,并返回递增后的值。相当于C#中的i++

  1. # 设置key=num value=10
  2. 127.0.0.1:6379> set num 10
  3. OK
  4. 127.0.0.1:6379> get num
  5. "10"
  6. # 设置key=num value=value+1
  7. 127.0.0.1:6379> incr num
  8. (integer) 11

incrby

可以指定参数一次增加的数值,并返回递增后的值;设置步长的方式递增

  1. # 设置key=num value=10
  2. 127.0.0.1:6379> set num 10
  3. OK
  4. 127.0.0.1:6379> get num
  5. "10"
  6. # 设置key=num value=value+2(2是步长)
  7. 127.0.0.1:6379> incrby num 2
  8. (integer) 12

decr

让当前键值以 1 的数量递减,并返回递减后的值。相当于C#中的i—

  1. # 设置key=num value=10
  2. 127.0.0.1:6379> set num 10
  3. OK
  4. 127.0.0.1:6379> get num
  5. "10"
  6. # 设置key=num value=value-1
  7. 127.0.0.1:6379> decr num
  8. (integer) 9

decrby

可以指定参数一次减少的数值,并返回递减后的值;设置步长的方式递减

  1. # 设置key=num value=10
  2. OK
  3. 127.0.0.1:6379> get num
  4. "10"
  5. # 设置key=num value=value-2(2是步长)
  6. 127.0.0.1:6379> incrby num 2
  7. (integer) 8

append

向键值的末尾追加 value。如果键不存在则将该键的值设置为 value。返回值是追加后字符串的总长度

  1. 127.0.0.1:6379> append name wang
  2. (integer) 4
  3. 127.0.0.1:6379> get name
  4. "wang"
  1. 127.0.0.1:6379> set name wang
  2. OK
  3. 127.0.0.1:6379> get name
  4. "wang"
  5. 127.0.0.1:6379> append name pengliang
  6. (integer) 13
  7. 127.0.0.1:6379> get name
  8. "wangpengliang"

strlen

获取字符串长度

  1. 127.0.0.1:6379> set name wangpengliang
  2. OK
  3. 127.0.0.1:6379> strlen name
  4. (integer) 13

getrange

截取指定索引的字符串,相当于Substring

  1. 127.0.0.1:6379> set name wangpengliang
  2. OK
  3. 127.0.0.1:6379> get name
  4. "wangpengliang"
  5. 127.0.0.1:6379> getrange name 0 3
  6. "wang"

setrange

从指定索引开始替换字符串

  1. 127.0.0.1:6379> set name hello
  2. OK
  3. 127.0.0.1:6379> get name
  4. "hello"
  5. 127.0.0.1:6379> setrange name 0 world
  6. (integer) 5
  7. 127.0.0.1:6379> get name
  8. "world"
  1. 127.0.0.1:6379> set name "hello java"
  2. OK
  3. 127.0.0.1:6379> get name
  4. "hello java"
  5. 127.0.0.1:6379> setrange name 6 "csharp"
  6. (integer) 12
  7. 127.0.0.1:6379> get name
  8. "hello csharp"
  1. 127.0.0.1:6379> set name "hello csharp"
  2. OK
  3. 127.0.0.1:6379> get name
  4. "hello csharp"
  5. 127.0.0.1:6379> setrange name 6 "java"
  6. (integer) 12
  7. 127.0.0.1:6379> get name
  8. "hello javarp"

注意:命令会确保字符串足够长以便将 value 设置在指定的偏移量上,如果给定 key 原来储存的字符串长度比偏移量小(比如字符串只有 5 个字符长,但你设置的 offset10 ),那么原字符和偏移量之间的空白将用零字节(zerobytes, "\x00" )来填充

del

根据key删除一个或者多个元素

  1. 127.0.0.1:6379> set name wangpengliang
  2. OK
  3. 127.0.0.1:6379> get name
  4. "wangpengliang"
  5. 127.0.0.1:6379> del name
  6. (integer) 1
  7. 127.0.0.1:6379> get name
  8. (nil)
  1. 127.0.0.1:6379> mset k1 wangpengliang k2 lizimeng
  2. OK
  3. 127.0.0.1:6379> mget k1 k2
  4. 1) "wangpengliang"
  5. 2) "lizimeng"
  6. 127.0.0.1:6379> del k1 k2
  7. (integer) 2
  8. 127.0.0.1:6379> mget k1 k2
  9. 1) (nil)
  10. 2) (nil)

对象方式设置

设置一个user:1对象,值为Json字符串来保存一个对象;set user:1 {name:zhangsan,age:3}

  1. # 设置key=num value=10
  2. 127.0.0.1:6379> set num 10
  3. OK
  4. 127.0.0.1:6379> get num
  5. "10"
  6. # 设置key=num value=value-1
  7. 127.0.0.1:6379> decr num
  8. (integer) 9
  1. 127.0.0.1:6379> mset user:1:name wangpengliang user:1:age 25
  2. OK
  3. 127.0.0.1:6379> mget user:1:name user:1:age
  4. 1) "wangpengliang"
  5. 2) "25"

getset

先get然后再set 如果设置的键不存在值,则设置值,并且返回nil
如果设置的键存在值,则返回该值,并设置新的值

  1. 127.0.0.1:6379> getset name wangpengliang
  2. (nil)
  3. 127.0.0.1:6379> get name
  4. "wangpengliang"
  5. 127.0.0.1:6379> getset name lizimeng
  6. "wangpengliang"
  7. 127.0.0.1:63

应用场景

  • 计数器—点赞,视频播放量,每播放一次就+1
  • 统计多单位的数量
  • 粉丝数
  • 对象缓存存储

Hash散列表

image.png

Redis 的哈希是键值对的集合。Redis 的哈希值是字符串字段和字符串值之间的映射,因此它们被用来表示对象,还有用户信息之类的,经常变动的信息

hset

存储一个哈希键值对的集合。格式:hset key field value

  1. 127.0.0.1:6379> hset user name wangpengliang age 25
  2. (integer) 2
  3. 127.0.0.1:6379> hget user name
  4. "wangpengliang"
  5. 127.0.0.1:6379> hget user age
  6. "25"

hget

获取一个哈希键的值。格式:hget key field

  1. 127.0.0.1:6379> hset user name wangpengliang age 25
  2. (integer) 2
  3. 127.0.0.1:6379> hget user name
  4. "wangpengliang"

hmset

存储一个或多个哈希是键值对的集合。格式:hmset key field1 value1 …fieldN keyN

  1. 127.0.0.1:6379> hmset user1 name wangpengliang age 25 address beijing
  2. OK
  3. 127.0.0.1:6379> hmget user1 name age address
  4. 1) "wangpengliang"
  5. 2) "25"
  6. 3) "beijing"

hmget

获取多个指定的键的值。格式:hmget key field1 … fieldN

  1. 127.0.0.1:6379> hset user name wangpengliang age 25
  2. (integer) 2
  3. 127.0.0.1:6379> hget user name
  4. "wangpengliang"

hexists

判断哈希表中的字段名是否存在 如果存在返回 1 否则返回 0。格式:hexists key field

  1. 127.0.0.1:6379> hmset user1 name wangpengliang age 25 address beijing
  2. OK
  3. 127.0.0.1:6379> hmget user1 name age address
  4. 1) "wangpengliang"
  5. 2) "25"
  6. 3) "beijing"
  7. 127.0.0.1:6379> hexists user1 name
  8. (integer) 1
  9. 127.0.0.1:6379> hexists user1 aa
  10. (integer) 0

hdel

删除一个或多个字段。格式:hdel key field

  1. 127.0.0.1:6379> hmset user name wangpengliang age 25
  2. OK
  3. 127.0.0.1:6379> hmget user name age
  4. 1) "wangpengliang"
  5. 2) "25"
  6. 127.0.0.1:6379> hdel user name
  7. (integer) 1
  8. 127.0.0.1:6379> hmget user name age
  9. 1) (nil)
  10. 2) "25"

hgetall

获取一个哈希是键值对的集合。 格式:hgetall key

  1. 127.0.0.1:6379> hmset user name wangpengliang age 25
  2. OK
  3. 127.0.0.1:6379> hgetall user
  4. 1) "age"
  5. 2) "25"
  6. 3) "name"
  7. 4) "wangpengliang"

hvals

只返回字段值。 格式:hvals key

  1. 127.0.0.1:6379> hmset user name wangpengliang age 25
  2. OK
  3. 127.0.0.1:6379> hvals user
  4. 1) "25"
  5. 2) "wangpengliang"

hkeys

只返回字段名。 格式:hkeys key

  1. 127.0.0.1:6379> hmset user name wangpengliang age 25
  2. OK
  3. 127.0.0.1:6379> hkeys user
  4. 1) "age"
  5. 2) "name"

hlen

返回 key 的 hash 的元素个数

  1. 127.0.0.1:6379> hmset user name wangpengliang age 25
  2. OK
  3. 127.0.0.1:6379> hlen user
  4. (integer) 2

hincrby key field value

指定增量value

  1. 127.0.0.1:6379> hset test num 10
  2. (integer) 1
  3. 127.0.0.1:6379> hget test num
  4. "10"
  5. 127.0.0.1:6379> hincrby test num 2
  6. (integer) 12

hsetnx key field value

如果该键不存在就创建,如果该键存在就创建失败

  1. 127.0.0.1:6379> hsetnx test num 10
  2. (integer) 1
  3. 127.0.0.1:6379> hsetnx test num 20
  4. (integer) 0

应用场景

  • 主要用于存储部分变更数据,比如存储用户信息等等

List链表

Redis 的链表是简单的字符串列表,排序插入顺序。可以添加元素到 Redis 的列表的头部或尾部
Lpush:表示的是向链表的左添加,也就是向链表的头添加
Rpush:表示的是向链表的右添加,也就是向链表的尾添加

lpush key value

向链表左侧添加(头插法)

  1. 127.0.0.1:6379> lpush keys one
  2. (integer) 1
  3. 127.0.0.1:6379> lpush keys two
  4. (integer) 2
  5. 127.0.0.1:6379> lpush keys three
  6. (integer) 3
  7. 127.0.0.1:6379> lrange keys 0 -1
  8. 1) "three"
  9. 2) "two"
  10. 3) "one"

rpush key value

向链表右侧添加(尾插法)

  1. 127.0.0.1:6379> rpush keys one
  2. (integer) 1
  3. 127.0.0.1:6379> rpush keys two
  4. (integer) 2
  5. 127.0.0.1:6379> rpush keys three
  6. (integer) 3
  7. 127.0.0.1:6379> lrange keys 0 -1
  8. 1) "one"
  9. 2) "two"
  10. 3) "three"

lpop key

从左边移出一个元素

  1. 127.0.0.1:6379> rpush keys one
  2. (integer) 1
  3. 127.0.0.1:6379> rpush keys two
  4. (integer) 2
  5. 127.0.0.1:6379> rpush keys three
  6. (integer) 3
  7. 127.0.0.1:6379> lrange keys 0 -1
  8. 1) "one"
  9. 2) "two"
  10. 3) "three"
  11. 127.0.0.1:6379> lpop keys
  12. "one"
  13. 127.0.0.1:6379> lrange keys 0 -1
  14. 1) "two"
  15. 2) "three"

rpop key

从右边移出一个元素

  1. 127.0.0.1:6379> rpush keys one
  2. (integer) 1
  3. 127.0.0.1:6379> rpush keys two
  4. (integer) 2
  5. 127.0.0.1:6379> rpush keys three
  6. (integer) 3
  7. 127.0.0.1:6379> rpop keys
  8. "three"
  9. 127.0.0.1:6379> lrange keys 0 -1
  10. 1) "one"
  11. 2) "two"

lrange key start end

命令将返回索引从 start 到 stop 之间的所有元素。Redis 的列表起始索引为 0。如果要获取全部的元素:lrange key 0 -1

  1. 127.0.0.1:6379> rpush keys one
  2. (integer) 1
  3. 127.0.0.1:6379> rpush keys two
  4. (integer) 2
  5. 127.0.0.1:6379> lrange keys 0 -1
  6. 1) "one"
  7. 2) "two"

llen key

返回链表中元素的个数 相当于关系型数据库中 select count(*)

  1. 127.0.0.1:6379> rpush keys one
  2. (integer) 1
  3. 127.0.0.1:6379> rpush keys two
  4. (integer) 2
  5. 127.0.0.1:6379> lrange keys 0 -1
  6. 1) "one"
  7. 2) "two"
  8. 127.0.0.1:6379> llen keys
  9. (integer) 2

lindex key indexnumber

lindex 命令用来返回指定索引的元素,索引从 0 开始,如果是负数表示从右边开始计算的索引,最右边元素的索引是-1。如果要将列表类型当做数组来用,lindex 命令是必不可少的

  1. 127.0.0.1:6379> rpush keys one
  2. (integer) 1
  3. 127.0.0.1:6379> rpush keys two
  4. (integer) 2
  5. 127.0.0.1:6379> rpush keys three
  6. (integer) 3
  7. 127.0.0.1:6379> lrange keys 0 -1
  8. 1) "one"
  9. 2) "two"
  10. 3) "three"
  11. 127.0.0.1:6379> lindex keys 2
  12. "three"

lset key indexnumber value

它会将索引为 index的元素赋值为 value,原来的值会被覆盖。如果该列表不存在就会报错。所以使用这个命令之前先使用exists判断一下

  1. 127.0.0.1:6379> rpush keys one
  2. (integer) 1
  3. 127.0.0.1:6379> rpush keys two
  4. (integer) 2
  5. 127.0.0.1:6379> rpush keys three
  6. (integer) 3
  7. 127.0.0.1:6379> lrange keys 0 -1
  8. 1) "one"
  9. 2) "two"
  10. 3) "three"
  11. 127.0.0.1:6379> lset keys 2 twotwo
  12. OK
  13. 127.0.0.1:6379> lrange keys 0 -1
  14. 1) "one"
  15. 2) "two"
  16. 3) "twotwo"
  17. 127.0.0.1:6379> lset keys 10 twotwo
  18. (error) ERR index out of range

lrem key count value

移除key链表中count个元素的value值,精确匹配,如果链表中可以有多个重复的值,这里的count指的是可以删除多个相同key的值

  1. 127.0.0.1:6379> rpush keys a
  2. (integer) 1
  3. 127.0.0.1:6379> rpush keys b
  4. (integer) 2
  5. 127.0.0.1:6379> rpush keys c
  6. (integer) 3
  7. 127.0.0.1:6379> lrange keys 0 -1
  8. 1) "a"
  9. 2) "b"
  10. 3) "c"
  11. 127.0.0.1:6379> rpush keys d
  12. (integer) 4
  13. 127.0.0.1:6379> rpush keys a
  14. (integer) 5
  15. 127.0.0.1:6379> lrange keys 0 -1
  16. 1) "a"
  17. 2) "b"
  18. 3) "c"
  19. 4) "d"
  20. 5) "a"
  21. 127.0.0.1:6379> lrem keys 2 a
  22. (integer) 2
  23. 127.0.0.1:6379> lrange keys 0 -1
  24. 1) "b"
  25. 2) "c"
  26. 3) "d"

ltrim list startIndex endIndex

通过下标截取指定的长度,这个时候List已经改变了,只剩下截断的元素

  1. 127.0.0.1:6379> clear
  2. 127.0.0.1:6379> rpush keys a
  3. (integer) 1
  4. 127.0.0.1:6379> rpush keys b
  5. (integer) 2
  6. 127.0.0.1:6379> rpush keys c
  7. (integer) 3
  8. 127.0.0.1:6379> rpush keys d
  9. (integer) 4
  10. 127.0.0.1:6379> lrange keys 0 -1
  11. 1) "a"
  12. 2) "b"
  13. 3) "c"
  14. 4) "d"
  15. 127.0.0.1:6379> ltrim keys 2 3
  16. OK
  17. 127.0.0.1:6379> lrange keys 0 -1
  18. 1) "c"
  19. 2) "d"

rpoplpush source destination

移除当前的source链表中的最后一个元素,并且将该元素移动到destination链表当中

  1. 127.0.0.1:6379> rpush keys1 a
  2. (integer) 1
  3. 127.0.0.1:6379> rpush keys1 b
  4. (integer) 2
  5. 127.0.0.1:6379> rpush keys1 c
  6. (integer) 3
  7. 127.0.0.1:6379> rpoplpush keys1 keys2
  8. "c"
  9. 127.0.0.1:6379> lrange keys1 0 -1
  10. 1) "a"
  11. 2) "b"
  12. 127.0.0.1:6379> lrange keys2 0 -1
  13. 1) "c"

linsert key BEFORE|AFTER pivot value

在Key列表的指定元素的前/后面插入元素value

  1. 127.0.0.1:6379> rpush keys1 a
  2. (integer) 1
  3. 127.0.0.1:6379> rpush keys1 b
  4. (integer) 2
  5. 127.0.0.1:6379> rpush keys1 c
  6. (integer) 3
  7. 127.0.0.1:6379> linsert keys1 before b a1
  8. (integer) 4
  9. 127.0.0.1:6379> lrange keys 0 -1
  10. (empty array)
  11. 127.0.0.1:6379> lrange keys1 0 -1
  12. 1) "a"
  13. 2) "a1"
  14. 3) "b"
  15. 4) "c"
  16. 127.0.0.1:6379> linsert keys1 after b b1
  17. (integer) 5
  18. 127.0.0.1:6379> lrange keys1 0 -1
  19. 1) "a"
  20. 2) "a1"
  21. 3) "b"
  22. 4) "b1"
  23. 5) "c"
  • List是一个链表,before node after,left ,right都可以插入值
  • 如果key不存在,就创建新的链表
  • 如果key存在就创建新的值
  • 如果移除了所有的值,空链表,也就代表不存在
  • 在两边插入或者改动值,效率最高,中间元素相对来说效率会低一点

应用场景

  • 消息队列:利用List的PUSH操作,将任务存在List中,然后工作线程再用POP操作将任务取出进行执行。Redis还提供了操作List中某一段的api,你可以直接查询,删除List中某一段的元素
  • 消息排队,消息队列(Lpush、Rpop)、栈(Lpush、Lpop)使用list可以构建队列系统,使用sorted set甚至可以构建有优先级的队列系统

Set集合

Redis 的集合是字符串的无序集合。但在Set集合当中,是不允许有重复的。Set是通过hash table实现的,可以进行添加、删除和查找。对集合可以取 并集交集差集

sadd key value

添加一个 string 元素到key对应的 set 集合中, 成功返回 1,如果元素已经在集合中返回 0

  1. 127.0.0.1:6379> sadd keys a
  2. (integer) 1
  3. 127.0.0.1:6379> sadd keys b
  4. (integer) 1
  5. 127.0.0.1:6379> sadd keys a
  6. (integer) 0
  7. 127.0.0.1:6379> sadd keys c
  8. (integer) 1
  9. 127.0.0.1:6379> smembers keys
  10. 1) "c"
  11. 2) "a"
  12. 3) "b"

scard key

返回 set 的元素个数,如果 set 是空或者key不存在返回 0

  1. 127.0.0.1:6379> sadd keys a
  2. (integer) 1
  3. 127.0.0.1:6379> sadd keys b
  4. (integer) 1
  5. 127.0.0.1:6379> sadd keys c
  6. (integer) 1
  7. 127.0.0.1:6379> smembers keys
  8. 1) "c"
  9. 2) "a"
  10. 3) "b"
  11. 127.0.0.1:6379> scard keys
  12. (integer) 3

smembers key

返回 key 对应 set 的所有元素,结果是无序的

  1. 127.0.0.1:6379> sadd keys a
  2. (integer) 1
  3. 127.0.0.1:6379> sadd keys b
  4. (integer) 1
  5. 127.0.0.1:6379> sadd keys c
  6. (integer) 1
  7. 127.0.0.1:6379> smembers keys
  8. 1) "c"
  9. 2) "a"
  10. 3) "b"

sismember key value

判断 value 是否在 set 中,存在返回1,0表示不存在或者key不存在

  1. 127.0.0.1:6379> sadd keys a
  2. (integer) 1
  3. 127.0.0.1:6379> sadd keys b
  4. (integer) 1
  5. 127.0.0.1:6379> sadd keys c
  6. (integer) 1
  7. 127.0.0.1:6379> smembers keys
  8. 1) "c"
  9. 2) "a"
  10. 3) "b"
  11. 127.0.0.1:6379> sismember keys a
  12. (integer) 1
  13. 127.0.0.1:6379> sismember keys d
  14. (integer) 0

srem key value

从 key 对应 set 中移除给定元素,成功返回1,如果 value 在集合中不存在或者key不存在返回 0

  1. 127.0.0.1:6379> sadd keys a
  2. (integer) 1
  3. 127.0.0.1:6379> sadd keys b
  4. (integer) 1
  5. 127.0.0.1:6379> sadd keys c
  6. (integer) 1
  7. 127.0.0.1:6379> smembers keys
  8. 1) "c"
  9. 2) "a"
  10. 3) "b"
  11. 127.0.0.1:6379> srem keys a
  12. (integer) 1
  13. 127.0.0.1:6379> smembers keys
  14. 1) "c"
  15. 2) "b"
  16. 127.0.0.1:6379> srem keys g
  17. (integer) 0

srandmember key nums

从key集合中随机抽取nums个元素

  1. 127.0.0.1:6379> sadd keys a
  2. (integer) 1
  3. 127.0.0.1:6379> sadd keys b
  4. (integer) 1
  5. 127.0.0.1:6379> sadd keys c
  6. (integer) 1
  7. 127.0.0.1:6379> srandmember keys 2
  8. 1) "a"
  9. 2) "c"

spop key

随机删除一些key集合中的元素

  1. 127.0.0.1:6379> sadd keys a
  2. (integer) 1
  3. 127.0.0.1:6379> sadd keys b
  4. (integer) 1
  5. 127.0.0.1:6379> sadd keys c
  6. (integer) 1
  7. 127.0.0.1:6379> spop keys
  8. "a"
  9. 127.0.0.1:6379> smembers keys
  10. 1) "c"
  11. 2) "b"

smove source destination member

将原集合source中的member元素移动到destination集合中

  1. 127.0.0.1:6379> sadd keys a
  2. (integer) 1
  3. 127.0.0.1:6379> sadd keys b
  4. (integer) 1
  5. 127.0.0.1:6379> sadd keys c
  6. (integer) 1
  7. 127.0.0.1:6379> smove keys keys2 a
  8. (integer) 1
  9. 127.0.0.1:6379> smembers keys
  10. 1) "c"
  11. 2) "b"
  12. 127.0.0.1:6379> smembers keys2
  13. 1) "a"

sdiff key1 key2

取出key1中与key2集合的不同元素,差集

  1. 127.0.0.1:6379> sadd keys1 a
  2. (integer) 1
  3. 127.0.0.1:6379> sadd keys1 b
  4. (integer) 1
  5. 127.0.0.1:6379> sadd keys1 c
  6. (integer) 1
  7. 127.0.0.1:6379> sadd keys2 c
  8. (integer) 1
  9. 127.0.0.1:6379> sadd keys2 g
  10. (integer) 1
  11. 127.0.0.1:6379> sadd keys2 f
  12. (integer) 1
  13. 127.0.0.1:6379> sdiff keys1 keys2
  14. 1) "a"
  15. 2) "b"

sinter key1 key2

取key1与key2两个集合中相同的元素,交集

  1. 127.0.0.1:6379> sadd keys1 a
  2. (integer) 1
  3. 127.0.0.1:6379> sadd keys1 b
  4. (integer) 1
  5. 127.0.0.1:6379> sadd keys1 c
  6. (integer) 1
  7. 127.0.0.1:6379> sadd keys2 c
  8. (integer) 1
  9. 127.0.0.1:6379> sadd keys2 g
  10. (integer) 1
  11. 127.0.0.1:6379> sadd keys2 f
  12. (integer) 1
  13. 127.0.0.1:6379> sinter keys1 keys2
  14. 1) "c"

sunion key1 key2

将key1与key2两个集合中的元素合在一起,并集

  1. 127.0.0.1:6379> sadd keys1 a
  2. (integer) 1
  3. 127.0.0.1:6379> sadd keys1 b
  4. (integer) 1
  5. 127.0.0.1:6379> sadd keys1 c
  6. (integer) 1
  7. 127.0.0.1:6379> sadd keys2 c
  8. (integer) 1
  9. 127.0.0.1:6379> sadd keys2 g
  10. (integer) 1
  11. 127.0.0.1:6379> sadd keys2 f
  12. (integer) 1
  13. 127.0.0.1:6379> sunion keys1 keys2
  14. 1) "a"
  15. 2) "c"
  16. 3) "g"
  17. 4) "b"
  18. 5) "f"

应用场景

  • 微博、用户将所有关注的人都放入到一个set集合当中,将它的粉丝也放在一个集合中
  • 共同关注、共同爱好、二度好友、QQ的好友推荐(六度分割理论)

SortedSet( 有序集合) zset

Redis 的有序集合类似于 Redis 的集合,字符串不重复的集合;zset是一个有序集合,每一个成员有一个分数与之对应,成员不可以重复,但是分数是可以重复的,zset会自动用分数对成员进行排序

zadd key score value

将一个或多个 value 及其 socre 加入到 set 中

  1. 127.0.0.1:6379> zadd keys 1 a
  2. (integer) 1
  3. 127.0.0.1:6379> zrange keys 0 -1
  4. 1) "a"

zrange key start end

0 和-1 表示从索引为 0 的元素到最后一个元素(同 LRANGE 命令相似)

  1. 127.0.0.1:6379> zadd keys 1 a
  2. (integer) 1
  3. 127.0.0.1:6379> zrange keys 0 -1
  4. 1) "a"

zrange key 0 -1 withscores

连同 score 一块输出,使用 WITHSCORES 参数

  1. 127.0.0.1:6379> zadd keys 1 a
  2. (integer) 1
  3. 127.0.0.1:6379> zadd keys 2 b
  4. (integer) 1
  5. 127.0.0.1:6379> zadd keys 3 c
  6. (integer) 1
  7. 127.0.0.1:6379> zrange keys 0 -1 withscores
  8. 1) "a"
  9. 2) "1"
  10. 3) "b"
  11. 4) "2"
  12. 5) "c"
  13. 6) "3"

zremrangebyscore key start end

范围删除操作

  1. 127.0.0.1:6379> zadd keys 1 a
  2. (integer) 1
  3. 127.0.0.1:6379> zadd keys 2 b
  4. (integer) 1
  5. 127.0.0.1:6379> zadd keys 3 c
  6. (integer) 1
  7. 127.0.0.1:6379> zrange keys 0 -1 withscores
  8. 1) "a"
  9. 2) "1"
  10. 3) "b"
  11. 4) "2"
  12. 5) "c"
  13. 6) "3"
  14. 127.0.0.1:6379> zremrangebyscore keys 0 2
  15. (integer) 2
  16. 127.0.0.1:6379> zrange keys 0 -1 withscores
  17. 1) "c"
  18. 2) "3"

zrangebyscore key min max

升序排序操作,将key按最小值到最大值进行输出

  1. 127.0.0.1:6379> zadd keys 1 a
  2. (integer) 1
  3. 127.0.0.1:6379> zadd keys 2 b
  4. (integer) 1
  5. 127.0.0.1:6379> zadd keys 3 c
  6. (integer) 1
  7. 127.0.0.1:6379> zrangebyscore keys 1 3
  8. 1) "a"
  9. 2) "b"
  10. 3) "c"

srandmember key nums

倒序排序操作,将key按照从大到小排序输出

  1. 127.0.0.1:6379> zadd keys 1 a
  2. (integer) 1
  3. 127.0.0.1:6379> zadd keys 2 b
  4. (integer) 1
  5. 127.0.0.1:6379> zadd keys 3 c
  6. (integer) 1
  7. 127.0.0.1:6379> zrevrangebyscore keys 3 1
  8. 1) "c"
  9. 2) "b"
  10. 3) "a"

zrem key value

删除指定的元素

  1. 127.0.0.1:6379> zadd keys 1 a
  2. (integer) 1
  3. 127.0.0.1:6379> zadd keys 2 b
  4. (integer) 1
  5. 127.0.0.1:6379> zadd keys 3 c
  6. (integer) 1
  7. 127.0.0.1:6379> zrem keys b
  8. (integer) 1
  9. 127.0.0.1:6379> zrange keys 0 -1
  10. 1) "a"
  11. 2) "c"
  12. 127.0.0.1:6379> zrem keys d
  13. (integer) 0
  14. 127.0.0.1:6379> zrange keys 0 -1
  15. 1) "a"
  16. 2) "c"

zcard key

获取有序集合中的个数

  1. 127.0.0.1:6379> zadd keys 1 a
  2. (integer) 1
  3. 127.0.0.1:6379> zadd keys 2 b
  4. (integer) 1
  5. 127.0.0.1:6379> zadd keys 3 c
  6. (integer) 1
  7. 127.0.0.1:6379> zrem keys b
  8. (integer) 1
  9. 127.0.0.1:6379> zrange keys 0 -1
  10. 1) "a"
  11. 2) "c"
  12. 127.0.0.1:6379> zrem keys d
  13. (integer) 0
  14. 127.0.0.1:6379> zrange keys 0 -1
  15. 1) "a"
  16. 2) "c"
  17. 127.0.0.1:6379> zcard keys
  18. (integer) 2

count key min max

获取指定区间的成员数量

  1. 127.0.0.1:6379> zadd keys 1 a
  2. (integer) 1
  3. 127.0.0.1:6379> zadd keys 2 b
  4. (integer) 1
  5. 127.0.0.1:6379> zadd keys 3 c
  6. (integer) 1
  7. 127.0.0.1:6379> zrem keys b
  8. (integer) 1
  9. 127.0.0.1:6379> zrange keys 0 -1
  10. 1) "a"
  11. 2) "c"
  12. 127.0.0.1:6379> zrem keys d
  13. (integer) 0
  14. 127.0.0.1:6379> zrange keys 0 -1
  15. 1) "a"
  16. 2) "c"
  17. 127.0.0.1:6379> zcard keys
  18. (integer) 2
  19. 127.0.0.1:6379> zcount keys 0 2
  20. (integer) 1

应用场景

  • 存储班级成绩表、工资表排序

参考:
Redis中文命令手册