Redis五种常用数据类型及命令详解

Redis 键(key)的通用命令,所有的数据类型都可以使用

string有关命令

字符串类型是Redis中最为基础的数据存储类型,是一个由字节组成的序列,他在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据货Json对象描述信息等,是标准的key-value,一般来存字符串,整数和浮点数。value最多可以容纳的数据长度为512MB 应用场景:很常见的场景用于统计网站访问数量,当前在线人数等。incr命令(++操作)

SET key value [Options]

将字符串value关联到键key。如果 key 已经持有其他值, SET 就覆写旧值, 无视类型。 可选参数:

  • EX seconds : 将键的过期时间设置为 seconds 秒。 执行 SET key value EX seconds 的效果等同于执行 SETEX key seconds value 。
  • PX milliseconds : 将键的过期时间设置为 milliseconds 毫秒。 执行 SET key value PX milliseconds 的效果等同于执行 PSETEX key milliseconds value 。
  • NX : 只在键不存在时, 才对键进行设置操作。 执行 SET key value NX 的效果等同于执行 SETNX key value 。
  • XX : 只在键已经存在时, 才对键进行设置操作。

当 SET 命令对一个带有生存时间(TTL)的键进行设置之后, 该键原有的 TTL 将被清除。

GET key

返回与键 key 相关联的字符串值,如果没有这个key,返回nil

127.0.0.1:6379> set user1 wangwu ex 60      #设置键user1的值为wangwu,存活时间是60s
OK
127.0.0.1:6379> ttl user1
(integer) 55
127.0.0.1:6379> get user1
"wangwu"
127.0.0.1:6379> ttl user1
(integer) 38
127.0.0.1:6379> ttl user1
(integer) -2
127.0.0.1:6379> get user1                   #60s后user1销毁
(nil)
127.0.0.1:6379>  set user1 lisi px 5000     #设置user1的存活时间是5000ms(5s)
OK
127.0.0.1:6379> ttl user1
(integer) -2
127.0.0.1:6379> get user1                   #5s后user1销毁
(nil)   
127.0.0.1:6379> set user1 lisi NX          #当user1这个主键不存在的时候才设置值
OK
127.0.0.1:6379> get user1
"lisi"
127.0.0.1:6379> set user1 xiaoming XX     #当user1这个主键存在的时候才设置值
OK
127.0.0.1:6379> get user1
"xiaoming"
APPEND key value

如果键 key 已经存在并且它的值是一个字符串, APPEND 命令将把 value 追加到键 key 现有值的末尾。如果 key 不存在, APPEND 就简单地将键 key 的值设为 value , 就像执行 SET key value 一样。执行成功后会返回当前value的长度。

STRLEN key

返回与key关联的value的字符串的长度,当key不存在的时候返回0,当key不是字符串的时候使用这个命令会报错。

INCR key

为键 key 储存的数字值加上一。如果键 key 不存在, 那么它的值会先被初始化为 0 , 然后再执行 INCR 命令。如果键 key 储存的值不能被解释为数字, 那么 INCR 命令将返回一个错误。

INCRBY key increment

为键 key 储存的数字值加上增量 increment 。如果键 key 不存在, 那么键 key 的值会先被初始化为 0 , 然后再执行 INCRBY 命令。如果键 key 储存的值不能被解释为数字, 那么 INCRBY 命令将返回一个错误

DECR key

为键 key 储存的数字值减去一。如果键 key 不存在, 那么键 key 的值会先被初始化为 0 , 然后再执行 DECR 操作。如果键 key 储存的值不能被解释为数字, 那么 DECR 命令将返回一个错误。

DECRBY key decrement

将键 key 储存的整数值减去减量 decrement 。如果键 key 不存在, 那么键 key 的值会先被初始化为 0 , 然后再执行 DECRBY 命令。如果键 key 储存的值不能被解释为数字, 那么 DECRBY 命令将返回一个错误。

注意:上面这4个命令只能用于value是数字值的,而且这些操作执行后都会返回加/减操作后的值,且仅仅支持 64 位(bit)有符号数字表示之内。

GETRANGE key start end

返回键key 储存的字符串值的指定部分, 字符串的截取范围介于startend 两个偏移量。

SETRANGE key offset value

从偏移量 offset 开始, 用 value 参数覆写(overwrite)键 key 储存的字符串值。不存在的键 key 当作空白字符串处理。Redis允许的字符串最大的512M,即:能够使用的最大偏移量为 2^29-1(536870911),但是请别这样做,除非你想上午还在写码,下午就被开除!!!

MSET key value [key value …]

同时为多个键设置值。如果某个给定键已经存在, 那么 MSET 将使用新值去覆盖旧值。MSET 是一个原子性(atomic)操作, 所有给定键都会在同一时间内被设置, 不会出现某些键被设置了但是另一些键没有被设置的情况。

MGET key [key …]

返回给定的一个或多个字符串键的值。如果给定的字符串键里面, 有某个键不存在, 那么这个键的值将以特殊值 nil 表示

MSETNX key value [key value …]

当且仅当所有给定键都不存在时, 为所有给定键设置值。即使只有一个给定键已经存在, MSETNX 命令也会拒绝执行对所有键的设置操作。MSETNX 是一个原子性(atomic)操作, 所有给定键要么就全部都被设置, 要么就全部都不设置, 不可能出现第三种状态。

列表 list

Redis的列表允许用户从序列的两端推入或者弹出元素,列表由多个字符串值组成的有序可重复的序列,是链表结构,所以向列表两端添加元素的时间复杂度为0(1),获取越接近两端的元素速度就越快。这意味着即使是一个有几千万个元素的列表,获取头部或尾部的10条记录也是极快的。List中可以包含的最大元素数量是4294967295。 应用场景:1.最新消息排行榜。2.消息队列,以完成多程序之间的消息交换。可以用push操作将任务存在list中(生产者),然后线程在用pop操作将任务取出进行执行。(消费者)

LPUSH key value [value …]

将一个或多个值 value 插入到列表key的表头。如果有多个 value 值,那么各个value值按从左到右的顺序依次插入到表头,List中允许有重复的值。

RPUSH key value value …]

将一个或多个值value 插入到列表key 的表尾(最右边)。如果有多个 value值,那么各个 value值按从左到右的顺序依次插入到表尾

LRANGE key start end

返回列表key 中指定区间内的元素,区间以偏移量 startend指定。下标(index)参数 startend都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。

LPUSHX key value

当且仅当 key存在并且是一个列表时才将值 value 插入到列表 key 的表头。

RPUSH key value

当且仅当 key存在并且是一个列表时才将值 value 插入到列表key 的表尾。

127.0.0.1:6379> lpush mylist1 a b c d e f g        #a,b,c,d,e,f依次圧桟的效果
(integer) 7 
127.0.0.1:6379> rpush mylist2 1 2 3 4 5 6 7        #1,2,3,4,5,6,7依次入队的效果
(integer) 7
127.0.0.1:6379> lrange mylist1 0 -1
1) "g"
2) "f"
3) "e"
4) "d"
5) "c"
6) "b"
7) "a"
127.0.0.1:6379> lrange mylist2 0 3
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> lpushx language java python php     #对一个不存在的list使用lpush不会成功的
(integer) 0
127.0.0.1:6379> lrange language 0 -1
(empty list or set)
127.0.0.1:6379> lpush language java
(integer) 1
127.0.0.1:6379> lpushx language python php js
(integer) 4
127.0.0.1:6379> lrange language 0 -1
1) "js"
2) "php"
3) "python"
4) "java"
LPOP key

移除并返回列表 key 的头元素。当元素不存在时返回nil。

RPOP key

移除并返回列表 key 的尾元素。当元素不存在时返回nil。

RPOPLPUSH source destination

source弹出的元素插入到列表 destination ,作为destination 列表的的头元素。 如果 sourcedestination 相同,则列表中的表尾元素被移动到表头,并返回该元素,可以把这种特殊情况视作列表的旋转(rotation)操作。

127.0.0.1:6379> lrange mylist1 0 -1    #查看mylist1列表中的所有元素
1) "g"
2) "f"
3) "e"
4) "d"
5) "c"
6) "b"
7) "a"
127.0.0.1:6379> lpop mylist1        #相当于mylist1栈顶元素出栈
"g"
127.0.0.1:6379> lpop mylist1 
"f"
127.0.0.1:6379> rpop mylist1        #相当于mylist1队首元素出队
"a"
127.0.0.1:6379> rpop mylist1
"b"

#rpoplpush测试
27.0.0.1:6379> lrange mylist2 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
127.0.0.1:6379> rpoplpush mylist1 mylist2    #mylist1栈顶元素出栈的元素入栈到mylist2
"c"
127.0.0.1:6379> lrange mylist2 0 -1
1) "c"
2) "1"
3) "2"
4) "3"
5) "4"
6) "5"
7) "6"
8) "7"
127.0.0.1:6379> rpoplpush mylist2 mylist2       #mylist2栈顶元素出栈的元素入栈到mylist2,形成列表的旋转
"7"
127.0.0.1:6379> lrange mylist2 0 -1
1) "7"
2) "c"
3) "1"
4) "2"
5) "3"
6) "4"
7) "5"
8) "6"
127.0.0.1:6379> 
LLEN key

返回列表 key 的长度。如果 key 不存在,则 key 被解释为一个空列表,返回 0 。如果 key 不是列表类型,返回一个错误。

LREM key count value
  • count>0表示从表头开始搜索并删除count个和value相等的元素
  • count<0表示从表尾开始搜索并删除count个和vlaue相等的元素
  • count=0表示删除表中所有的和vlaue相等的元素
127.0.0.1:6379> lpush list 1 2 3 4 4 3 2 1 5 6 7 8 3 3 
(integer) 14
127.0.0.1:6379> lrange list 0 -1       #查看所有的元素
 1) "3"
 2) "3"
 3) "8"
 4) "7"
 5) "6"
 6) "5"
 7) "1"
 8) "2"
 9) "3"
10) "4"
11) "4"
12) "3"
13) "2"
14) "1"
127.0.0.1:6379> lrem list 2 3        #删除列表中从开头的2个3
(integer) 2
127.0.0.1:6379> lrange list 0 -1
 1) "8"
 2) "7"
 3) "6"
 4) "5"
 5) "1"
 6) "2"
 7) "3"
 8) "4"
 9) "4"
10) "3"
11) "2"
12) "1"
127.0.0.1:6379> lrem list -2 1       #删除列表中从结尾开始的2个1
(integer) 2
127.0.0.1:6379> lrange list 0 -1
 1) "8"
 2) "7"
 3) "6"
 4) "5"
 5) "2"
 6) "3"
 7) "4"
 8) "4"
 9) "3"
10) "2"
127.0.0.1:6379> lrem list 0 4       #删除列表中全部的4
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "8"
2) "7"
3) "6"
4) "5"
5) "2"
6) "3"
7) "3"
8) "2"
127.0.0.1:6379>
List trim start end

对一个列表进行修剪(trim),让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。

127.0.0.1:6379> lrange list 0 -1
1) "8"
2) "7"
3) "6"
4) "5"
5) "2"
6) "3"
7) "3"
8) "2"
127.0.0.1:6379> ltrim list 0 3     #截取0-3,即列表中前4个元素,其余元素全部删除
OK
127.0.0.1:6379> lrange list 0 -1
1) "8"
2) "7"
3) "6"
4) "5"
LINDEX key index

返回列表 key 中,下标为 index 的元素。下标(index)参数以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。

127.0.0.1:6379> lrange list 0 -1     #列表中的所有元素
1) "8"
2) "7"
3) "6"
4) "5"
127.0.0.1:6379> lindex list 0      #查看列表中的第一个元素
"8"
127.0.0.1:6379> lindex list 1      #查看列表中的第二个元素
"7"
127.0.0.1:6379> lindex list -1     #查看列表中的倒数第一个元素
"5"
127.0.0.1:6379> 
LINSERT key BEFORE|AFTER pivot value

将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。当 pivot 不存在于列表 key 时,不执行任何操作。当 key 不存在时, key 被视为空列表,不执行任何操作

127.0.0.1:6379> lrange list 0 -1      #查看list中的所有元素
1) "8"
2) "7"
3) "6"
4) "5"
127.0.0.1:6379> linsert list before 7 java    #在7前面插入java
(integer) 5
127.0.0.1:6379> lrange list 0 -1
1) "8"
2) "java"
3) "7"
4) "6"
5) "5"
127.0.0.1:6379> linsert list after 7 js      #在7后面插入js
(integer) 6
127.0.0.1:6379> lrange list 0 -1
1) "8"
2) "java"
3) "7"
4) "js"
5) "6"
6) "5"
127.0.0.1:6379> 
LSET key index vlaue

将列表 key 下标为 index 的元素的值设值为 value 。当 index 参数超出范围,或对一个空列表( key 不存在)进行 LSET 时,返回一个错误。

127.0.0.1:6379> lrange list 0 -1
1) "8"
2) "java"
3) "7"
4) "js"
5) "6"
6) "5"
127.0.0.1:6379> lset list 0 phone     #设置列表的第一个元素为phone
OK                                    #设置成功了
127.0.0.1:6379> lrange list 0 -1      
1) "phone"
2) "java"
3) "7"
4) "js"
5) "6"
6) "5"
127.0.0.1:6379> 

字典 hash

Redis中的hash可以看成具有String key和String value的map容器,可以将多个key-value存储到一个key中。每一个Hash可以存储4294967295个键值对。 应用场景:例如存储、读取、修改用户属性(name,age,pwd等)

HSET key filed vlaue [filed value ...]

将哈希表 key中域 field 的值设置为 value 。如果给定的哈希表并不存在, 那么一个新的哈希表将被创建并执行 HSET 操作。如果域 field 已经存在于哈希表中, 那么它的旧值将被新值 value 覆盖。

HGET key filed

返回哈希表中给定域的值。如果给定的域或者hash表不存在,返回nil。

HGETALL key

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

HMSET key filed value [filed value ...]

同时将多个 field-value (域-值)对设置到哈希表 key 中。此命令会覆盖哈希表中已存在的域。如果 key 不存在,一个空哈希表会被创建并执行 HMSET 操作。这个的使用和HSET 的用法一样。

HMGET key filed

回哈希表 key 中,一个或多个给定域的值。如果给定的域不存在于哈希表,那么返回一个 nil 值。 这个命令的作用和HEGT的作用一样。

127.0.0.1:6379> hset student name zhansan  age 20  gender M   #hash以key-value的形式存值
(integer) 3
127.0.0.1:6379> hget student name    #获得student的name属性的值
"zhansan"
127.0.0.1:6379> hget student age     #获得student的age属性的值
"20"
127.0.0.1:6379> hget student gender  #获得student的gender属性的值
"M"
127.0.0.1:6379> hgetall student
 1) "name"
 2) "zhansan"
 3) "age"
 4) "20"
 5) "gender"
 6) "M"
HSETNX key filed value

当且仅当域field 尚未存在于哈希表key中的情况下, 将它的值设置为 value 。如果给定域已经存在于哈希表当中, 那么命令将放弃执行设置操作。如果哈希表 hash 不存在, 那么一个新的哈希表将被创建并执行 HSETNX 命令

HEXISTS key filed

检查给定域 field 是否存在于哈希表 hash 当中。存在返回1,不存在返回0。

127.0.0.1:6379> hgetall student    #得到hash表中所有student的属性(奇数)和值(偶数)
 1) "name"
 2) "zhansan"
 3) "age"
 4) "20"
 5) "gender"
 6) "M"
127.0.0.1:6379> hsetnx student name lisi      #给一个存在的属性设值,是不会成功的
(integer) 0
127.0.0.1:6379> hset student class IOT
(integer) 1
127.0.0.1:6379> hsetnx student address aabbcc    #给一个不存在的属性设值会成功
(integer) 1
127.0.0.1:6379> HEXISTS student address         #原先没有的属性address现在已经有了
(integer) 1
127.0.0.1:6379> hgetall student
 1) "name"
 2) "zhansan"
 3) "age"
 4) "20"
 5) "gender"
 6) "M"
 7) "address"
 8) "aabbcc"
HLEN key

返回哈希表 key 中域的数量。

127.0.0.1:6379> hgetall student
 1) "name"
 2) "zhansan"
 3) "age"
 4) "20"
 5) "gender"
 6) "M"
 7) "class"
 8) "IOT"
 9) "address"
10) "aabbcc"
127.0.0.1:6379> hlen student    #返回hash表student中属性的个数
(integer) 5
HSTRLEN key filed

返回哈希表 key 中, 与给定域 field 相关联的值的字符串长度(string length)。如果给定的键或者域不存在, 那么命令返回 0 。

127.0.0.1:6379> hgetall student
 1) "name"
 2) "zhansan"
 3) "age"
 4) "20"
 5) "gender"
 6) "M"
 7) "class"
 8) "IOT"
 9) "address"
10) "aabbcc"
127.0.0.1:6379> hstrlen student name     #返回student表中name属性的vlaue的长度
(integer) 7
127.0.0.1:6379> hstrlen student address   #返回student表中address属性的vlaue的长度
(integer) 6
127.0.0.1:6379>
HINCRBY key filed increment

为哈希表key中的域field的值加上增量increment。增量也可以为负数,相当于对给定域进行减法操作。如果 key 不存在,一个新的哈希表被创建并执行 HINCRBY 命令。如果域 field 不存在,那么在执行命令前,域的值被初始化为 0 。

HINCRBYFLOAT key filed increment

HINCRBY key filed increment的作用一样,都是哈希表key中的域field的值加上增量increment,但是这里的增量是浮点数。

127.0.0.1:6379> hincrby student age 2     #给studnet表中的age属性增加2
(integer) 22
127.0.0.1:6379> hincrby student age 2
(integer) 24
127.0.0.1:6379> hincrby student age 2
(integer) 26 
127.0.0.1:6379> hget student age
"26"
127.0.0.1:6379> hincrbyfloat student age 0.5   #给studnet表中的age属性增加0.5
"26.5"
127.0.0.1:6379> 
HKEYS key

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

HVALS key

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

127.0.0.1:6379> hkeys student    #得到hash表中的所有属性(域)
1) "name"
2) "age"
3) "gender"
4) "class"
5) "address"
127.0.0.1:6379> hvals student     #得到hash表中的所有属性对应的值
1) "zhansan"
2) "26.5"
3) "M"
4) "IOT"
5) "aabbcc"
127.0.0.1:6379> 

集合 set

Redis的集合是无序不可重复的,和列表一样,在执行插入和删除和判断是否存在某元素时,效率是很高的。集合最大的优势在于可以进行交集并集差集操作。Set可包含的最大元素数量是4294967295。 应用场景:1.利用交集求共同好友。2.利用唯一性,可以统计访问网站的所有独立IP。3.好友推荐的时候根据tag求交集,大于某个threshold(临界值的)就可以推荐。

SADD key member [member …]

将一个或多个member 元素加入到集合 key 当中,已经存在于集合的 member元素将被忽略。假如 key 不存在,则创建一个只包含 member元素作成员的集合。会返回被添加到集合中元素的个数,不包括重复的元素。

SMEMBERS key

返回集合key中的所有成员,不存在的 key 被视为空集合。

SISMEMBERS key member

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

127.0.0.1:6379> sadd myset a b c d e      #向集合中添加成员a,b,c,d,e
(integer) 5
127.0.0.1:6379> smembers myset            #查看集合中的所有成员
1) "d"
2) "b"
3) "c"
4) "a"
5) "e"
127.0.0.1:6379> sadd myset d e f g         #集合中是没有重复值的,如果sadd的值在集合中已经有了,那就会被忽略
(integer) 2
127.0.0.1:6379> smembers myset
1) "e"
2) "f"
3) "b"
4) "d"
5) "g"
6) "a"
7) "c"
127.0.0.1:6379> sismember myset g           #判断元素g是否是myset中的成员
(integer) 1
127.0.0.1:6379> sismember myset sdsds
(integer) 0
SCARD key

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

SREM key [key ...]

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

127.0.0.1:6379> smembers myset
1) "e"
2) "f"
3) "b"
4) "d"
5) "g"
6) "a"
7) "c"
127.0.0.1:6379> srem myset e f     #删除集合中的e,f
(integer) 2
127.0.0.1:6379> smembers myset
1) "b"
2) "d"
3) "g"
4) "a"
5) "c"
SRANDMEMBER key count

如果命令执行时,只提供了 key 参数,那么返回集合中的一个随机元素。 从 Redis 2.6 版本开始, SRANDMEMBER 命令接受可选的count 参数:

  • 如果count 为正数,且小于集合基数,那么命令返回一个包含count 个元素的数组,数组中的元素各不相同。如果 count大于等于集合基数,那么返回整个集合。
  • 如果 count为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count的绝对值。
127.0.0.1:6379> sadd set01 1 2 3 4 5 6 7 8 9 10 
(integer) 10
127.0.0.1:6379> smembers set01
 1) "1"
 2) "2"
 3) "3"
 4) "4"
 5) "5"
 6) "6"
 7) "7"
 8) "8"
 9) "9"
10) "10"
127.0.0.1:6379> srandmember set01 5     #从set01这个集合中随机抽取5个数组成数组,这些数没有重复的
1) "2"
2) "1"
3) "5"
4) "8"
5) "3"
127.0.0.1:6379> srandmember set01 5
1) "1"
2) "8"
3) "6"
4) "10"
5) "9"
127.0.0.1:6379> srandmember set01 5
1) "7"
2) "4"
3) "8"
4) "10"
5) "9"
127.0.0.1:6379> srandmember set01 -5    #从set01这个集合中随机抽取5个数组成数组,这些数有可能会重复
1) "5"
2) "1"
3) "5"
4) "7"
5) "7"
127.0.0.1:6379> srandmember set01 -5
1) "6"
2) "5"
3) "5"
4) "2"
5) "9"
127.0.0.1:6379> 
SPOP key count

移除并返回集合中的一个或多个随机元素。

127.0.0.1:6379> smembers set01
 1) "1"
 2) "2"
 3) "3"
 4) "4"
 5) "5"
 6) "6"
 7) "7"
 8) "8"
 9) "9"
10) "10"
127.0.0.1:6379> spop set01 1         #随机移除一个元素并返回这个元素
1) "3"
127.0.0.1:6379> spop set01 5         #随机移除5个元素并返回元素
1) "2"
2) "5"
3) "8"
4) "6"
5) "1"
127.0.0.1:6379> smembers set01
1) "4"
2) "7"
3) "9"
4) "10"
127.0.0.1:6379> 
SMOVE source destination

将 member 元素从 source 集合移动到 destination 集合。 SMOVE 是原子性操作。

  • 如果 source 集合不存在或不包含指定的 member 元素,则 SMOVE 命令不执行任何操作,仅返回 0 。否则, member 元素从 source 集合中被移除,并添加到 destination 集合中去。
  • 当 destination 集合已经包含 member 元素时, SMOVE 命令只是简单地将 source 集合中的 member 元素删除。
127.0.0.1:6379> keys *
1) "set01"
127.0.0.1:6379> sadd set02 a b c d e f
(integer) 6
127.0.0.1:6379> keys *
1) "set01"
2) "set02"
127.0.0.1:6379> smove set02 set01 a
(integer) 1
127.0.0.1:6379> smembers set01
1) "9"
2) "7"
3) "10"
4) "4"
5) "a"
127.0.0.1:6379> 
集合的数学操作命令
SDIFF key [key …]

返回一个集合的全部成员,该集合是所有给定集合之间的差集。不存在的 key 被视为空集。

127.0.0.1:6379> sadd A 1 2 3 4 5
(integer) 5
127.0.0.1:6379> sadd B 1 2 3 a c d
(integer) 6
127.0.0.1:6379> sdiff A B     #求A-B,即A有B没有的成员
1) "4"
2) "5"
127.0.0.1:6379> SDIFF B A      #求B-A,即B有A没有的成员
1) "d"
2) "c"
3) "a"
127.0.0.1:6379> 
SINTER key [key ...]

返回一个集合的全部成员,该集合是所有给定集合的交集。不存在的 key 被视为空集。当给定集合当中有一个空集时,结果也为空集(根据集合运算定律)。

127.0.0.1:6379> sinter A B      #求A∩B,即A,B公有的成员
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> sinter B A     #求B∩A
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> 
SUNION key [key ...]

返回一个集合的全部成员,该集合是所有给定集合的并集。不存在的 key 被视为空集。

127.0.0.1:6379> SUNION A B     #求A∪B,即A,B中的所有元素
1) "2" 
2) "1"
3) "4"
4) "3"
5) "5"
6) "d"
7) "c"
8) "a"
127.0.0.1:6379> SUNION B A
1) "1"
2) "2"
3) "4"
4) "3"
5) "5"
6) "d"
7) "c"
8) "a"
127.0.0.1:6379> 

有序集合 zset

和set很像,都是字符串的集合,都不允许重复的成员出现在一个set中。他们之间差别在于有序集合中每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。尽管有序集合中的成员必须是唯一的,但是分数(score)却可以重复。 应用场景:可以用于一个大型在线游戏的积分排行榜,每当玩家的分数发生变化时,可以执行zadd更新玩家分数(score),此后在通过zrange获取几分top ten的用户信息。

ZADD key score member [score member ...]

将一个或多个 member 元素及其 score值加入到有序集key 当中。如果某个 member 已经是有序集的成员,那么更新这个memberscore值,并通过重新插入这个 member元素,来保证该member在正确的位置上。score 值可以是整数值或双精度浮点数。如果 key 不存在,则创建一个空的有序集并执行ZADD 操作。

ZRANGE key start end [withscore]

返回有序集 key 中,指定区间内的成员。其中成员的位置按 score 值递增(从小到大)来排序。具有相同 score 值的成员按字典序(lexicographical order )来排列。如果需要成员按 score 值递减(从大到小)来排列,可以使用 ZREVRANGE key start end withscore

ZREVRANGE key start end [withscores]

返回有序集key中,指定区间内的成员。其中成员的位置按 score值递减(从大到小)来排列。 具有相同 score 值的成员按字典序的逆序(reverse lexicographical order)排列

127.0.0.1:6379> zadd stu 70 v1 80 v2 90 v3 100 v4   #和set大致类似,只是这里每一个score和member是一个整体,按照score的大小排序
(integer) 4
127.0.0.1:6379> ZRANGE stu 0 -1      #默认升序排列
1) "v1"
2) "v2"
3) "v3"
4) "v4"

127.0.0.1:6379> zrange stu 0 -1 withscores   #使用withscores可以打印出score
1) "v1"
2) "70"
3) "v2"
4) "80"
5) "v3"
6) "90"
7) "v4"
8) "100"
#逆序打印有序集的成员
127.0.0.1:6379> zrevrange stu 0 -1 withscores
1) "v4"
2) "100"
3) "v3"
4) "90"
5) "v2"
6) "80"
7) "v1"
8) "70"

ZRANGEBYSCORE key min max [withscores] [limit offset count]

返回有序集 key中,所有 score 值介于minmax之间(包括等于 minmax )的成员。有序集成员按 score 值递增(从小到大)次序排列。具有相同 score 值的成员按字典序(lexicographical order)来排列(该属性是有序集提供的,不需要额外的计算)。

  • 可选的 LIMIT 参数指定返回结果的数量及区间(就像SQL中的SELECT LIMIT offset, count ),注意当 offset 很大时,定位offset的操作可能需要遍历整个有序集,此过程最坏复杂度为 O(N) 时间。
  • 可选的 WITHSCORES 参数决定结果集是单单返回有序集的成员,还是将有序集成员及其 score 值一起返回。
#打印出score介于[60 90]的值
127.0.0.1:6379> zrangebyscore stu 60 90     
1) "v1"
2) "v2"
3) "v3"
 #打印出score介于[60 90]的值并且打印出对应的score
127.0.0.1:6379> zrangebyscore stu 60 90 withscores  
1) "v1"
2) "70"
3) "v2"
4) "80"
5) "v3"
6) "90"
#打印出score介于[60 90)的值,并且打印出score
127.0.0.1:6379> zrangebyscore stu 60 (90 withscores   
1) "v1"
2) "70"
3) "v2"
4) "80"
#打印出score介于(60 90)的值,并且打印出score
127.0.0.1:6379> ZRANGEBYSCORE stu (60 (90 withscores
1) "v1"
2) "70"
3) "v2"
4) "80"
#打印出score介于[60 90]并且是从0(第一个元素)开始的2个元素
127.0.0.1:6379> zrangebyscore stu 60 90  limit 0 2
1) "v1"
2) "v2"
#打印出score介于[60 90]并且是从0(第一个元素)开始的2个元素,并且打印出score
127.0.0.1:6379> ZRANGEBYSCORE stu 60 90 withscores limit 0 2
1) "v1"
2) "70"
3) "v2"
4) "80"
ZREM key member [menber ...]

移除有序集key中的一个或多个成员,不存在的成员将被忽略。

127.0.0.1:6379> zrange stu 0 -1 withscores
1) "v1"
2) "70"
3) "v2"
4) "80"
5) "v3"
6) "90"
7) "v4"
8) "100"
#删除有序集stu中的v1
127.0.0.1:6379> zrem stu v1 
(integer) 1
127.0.0.1:6379> zrange stu 0 -1 withscores
1) "v2"
2) "80"
3) "v3"
4) "90"
5) "v4"
6) "100"
ZCARD stu

key 存在且是有序集类型时,返回有序集的基数。 当 key不存在时,返回 0 。

ZCOUNT stu start end

返回有序集 key中, score值在 minmax 之间(默认包括score 值等于minmax )的成员的数量。

127.0.0.1:6379> zrange stu 0 -1 withscores
1) "v2"
2) "80"
3) "v3"
4) "90"
5) "v4"
6) "100"
#统计有序集中成员的总个数
127.0.0.1:6379> ZCARD stu
(integer) 3
#统计大于80,小于等于100的成员
127.0.0.1:6379> ZCOUNT stu (80 100
(integer) 2
ZRANK key member

返回有序集key中成员member的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。排名以 0 为底,也就是说,score 值最小的成员排名为 0 。

ZREVRANK key member

返回有序集key中成员member 的排名。其中有序集成员按 score值递减(从大到小和默认的逆序))排序。排名以 0 为底,也就是说, score 值最大的成员排名为 0 。

127.0.0.1:6379> zrange stu 0 -1 withscores
 1) "v0"
 2) "50"
 3) "v1"
 4) "60"
 5) "v2"
 6) "80"
 7) "v3"
 8) "90"
 9) "v4"
10) "100"
#成员v3的排名
127.0.0.1:6379> zrank stu v3
(integer) 3
#成员v4的排名
127.0.0.1:6379> zrank stu v4
(integer) 4
#成员逆序排序
127.0.0.1:6379> zrevrank stu v3
(integer) 1
127.0.0.1:6379> zrevrank stu v4
(integer) 0
ZRANGEBYSOCRE key min max [withscores] [limit offset count]

返回有序集 key中,所有score 值介于minmax 之间(包括等于 minmax )的成员。有序集成员按 score值递增(从小到大)次序排列。具有相同 score值的成员按字典序(lexicographical order)来排列: * 可选的LIMIT参数指定返回结果的数量及区间(就像SQL中的 SELECT LIMIT offset, count ),注意当 offset 很大时,定位 offset 的操作可能需要遍历整个有序集,此过程最坏复杂度为 O(N) 时间。 * 可选的WITHSCORES 参数决定结果集是单单返回有序集的成员,还是将有序集成员及其 score 值一起返回。

ZREVRANGESCORE key min max [withsocres] [limit offset count]

使用方法和ZRANGEBYSOCRE的用法一样,还是这个是前者的逆序

#返回stu有序集中[90 100]的score和值
127.0.0.1:6379> zrangebyscore stu 90 100 withscores
1) "v3"
2) "90"
3) "v4"
4) "100"
#返回stu有序集中(90 100]的score和值
127.0.0.1:6379> zrangebyscore stu (90 100 withscores
1) "v4"
2) "100"
#返回stu有序集中[90 100]的score和值,只是是以逆序打印
127.0.0.1:6379> zrevrangebyscore stu 100 90 withscores
1) "v4"
2) "100"
3) "v3"
4) "90"
#返回stu有序集中[90 100]的score和值,只是是以逆序打印
127.0.0.1:6379> zrevrangebyscore stu 100 (90 withscores
1) "v4"
2) "100"
127.0.0.1:6379> 

更多Redis命令参考:http://redisdoc.com/ 。另外这里只是介绍了一下Redis中5种常用数据类型的有关命令和简单的使用场景,关于他们的底层实现我把他放到了下一节:Redis五种常见数据结构的实现及使用场景, 感兴趣的小伙伴可以去看看,图文配合非常简单易懂~~

参考

留言区

还能输入500个字符