第二章 Redis数据类型

目前Redis数据库支持5种数据类型,分别是String(字符串)、Hash(哈希)、List(列表)、Set(集合)及SortedSet(有序集合)。Redis命令名称大小写不会影响命令表的查找结果,Redis的命令表使用的是与大小写无关的查找算法,输入的命令名称只要正确都能得到结果。在获取键值对中的值时,如果值是中文则会返回编码后的字符串,如果希望返回值是中文,在客户端连接服务器端时使用命令:redis-cli –raw可将底层编码的字符串转换为中文。

1、字符串(String)类型

字符串类型是Redis中基本的数据类型,其相关命令用于管理Redis的字符串值,它是二进制安全的,任何形式的字符串都可以存储,包括二进制数据、序列化后的数据、JSON化的对象,甚至是一张经Base64编码后的图片。String类型的键最大能存储512MB的数据。

1.1 设置键值对

(1)SET命令:设置单个键值对

命令格式:

SET key value

作用:

将字符串值value设置到key中,如果key中已经存在其他值,则在执行SET命令后覆盖旧值,并忽略类型。针对带有生存时间的key来说,当SET命令成功执行时,这个key上的生存时间会被清除

返回值:

如果SET命令设置成功返回OK

例子:

127.0.0.1:6379> SET stuName-1 '张三'

OK

(2)MSET 命令:设置多个键值对

命令格式:

MSET key value [key1value1 key2 value2 ...]

作用:

同时设置多个键值对,如果某个key已经存在,MSET命令会用新值覆盖旧值。MSET命令是一个原子性操作,所有给定key都会在同一时间内被设置更新,不存在某些key被更新而另一些key没有被更新的情况

返回值:

总是返回OK,因为MSET命令不可能设置失败

例子:

127.0.0.1:6379> MSET stuName-2 '赵雨梦' stuID-2 20181762 age-2 24 sex-2 '女' height-2 175

OK

(3)SETNX命令:设置单个不存在的键值对

命令格式:

SETNX key value

作用:

如果key不存在则设置值,如果key已经存在,则SETNX什么也不做

返回值:

SETNX命令设置成功返回1,设置失败返回0

例子:

127.0.0.1:6379> SETNX collegeName '计算机学院'    #设置学院名称为“计算机学院”

1

127.0.0.1:6379> SETNX collegeName '计算机工程学院'  #更名为“计算机工程学院”

0

(4)MSETNX命令:设置多个不存在的键值对

命令格式:

MSETNX key value [key1value1 key2 value2 ...]

作用:

同时设置多个键值对,当且仅当所有给定key都不存在时设置。如果有一个给定key已经存在,那么MSETNX命令也会拒绝执行所有给定key的设置操作,即所有字段要么全部被设置,要么全部设置失败

返回值:

所有key设置成功返回1,所有给定key都设置失败返回0

例子:

127.0.0.1:6379> MSETNX Chinese-teacher '郭涛' Math-teacher '杨艳'

English-teacher '吴芳'

1

1.2获取键值对

(1)GET命令:获取单个键值对的值

命令格式:

GET key

作用:

获取key中设置的字符串值

返回值:

key存在时返回key所对应的值,key不存在返回nil,如果key中存储的值不是字符串类型返回错误,因为GET命令只能用于处理字符串的值

例子:

127.0.0.1:6379> GET stuName-1

张三

(2)MGET命令:获取多个键值对的值

命令格式:

MGET key [key1 key2...]

作用:

同时返回多个给定key的值,key之间使用空格隔开。如果在给定的key中有不存在的key,这个key返回的值为nil

返回值:

一个包含所有给定key的值的列表

例子:

127.0.0.1:6379> MGET stuID-1 age-1 sex-1 height-1 weight-1

20180001

22

171

75

(3)GETRANGE命令:获取键的子字符串值

命令格式:

GETRANGE key start end

作用:

获取key中字符串值从start开始到end结束的子字符串,下标从0开始。start和end参数是整数,可以取负值,当取负值时表示从字符串后开始计数,-1 表示后一个字符,-2 表示倒数第二个字符…

返回值:

返回截取的子字符串

例子:

127.0.0.1:6379> SET motto-2 '一个人只有全面回忆自己,才能认识真正的自己' 

OK

127.0.0.1:6379> GETRANGE motto-2 0 100

一个人只有全面回忆自己,才能认识真正的自己

127.0.0.1:6379> GETRANGE motto-2 -8 -1

自己 

1.3键值对的偏移量

(1)SETBIT命令:设置键的偏移量

命令格式:

SETBIT key offset value

作用:

对key所存储的字符串值设置或清除指定偏移量上的位。value参数值决定了位的设置或清除,value值取0或1。当key不存在时自动生成一个新的字符串值。这个字符串是动态的,可以扩展以确保将value保存到指定的偏移量上。当这个字符串扩展时,使用0来填充空白位置

参数:

offset参数必须是大于或等于0,并且小于2^32(bit映射被限制在512MB之内)的正整数,在默认情况下,bit初始化为0

返回值:

返回指定偏移量原来存储的位

例子:

127.0.0.1:6379> SETBIT stuName-1 6 1

0

127.0.0.1:6379> SETBIT stuName-1 7 0

1

(2)GETBIT 命令:获取键的偏移量值

命令格式:

GETBIT

key offset

作用:

获取key所存储的字符串值指定偏移量上的位,当offset的值超过了字符串的最大长度或key不存在时返回0

返回值:

返回字符串值指定偏移量上的位

例子:

127.0.0.1:6379> GETBIT stuName-1 6

1

127.0.0.1:6379> GETBIT stuName-1 7

0

1.4设置键的生存时间

(1)SETEX 命令:为键设置生存时间

命令格式:

SETEX

key seconds value

作用:

将value值设置到key中并设置key的生存时间为多少秒,设置value与设置生存时间是在同一时间完成的,如果key已经存在则覆写旧值 ,等价于:

SETkey value

EXPIREkey seconds

返回值:

设置成功时返回OK,当seconds参数不合法时返回错

例子:

127.0.0.1:6379> SETEX schoolName 100

OK

127.0.0.1:6379> GET schoolName

清华大学

127.0.0.1:6379> TTL schoolName

55

127.0.0.1:6379> GET schoolName 

(2)PSETEX命令:为键设置生存时间

命令格式:

PSETEX key milliseconds value

作用:

以毫秒为单位设置key的生存时间

返回值:

设置成功时返回OK

例子:

127.0.0.1:6379> PSETEX school-address 30000 '北京'

OK

127.0.0.1:6379> GET school-address  

127.0.0.1:6379> PTTL school-address 

17360

127.0.0.1:6379> GET school-address

1.5键值对的值操作

(1)SETRANGE命令:替换键的值

命令格式:

SETRANGEkey offset value

作用:

从指定的位置开始将key的值替换为新的字符串,如果有不存在的key,就当作空白字符串处理。SETRANGE命令会确保字符串足够长,以便将value设置在指定的偏移量上。如果给定key原来存储的字符串长度比偏移量小,那么原字符和偏移量之间的空白将用零字节(Zerobytes,“\x00”)来填充

注意:

offset的最大偏移量是2^29-1(536870911),因为Redis字符串的大小被限制在512MB以内,假如需要使用比这更大的空间,则可以使用多个key来存储

返回值:

返回执行SETRANGE命令之后的字符串的长度

例子:

127.0.0.1:6379> GET motto-2 

一个人只有全面回忆自己,才能认识真正的自己

127.0.0.1:6379> SETRANGE motto-2 21 '美好过去'  #替换学生2的座右铭,从偏移量21开始

63

127.0.0.1:6379> GET motto-2

一个人只有全面美好过去,才能认识真正的自己

127.0.0.1:6379> EXISTS motto-3   #学生3的座右铭不存在(对一个不存在的键进行替换)

0

127.0.0.1:6379> SETRANGE motto-3 12 'hello world'  #替换学生3的座右铭,从偏移量12开始(integer) 23

127.0.0.1:6379> GET motto-3

"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00hello

world"

(2)GETSET命令:为键设置新值

命令格式:

GETSETkey value

作用:

将给定key的值设置为value,并返回key的旧值

返回值:

返回给定key的旧值,如果key不存在返回nil,如果key存在但不是字符串类型的返回错误

例子:

127.0.0.1:6379> EXISTS motto-1  #检查键motto-1是否存在

127.0.0.1:6379> GETSET motto-1 '没有存款,就是拼的理由'  #没有旧值,返空回空


127.0.0.1:6379> GET motto-1  #获取值

没有存款,就是拼的理由

127.0.0.1:6379> GETSET motto-1 '拼个春夏秋冬,赢个无悔人生'  #为键motto-1设置新值没有存款,就是拼的理由

127.0.0.1:6379> GET motto-1

拼个春夏秋冬,赢个无悔人生

(3)APPEND命令:为键追加值

命令格式:

APPEND key value 

作用:

如果key存在且是字符串类型,则将value值追加到key旧值的末尾,如果key不存在则将 key设置值为value

返回值:

返回追加value之后key中字符串的长度

例子:

127.0.0.1:6379> GET motto-1 #获取键motto-1的值拼个春夏秋冬,赢个无悔人生

127.0.0.1:6379> APPEND motto-1 ',努力过,'  #追加新值

50

127.0.0.1:6379> GET motto-1

拼个春夏秋冬,赢个无悔人生,努力过,

127.0.0.1:6379> APPEND motto-1 '此生无憾'  #追加新值

62

127.0.0.1:6379> GET motto-1

拼个春夏秋冬,赢个无悔人生,努力过,此生无憾

1.6 键值对的计算

(1)BITCOUNT命令:计算比特位数量

命令格式:

BITCOUNTkey [start] [end]

作用:

计算在给定的字符串中被设置为1的比特位数量,如果被计数的key不存在,就会被当成空字符串来处理,其计数结果为0

参数:

它有start和end两个参数,如果不设置这两个参数,则表示它会对整个字符串进行计数,如果指定了这两个参数值,则可以让计数只在特定的位上进行。start和end参数都是整数值,可以取负数,比如,-1表示字符串的后一个字节,-2表示字符串的倒数第二个字节…

返回值:

返回被设置为1的位的数量

例子:

127.0.0.1:6379> BITCOUNT stuName-3     #计算学生3姓名的比特位数量,为28

28

127.0.0.1:6379> BITCOUNT stuName-3 0 10 #计算学生3姓名在0~10之间的比特位数量

28

127.0.0.1:6379> BITCOUNT stuName-3 0 3

19

127.0.0.1:6379> SETBIT stuName-3 100 1  #设置学生3姓名在偏移量为100处的比特位

0

127.0.0.1:6379> BITCOUNTstuName-3 #28+1

29

(2)BITOP命令:对键进行位元运算

命令格式:

BITOPoperation destkey key [key...]

作用:

对一个或多个保存二进制位的字符串key进行位元运算,并将运算结果保存到destkey中, operation表示位元操作符,可以是AND、OR、NOT、XOR这4种操作中的任意一种,具体操作如下:

●   BITOP AND destkey key [key...]:表示对一个或多个 key求逻辑并,并将结果保存到 destkey中

●   BITOP OR destkey key [key...]:表示对一个或多个 key求逻辑或,并将结果保存到 destkey中

●   BITOP NOT destkey key:表示对给定 key求逻辑非,并将结果保存到 destkey中

●   BITOP XOR destkey key [key...]:表示对一个或多个 key求逻辑异或,并将结果保存到 destkey中

除NOT操作之外,其余的操作都可以接收一个或多个key作为参数。当使用BITOP命令来进行不同长度的字符串的位元运算时,较短的那个字符串所缺少的部分将会被看作 0。空的key也被看作包含0的字符串序列

返回值:

返回保存到destkey中的字符串的长度,这个长度和输入key中最长的字符串的长度相等

例子:

127.0.0.1:6379> SETBIT age-1 0 1  #设置学生1年龄的比特位

0

127.0.0.1:6379> SETBIT age-2 3 1  #设置学生2年龄的比特位

1

127.0.0.1:6379> BITOP AND result age-1 age-2  #逻辑与运算

2

127.0.0.1:6379> BITOP OR result1 age-1 age-2  #逻辑或运算

2

127.0.0.1:6379> BITOP NOT result2 age-1 age-2  #逻辑非运算

ERR BITOP NOT must be called with a single source key. 

127.0.0.1:6379> BITOP NOT result3 age-1

2

127.0.0.1:6379> BITOP NOT result4 age-2

2

127.0.0.1:6379> BITOP XOR result5 age-1 age-2  #逻辑异或运算

2

127.0.0.1:6379> GETBIT age-1 0  #获取偏移量为0的值

1

127.0.0.1:6379> BITCOUNT age-1  #统计比特位数量

7

127.0.0.1:6379> BITCOUNT age-2

6

(3)STRLEN命令:统计键的值的字符长度

命令格式:

STRLENkey

作用:

统计key的值的字符长度

返回值:

当key存储的不是字符串时返回一个错误,当key不存在时返回0

例子:

127.0.0.1:6379> GET motto-1

拼个春夏秋冬,赢个无悔人生,努力过,此生无憾

127.0.0.1:6379> STRLEN motto-1

62

127.0.0.1:6379> GET motto-2

一个人只有全面美好过去,才能认识真正的自己

127.0.0.1:6379>STRLEN motto-2 63

1.7键值对的值增量

(1)DECR命令:让键的值减1

命令格式:

DECRkey

作用:

将key中存储的数字值减1,如果key不存在则key的值先被初始化为0再执行DECR操作减1

注意:

这个命令只能对数字类型的数据进行操作,如果key对应的值包含错误类型或字符串类型的值不能表示为数字则将返回一个错误。DECR操作的值限制在64位有符号数字表示范围之内

返回值:

返回执行DECR操作之后key的值

例子:

127.0.0.1:6379> MGET stuName-2 age-2 sex-2 height-2 weight-2birthday-2 className-2

赵雨梦

24

175

73

1994-04-23

网络工程1班

127.0.0.1:6379> DECR age-2        #年龄减1

23

127.0.0.1:6379> DECR height-2    #身高减1

174

127.0.0.1:6379> DECR weight-2         #体重减1

72

127.0.0.1:6379> DECR birthday-2   #类型错误

ERR value is not an integer or out of range

(2)DECRBY命令:键的值减去减量值

命令格式:

DECRBYkey decrement

作用:

将key所存储的值减去减量值decrement,如果key不存在则key的值先被初始化为0再执行DECRBY命令,如果DECRBY命令操作的值包含错误的类型或字符串类型的值不能表示为数字将返回一个错误。DECRBY操作的数值限制在64位有符号数字表示范围之内

返回值:

返回减去减量值decrement的key的新值

例子:

127.0.0.1:6379> MGET stuName-3 stuID-3 age-3 sex-3 height-3weight-3 birthday-3 className-3

宋飞

20180023

23

168

67

1995-08-18

软件工程2班

127.0.0.1:6379> DECRBY stuID-3 5

20180018

127.0.0.1:6379> DECRBY age-3 5

18

127.0.0.1:6379> DECRBY height-3 5

163

127.0.0.1:6379> DECRBY weight-3 5 62

(3)INCR命令:让键的值加1

命令格式:

INCRkey

作用:

将key中存储的数字值加1,如果key不存在则key的值先被初始化为0再执行INCR操作加1

注意:

这个命令只能对数字类型的数据进行操作,如果INCR操作的值包含错误的类型或字符串类型的值不能表示为数字则将返回一个错误。INCR操作的值限制在64位有符号数字表示范围之内

返回值:

返回执行INCR命令之后key的新值

例子:

127.0.0.1:6379> INCR age-4

24

127.0.0.1:6379> INCR height-4

171

127.0.0.1:6379> INCR weight-4

65

(4)INCRBY 命令:让键的值加上增量值

命令格式:

INCRBY key increment

作用:

将key所存储的值加上增量值increment,如果key不存在则key的值先被初始化为0再执行INCRBY命令,如果INCRBY操作的值包含错误的类型或字符串类型的值不能表示为数字则将返回一个错误,INCRBY操作的值限制在64位有符号数字表示范围之内

返回值:

返回加上增量值increment之后的key的新值

例子:

127.0.0.1:6379> MGET stuName-5 stuID-5 age-5 sex-5 height-5

weight-5 birthday-5 className-5 孙玉

20180097 22 女

166

63

1996-09-10 软件工程2班

127.0.0.1:6379> INCRBY stuID-5 3

20180100

127.0.0.1:6379> INCRBY age-5 3

25

127.0.0.1:6379> INCRBY height-5 3

169

127.0.0.1:6379> INCRBY weight-5 3

66   

(5)INCRBYFLOAT命令:让键的值加上浮点数增量值

命令格式:

INCRBYFLOATkey increment

作用:

将key所存储的值加上浮点数增量值increment,如果key不存在则key的值先被初始化为0再执INCRBYFLOAT命令,如果INCRBYFLOAT命令执行成功,那么key的值会被更新为命令执行后的新值,并且新值以字符串的形式返回给调用者。产生的新值和浮点数增量值increment都可以使用像3.0e9、4e7、8e-3这样的指数符号来表示在执行INCRBYFLOAT命令后产生的值会以相同的形式存储,都是由一个数字、一个可选的小数点、一个任意位数的小数部分组成的。小数部分末尾的0会被忽略掉。在有特定需要时,浮点数也会转化为整数,比如2.0会被保存为2。如果INCRBYFLOAT操作的key的值不是字符串类型的或key所对应的值、给定的浮点数增量值increment不能表示为双精度浮点数则会返回一个错误

返回值:

返回执行INCRBYFLOAT命令之后key的新值

注意:

在执行INCRBYFLOAT命令之后无论产生的浮点数的实际精度有多长,计算结果多也只能保留小数点后17位

例子:

127.0.0.1:6379> SET PI 3.1415

OK

127.0.0.1:6379> INCRBYFLOAT PI 0.002

3.1435

127.0.0.1:6379> SET PI-1 31415e-4

OK

127.0.0.1:6379> GET PI-1

31415e-4

127.0.0.1:6379> INCRBYFLOAT PI-1 0.0001

3.1416

127.0.0.1:6379> SET PI-2 314

OK

127.0.0.1:6379> INCRBYFLOAT PI-2 0.15

314.14999999999999999

127.0.0.1:6379> SET PI-3 314.0

OK

127.0.0.1:6379> INCRBYFLOAT PI-3 1.000000000000000000

315

2、哈希(Hash)类型

Redis的Hash类型是一个String类型的域(field)和值(value)的映射表,Hash数据类型常常用来存储对象信息。在Redis中每个哈希表可以存储2^32 - 1个键值对,也就是40多亿个数据

2.1设置哈希表域的值

(1)HSET命令:为哈希表的域设值

命令格式:

HSETkey field value

作用:

将哈希表key中的field的值设置为value,当这个key不存在时将会创建一个新的哈希表并进行HSET操作,如果field已经存在于哈希表中那么新值将会覆盖旧值

返回值:

在哈希表中,如果field是一个新建域并且HSET操作成功则会返回1,如果哈希表中已经存在field,那么在新值覆盖旧值后将返回0

例子:

127.0.0.1:6379[1]> HSET student1 stuName '刘河飞'

1

127.0.0.1:6379[1]> HSET student1 stuID 20180001

1

127.0.0.1:6379[1]> HSET student1 age 22

1

127.0.0.1:6379[1]> HSET student1 sex '男'

1    

(2)HSETNX命令:为哈希表不存在的域设值

命令格式:

HSETNXkey field value

作用:

当且仅当域field不存在时将哈希表key中的field的值设置为value,如果field已经存在,那么HSETNX命令将会执行无效,如果key不存在则会首先创建一个新key,然后执行HSETNX命令

返回值:

设置成功则返回1,如果field已经存在设置失败则会返回0

例子:

127.0.0.1:6379[1]> HSETNX student1 motto '拼个春夏秋冬,赢个无悔人生'

1

127.0.0.1:6379[1]> HSETNX student1 motto '拼个春夏秋冬,赢个无悔人生'

0

(3)HMSET命令:设置多个域和值到哈希表中

命令格式:

HMSET key field value [field value ...]

作用:

将一个或多个域-值对设置到哈希表key中,执行该命令后将会覆盖哈希表key中原有的域,当key不存在时会创建一个空的哈希表并执行HMSET操作

返回值:

当HMSET命令执行成功时返回OK,当key不是哈希类型时直接返回错误

例子:

127.0.0.1:6379[1]> HMSET student2 stuName '赵雨梦' stuID 20181762 age 24 sex '女' height 175 weight 73 birthday '1994-04-23' className '网络工程1班'

OK

 2.2获取哈希表中的域和值

(1)HGET命令:获取哈希表中域的值

命令格式:

HGET key field

作用:

获取哈希表key中field的值。

返回值:

返回field的值,如果这个key不存在或field不存在将返回nil

例子:

127.0.0.1:6379[1]> HGET student1 stuID

20180001

127.0.0.1:6379[1]> HGET student1 age

22

127.0.0.1:6379[1]> HGET student1 sex 男

(2)HGETALL 命令:获取哈希表中所有的域和值

命令格式:

HGETALL key

作用:

获取哈希表key中所有的field和value

返回值:

执行该命令后,将会以列表的形式返回哈希表中的域(field)和值(value),此时返回值的长度是哈希表长度的两倍,如果这个key不存在则将返回空列表

例子:

127.0.0.1:6379[1]> HGETALL student2

stuName

赵雨梦

stuID

20181762

age

24

sex

height

175

weight

73

birthday

1994-04-23

className

网络工程1班

(3)HMGET命令:获取多个域的值

命令格式:

HMGET key field [field ...]

作用:

获取哈希表key中一个或多个field的值,如果哈希表key中不存在这个field返回nil,如果key不存在将会被当作一个空哈希表来处理返回nil

返回值:

返回一个包含多个指定域(field)的关联值的表,表中值的顺序与给定域参数的请求顺序保持一致

例子:

127.0.0.1:6379[1]> HMGET student3 stuName stuID age birthdayclassName

宋飞

20180023

23

1995-08-18

软件工程2班

(4)HKEYS命令:获取哈希表中的所有域

命令格式:

HKEYS key

作用:

获取哈希表key中的所有域(field)

返回值:

返回包含这个哈希表key中的所有域的表,当key不存在时返回一个空表

例子:

127.0.0.1:6379[1]> HKEYS student1

stuName

stuID

age

sex

height

weight

birthday

className

motto

(5)HVALS命令:获取哈希表中所有域的值

命令格式:

HVALS key

作用:

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

返回值:

返回一个包含哈希表key中所有域的值的表,当key不存在时返回一个空表

例子:

127.0.0.1:6379[1]> HVALS student1

刘河飞

20180001

22

171

75

1996-02-14

软件工程1班拼个春夏秋冬,赢个无悔人生

2.3哈希表统计

(1)HLEN命令:统计哈希表中域的数量

命令格式:

HLEN key

作用:

统计哈希表key中域的数量

返回值:

返回哈希表key中域的数量,如果key不存在则返回0表示一个域也没有

例子:

127.0.0.1:6379[1]> HKEYS student1

stuName

stuID

age

sex

height

weight

birthday

className

motto

127.0.0.1:6379[1]> HLEN student1

9

(2)HSTRLEN命令:统计域的值的字符串长度

命令格式:

HSTRLEN key field

作用:

统计哈希表key中与给定域(field)相关联的值的字符串长度,当key或field不存在时返回0

返回值:

执行该命令后返回一个整数,这个整数大于或等于0

例子:

127.0.0.1:6379[1]> HSTRLEN student1 stuName   #统计学生姓名的长度

9

127.0.0.1:6379[1]> HSTRLEN student1 stuID       #统计学生学号的长度

8

127.0.0.1:6379[1]> HSTRLEN student className   #统计一个不存在的哈希表中域的值的长度

0

127.0.0.1:6379[1]> HSTRLEN student1 className #统计

16

127.0.0.1:6379[1]> HSTRLEN student1 motto

39

2.4为哈希表中的域加上增量值

(1)HINCRBY命令:为哈希表中的域加上增量值

命令格式:

HINCRBY key field increment

作用:

为哈希表key中field的值加上增量值(increment),增量值可以是负数,相当于对这field的值进行减法操作。如果key不存在会创建一个新的哈希表key然后继续执行命令。如果field 不存在会把field的值初始化为0然后执行命令。执行HINCRBY命令时必须保证field是数值类型的,如果对一个存储字符串的field执行HINCRBY命令会报错。HINCRBY命令操作的值被限制在64位有符号数字表示范围之内

返回值:

返回执行命令之后的新值,也就是哈希表key中域(field)的值

例子:

127.0.0.1:6379[1]> HINCRBY student1 age 3

25

127.0.0.1:6379[1]> HINCRBY student1 height 3

174

127.0.0.1:6379[1]> HINCRBY student1 weight 3

78

127.0.0.1:6379[1]> HINCRBY student1 className 3  #为字符串类型的值加上增量值,将会报错

ERR hash value is not an integer

(2)HINCRBYFLOAT命令:为哈希表中的域加上浮点数增量值命令格式:

HINCRBYFLOAT key field increment

作用:

为哈希表key中field的值加上浮点数增量值(increment),如果key不存在会先创建一个新的哈希表key再创建field后执行浮点数加法操作,如果field不存在会先将field的值初始化为0再执行浮点数加法操作。在Redis中,数字和浮点数都以字符串的形式进行保存。当域(field)的值不是字符串类型时将会报错。当域(field)的当前值或给定的增量值不是双精度浮点数时会报错

返回值:

返回执行该命令之后field的新值

例子:

127.0.0.1:6379[1]> HINCRBYFLOAT student2 height 3.56

178.56

127.0.0.1:6379[1]> HINCRBYFLOAT student2 weight 4.61

77.61

127.0.0.1:6379[1]> HINCRBYFLOAT student2 className 2.54 #为字符串类型的值加上浮点数增量值,将会报错

ERR hash value is not a float

2.5删除哈希表中的域

(1)HDEL命令:删除哈希表中的多个域

命令格式:

HDEL key field [field ...]

作用:

用于删除哈希表key中的一个或多个指定域(field),会忽略不存在的域

返回值:

返回被删除的域的数量,其中不包括被忽略的域

例子:

127.0.0.1:6379[1]> HDEL student5 height weight

2

127.0.0.1:6379[1]> HDEL student5 birthday className

2

127.0.0.1:6379[1]> HDEL student5 birthday className

0

(2)HEXISTS 命令:判断哈希表中的域是否存在

命令格式:

HEXISTS key field

作用:

判断哈希表key中的field是否存在

返回值:

如果field存在返回1,如果哈希表key不存在或者field不存在返回0

例子:

127.0.0.1:6379[1]> HEXISTS student5 stuName

1

127.0.0.1:6379[1]> HEXISTS student5 age

1

3 、列表(List)类型

Redis的列表(List)数据类型可以看作简单的字符串列表。列表按照插入顺序排序。在操作Redis的列表时,可以将一个元素插入这个列表的头部或尾部。一个列表大约可以存储2^32-1个元素

3.1向列表中插入值

(1)LPUSH命令:将多个值插入列表头部

命令格式:

LPUSH key value [value ...]

作用:

将一个或多个value值插入列表key的头部。如果同时插入多个value值,那么各个value值将会按照从左到右的顺序依次插入表头。例如,对于空列表list,执行命令LPUSH list a b c,列表key 的值将是c b a。当列表key不存在时,将会创建一个空列表然后执行LPUSH命令。如果key存在但它不是列表类型的,则执行LPUSH命令将会报错

返回值:

执行LPUSH命令后返回列表的长度

例子:

127.0.0.1:6379[2]> LPUSH student1 171 '男' 22 20180001

4

127.0.0.1:6379[2]> LPUSH student2 175 '女' 24 20181762 

4

(2)RPUSH命令:将多个值插入列表尾部

命令格式:

RPUSHkey value [value …]

作用:

将一个或多个value值插入列表key的表尾。如果同时插入多个value值,那么各个value值会按照从左到右的顺序依次插入表尾。比如对于空列表list执行RPUSH list a b c命令之后列表key的值是a b c。如果key不存在将会创建一个空列表然后执行RPUSH命令。如果key存在,但它不是列表类型,则执行RPUSH命令将会返回一个错误

返回值:

返回列表的长度

例子:

127.0.0.1:6379[2]> RPUSH student1 75 1996-02-14

6

127.0.0.1:6379[2]> RPUSH student2 73 1994-04-23

6

(3)LINSERT命令:插入一个值到列表中

命令格式:

LINSERT key BEFORE | AFTER pivot value

作用:

向列表中插入一个值,也就是将值value插入列表key当中,这个值的位置在值pivot之前或之后。在列表key中,当pivot这个值不存在时执行命令无效。当列表key不存在时,key将被看作空列表执行命令无效。而当key不是列表类型时返回一个错误

返回值:

如果成功则返回插入操作完成之后的列表长度。如果只有pivot不存在则返回-1。如果key 不存在或是空列表则返回0

例子:

127.0.0.1:6379[2]> LINSERT student1 AFTER 22 '软件工程1班'

7

127.0.0.1:6379[2]> LINSERT student2 AFTER 24 '网络工程1班'

7

(4)LPUSHX 命令:将值插入列表头部

命令格式:

LPUSHX key value

作用:

将value值插入列表key的头部,此时key必须存在,并且是列表类型的。LPUSHX命令与 LPUSH命令相反,当key不存在时,LPUSHX命令不会创建一个新的空列表,它什么也不做

返回值:

返回列表 key 的长度

例子:

127.0.0.1:6379[2]> LPUSHX student1 '刘河飞'

8

127.0.0.1:6379[2]> LPUSHX student2 '赵雨梦'

8

(5)RPUSHX 命令:将值插入列表尾部

命令格式:

RPUSHXkey value

作用:

当且仅当key存在并且是列表类型时,将value值插入列表key的表尾。RPUSHX命令与 RPUSH命令恰好相反,当key不存在时,它什么也不做,也不会创建空列表

返回值:

返回列表key的长度

例子:

127.0.0.1:6379[2]> RPUSHX student1 '游泳'

9

127.0.0.1:6379[2]> RPUSHX student2 '旅游'

9

(6)LSET 命令:修改列表元素值

命令格式:

LSET key index value

作用:

设置下标为index的列表key的值为value。当下标index参数超出范围时,将会返回错误,当列表key为空时返回错误

返回值:

如果 LSET 操作成功返回 OK,否则返回错误

例子:

127.0.0.1:6379[2]> LSET student1 2 25              #学生1的年龄下标为2

OK

127.0.0.1:6379[2]> LSET student1 5 175             #学生1的身高下标为5

OK

3.2获取列表元素

(1)LLEN命令:统计列表的长度

命令格式:

LLEN key

作用:

统计列表key的长度。当key不存在时,key将被视为空列表返回0。当key不是列表类型时返回一个错误

返回值:

返回列表key的长度

例子:

127.0.0.1:6379[2]> LLEN student1

9

127.0.0.1:6379[2]> LLEN student2

9

(2)LINDEX命令:获取列表元素的值

命令格式:

LINDEX key index

作用:

获取列表key中下标为index的元素。index参数以0表示列表中的第一个元素,以此类推。index参数可以为负数,-1表示列表中的后一个元素,以此类推。当key不是列表类型时,返回一个错误

返回值:

当列表存在时,返回列表中下标为index的元素。当index参数不在列表的范围之内(大于或小于列表范围)时,返回nil

例子:

127.0.0.1:6379[2]> LINDEX student1 2

25

127.0.0.1:6379[2]> LINDEX student1 5

175

(3)LRANGE命令:获取列表指定区间内的元素

命令格式:

LRANGE key start end

作用:

获取列表key指定区间内的元素,区间从start开始到end结束。参数start和end都以0为底即0表示列表中的第一个元素,以此类推。参数start和end也可以是负数即-1表示列表中的后一个元素,以此类推

●   当参数start和end的值超出列表的下标值时不会引起错误

●   当参数start的值大于列表的最大下标end 值时,执行会返回一个空列表

●   当设定的参数值比下标end值还要大时,Redis将会把这个设定的参数作为列表的end值(最大值)。

返回值:

返回一个包含指定区间内的元素的列表

例子:

127.0.0.1:6379[2]> LRANGE student1 0 -1  #获取列表student1中的所有元素刘河飞

20180001

25

软件工程1班

175

75

1996-02-14

游泳

3.3删除列表元素

(1)LPOP命令:返回并删除列表的头元素

命令格式:

LPOP key

作用:

用于返回列表key的头元素,同时把这个头元素删除

返回值:

返回列表的头元素,如果key不存在将会返回nil

例子:

127.0.0.1:6379[2]> LRANGE student5 0 -1  #获取列表student5中的所有元素孙玉

20180097

22

软件工程2班

166

63

1996-09-10

电影

127.0.0.1:6379[2]> LPOP student5 #删除列表 student5 的头元素

孙玉

(2)RPOP命令:返回并删除列表的尾元素

命令格式:

RPOP key

作用:

返回列表key的尾元素并把这个尾元素删除

返回值:

当列表key存在时执行RPOP命令将会返回表尾的元素。当列表key不存在时将会返回nil

例子:

127.0.0.1:6379[2]> LRANGE student5 0 -1    #获取列表student5中的所有元素

22

软件工程2班女

166

63

1996-09-10

电影

(3)BLPOP 命令:在指定时间内删除列表的头元素命令格式:

BLPOPkey [key ...] timeout

作用:

BLPOP命令是列表的阻塞式弹出原语,是命令LPOP的阻塞版本。当列表中没有任何元素 key被弹出时,连接将被命令BLPOP阻塞,直到等待以秒为单位的超时时间或有可弹出元素为止,当timeout取值为0时,这个阻塞时间可以无限延长。当设定多个参数key

时将会按照参数key出现的先后顺序来依次检查各个列表,弹出第一个非空列表的头元素

返回值:

如果给定的列表为空则返回nil。如果给定的列表不为空则将会返回一个包含两个元素的列表,列表中的第一个元素是要被弹出元素所对应的key,第二个元素是被弹出元素的值

例子:

127.0.0.1:6379[2]> LRANGE student5 0 -1   #获取列表student5中的所有元素

22

软件工程2班

166

63

127.0.0.1:6379[2]> BLPOP student5 5  #在5秒内,删除列表student5的头元素

student5

22

127.0.0.1:6379[2]> EXISTS student6   #判断列表student6是否存在

0

127.0.0.1:6379[2]> BLPOP student6 300   #在300秒内,删除列表student6的头元素。开启另一个客户端,使用LPUSH命令添加元素到列表student6中;否则BLPOP命令会被阻塞

student6

一个好人

127.0.0.1:6379[2]>BLPOP student6 200

student6

20180103

(5)BRPOP命令:在指定时间内删除列表的尾元素

命令格式:

BRPOP key [key…] timeout

作用:

BRPOP命令是列表key的阻塞式命令。当给定列表内没有任何元素可以返回时连接将被BRPOP命令阻塞直到等待超时或发现可返回的元素为止。BRPOP命令是RPOP命令的阻塞版本。当同时给定多个参数key时,将会按照参数key的先后顺序检查各个列表,返回第一个非空列表的尾元素。timeout参数用于设定时长

返回值:

如果在指定的timeout时间内没有返回任何元素将会返回nil和等待时长。如果在timeout时间内返回一个列表,那么这个列表中的第一个元素表示被返回元素所属的key,第二个元素表示被返回元素的值

例子:

127.0.0.1:6379[2]> LRANGE student5 0 -1

软件工程2班

166

63

127.0.0.1:6379[2]> BRPOP student520  #在20秒内,删除列表student5的尾元素

student5

63

127.0.0.1:6379[2]> BRPOP student5 200

student5

166

(6)LREM命令:删除指定个数的元素

命令格式:

LREM key count value

作用:

用于根据参数count的值删除列表key中与指定参数value 相等的元素

●    当count等于0时表示删除列表key中所有与value相等的元素

●    当count大于0时表示从列表key的表头开始向表尾搜索,删除与value相等的元素,删除的数量为count个

●    当count小于0时表示从列表key的表尾开始向表头搜索,删除与value相等的元素,删除的数量为count的绝对值个

返回值:

当列表key存在时,返回被删除的元素数量。当列表key不存在时,就是一个空列表,该命令始终返回0

例子:

127.0.0.1:6379[2]> LRANGE student5 0 -1

软件工程2班

127.0.0.1:6379[2]> LREM student5 1 '女'

1

127.0.0.1:6379[2]> LREM student5 2 '女'

0

(7)LTRIM命令:在指定区间内修剪列表

命令格式:

LTRIM key start stop

作用:

用于对一个列表进行修剪(trim),比如去除不必要的空格,让列表key只保留指定区间内的元素,不在这个区间内的元素将会被删除。 比如执行命令LTRIM list 0 5表示只保留列表list中的前6个元素,其余元素将会被删除。参数start和stop的默认值都是0,用0表示列表中的第一个元素,以此类推。参数start和stop也可以是负数,用-1表示列表中的 后一个元素,以此类推。如果key不是列表类型将返回一个错误。当参数start和stop的值超出列表的下标值时不会引起错误。如果参数start的值比列表下标的最大值还要大或者 start大于stop,那么执行LTRIM命令将会清空这个列表返回一个空列表。如果参数stop的值比列表下标的最大值还要大则Redis会将stop的值作为这个列表下标的最大值

返回值:

返回OK表示执行成功

例子:

127.0.0.1:6379[2]> LTRIM student4 0 50  #在0~50区间内修剪列表,因为50远远大于原列表的大小,因此列表元素并不会被删除

OK

127.0.0.1:6379[2]> LRANGE student4 0 -1

陈慧

20181120

23

信息管理1班女

170

64

1995-03-15

音乐

127.0.0.1:6379[2]> LTRIM student4 0 6  #在0~6区间内修剪列表,将会删除下标大于6的其他元素

OK

127.0.0.1:6379[2]> LRANGE student4 0 -1

陈慧

20181120

23

信息管理1班女

170

64

3.4移动列表

(1)RPOPLPUSH命令:将列表元素移动到另一列表中

命令格式:

RPOPLPUSH source destination

作用:

RPOPLPUSH命令在一个原子时间内会将列表source中的最后一个元素弹出并返回给客户端。这个被返回的元素将会插入列表destination中作为该列表的头元素。当列表source不存在时将会返回nil值,同时后面的操作将不会执行。如果列表source与列表destination相同,那么列表的尾元素将被移动到表头并返回该元素,这种情况就是列表的旋转操作

返回值:

返回被弹出的元素

例子:

127.0.0.1:6379[2]> LRANGE student1 0 -1  #获取列表student1中的所有元素刘河飞

20180001

25

软件工程1班

175

75

1996-02-14

游泳

127.0.0.1:6379[2]> RPOPLPUSH student1 student6  #将列表 student1 的尾元素移动到列表 student6中游泳

127.0.0.1:6379[2]> LRANGE student6 0 -1  #获取列表student6中的所有元素游泳

127.0.0.1:6379[2]> RPOPLPUSH student1 student6

1996-02-14

127.0.0.1:6379[2]> LRANGE student6 0 -1

[if !supportLists]1996-02-14[endif] 

游泳

(2)BRPOPLPUSH 命令:在指定时间内移动列表元素到另一列表中

命令格式:

BRPOPLPUSH source destination timeout

作用:

BRPOPLPUSH命令是RPOPLPUSH命令的阻塞版本。当列表source不存在(为空)时,BRPOPLPUSH命令将阻塞连接,直到等待超时或被另一个客户端对列表source执行 RPUSH或LPUSH命令为止。当列表source不为空时,BRPOPLPUSH命令执行的效果和 RPOPLPUSH命令执行的效果一样。参数timeout表示超时时间,单位为秒。当timeout值为0时,表示阻塞时间可以无限期延长

返回值:

如果在指定时间内没有任何元素被弹出则将会返回nil和等待时长。如果返回一个列表,那么列表中的第一个元素是被弹出元素的值,第二个元素是等待时长

例子:

127.0.0.1:6379[2]> LRANGE student1 0 -1 刘河飞

20180001

25

软件工程1班

175

75

127.0.0.1:6379[2]> BRPOPLPUSH student1 student6 200 #在200秒内,将列表student1中的元素移动到列表student6中

75

127.0.0.1:6379[2]> BRPOPLPUSH student1 student6 200

175

127.0.0.1:6379[2]> BRPOPLPUSH student1 student6 200 男

127.0.0.1:6379[2]> LRANGE student1 0 -1   #列表student1移动完元素后,查看剩余元素刘河飞

20180001

25

软件工程1班

3.5列表模式

(1)安全队列

Redis的列表经常被看作一个队列,用于在不同程序之间有序交换消息。一个客户端通过LPUSH命令将一条消息放入这个队列中,然后开启另一个客户端通过RPOP或BRPOP命令取出这个队列中等待时间最长的消息。但是这个队列是不安全的,当一个客户端在取出一条消息后遇到错误或其他原因导致客户端崩溃时,还没有处理完的消息就会丢失。

为了保证未处理完的消息不再丢失,可以使用命令RPOPLPUSH来解决。RPOPLPUSH命令在返回一条消息的同时会将这条消息保存到另一个列表中,这样就保证了没有处理完的消息不会丢失。在处理完这条消息之后,可以使用命令LREM从这个备份列表中将其删除。可以添加一个客户端来监视这个备份列表,这个客户端会自动将超过一定处理时间的消息备份到这个列表中,以此来保证消息不会丢失

(2)循环列表

使用RPOPLPUSH命令可以实现循环列表。使用相同的key作为RPOPLPUSH命令的两个参数,客户端采用逐个获取列表元素的方式取出列表中的所有元素。这样就避免了像使用 LRANGE命令那样同时取出列表中的所有元素。

当有多个客户端同时对同一个列表进行旋转操作来获取不同元素,直到所有元素被读取完,之后又开始循环时,这个循环列表可以正常工作。

当有客户端向列表尾部添加新元素时,这个循环列表也能正常工作。

4、集合(Set)类型

Redis的数据类型集合(Set)是String类型的无序集合。集合无序且不存在重复的元素,每个元素都是唯一的。集合是通过哈希表来实现的,所以使用集合进行增加、删除、查询操作时的效率特别高,复杂度为O(1)。一个集合所能存储的最大容量为2^32 -1个元素

4.1向集合中添加元素

(1)SADD命令:添加多个元素到集合中

命令格式:

SADD key member [member ...]

作用:

将一个或多member元素添加到集合key中,如果集合key中已经存在这个member元素,那么它将会被忽略。如果集合key不存在就创建一个集合,这个集合中只包含这里设置的 member元素。当key不是集合类型时返回一个错误

返回值:

返回被添加到集合中的新元素的数量,不包含被忽略的元素

例子:

127.0.0.1:6379[3]> SADD citys1 '北京' '上海' '广州' '深圳' '杭州' '苏州' '南京' '成都'

8

(2)SMOVE命令:移动集合元素到另一个集合中

命令格式:

SMOVE source destination member

作用:

将集合source中的member元素移动到集合destination中。SMOVE命令是原子性操作,要么执行成功要么不执行。如果集合source不存在或集合source中不存在member元素,则 SMOVE命令不执行任何操作将返回0,如果集合source中包含member元素,那SMOVE命令会将member元素从集合source移动到集合destination中,当集合destination中已经包含member元素时,SMOVE命令只是简单地将集合source中的member元素删除而不会移动,当source和destination不是集合类型时,返回一个错误

返回值:

当member元素成功地从集合source移动到集合destination中时返回1,当集合source中没有member元素或集合source不存在时返回0,表示SMOVE命令不做任何事情例子例子

例子:

127.0.0.1:6379[3]> SMOVE citys2 citys1 '昆明'

1

127.0.0.1:6379[3]> SMOVE citys2 citys1 '昆明'

0

(3)SUNIONSTORE命令:保存多个集合元素到新集合中

命令格式:

SUNIONSTORE destination key [key ...]

作用:

获取一个或多个集合key中的全部元素并将这些元素保存到集合destination中,这个集合中的元素是给定的集合key元素的交集。当只有一个集合key时执行该命令后,产生的集合destination就是这个集合key本身

返回值:

返回这个交集集合destination中的元素数量

例子:

127.0.0.1:6379[3]> SUNIONSTORE citys citys1 citys2 citys3

22

4.2获取集合元素

(1)SISMEMBER命令:判断某个元素是否在集合中                          

命令格式:

SISMEMBER key number

作用:

判断元素number是否在集合key中

返回值:

如果集合key中存在元素number则返回1,如果集合key中不存在元素number或集合key 不存在返回0

例子:

127.0.0.1:6379[3]> SISMEMBER citys '北京'

1

127.0.0.1:6379[3]> SISMEMBER citys2 '北京'

0

(2)SCARD命令:获取集合中元素的数量

命令格式:

SCARD key

作用:

获取集合key中元素的数量

返回值:

返回集合key中的元素个数,当集合key不存在时返回0

例子:

127.0.0.1:6379[3]> SCARD citys

22

127.0.0.1:6379[3]> SCARD citys1

9

(3)SMEMBERS命令:获取集合中的所有元素

命令格式:

SMEMBERS key

作用:

获取集合key中的所有元素,如果这个集合key不存在,则会被看作空集合

返回值:

该命令成功执行后,返回这个集合中的所有元素

例子:

127.0.0.1:6379[3]> SMEMBERS citys

苏州

合肥

济南

佛山

南昌

兰州

哈尔滨

成都

保定

(4)SRANDMEMBER命令:随机获取集合中的一个元素

命令格式:

SRANDMEMBER key [count]

作用:

当且仅当只有参数key时,随机返回集合key中的一个元素,不会改动这个集合的内容。在后来的版本中添加了参数count。参数 count 可以是一个正数,也可以是一个负数, 当count 为正数且小于集合基数时返回一个包含count个元素的数组,数组中的元素各不相同。当 count大于等于集合基数时返回整个集合。当count为负数时返回一个元素可能重复多次的数组,这个数组的长度是count的绝对值

返回值:

如果集合为空则返回nil,如果只设置了key参数则将会随机返回一个元素,如果设置count 参数则将会返回一个数组,如果集合为空则将会返回一个空数组

例子:

127.0.0.1:6379[3]> SRANDMEMBER citys 5

济南

佛山

南京

苏州

昆明

127.0.0.1:6379[3]> SRANDMEMBER citys 5

兰州

成都

广州

银川

厦门

127.0.0.1:6379[3]> SRANDMEMBER citys1 5

广州

昆明

上海

深圳

北京

(5)SUNION命令:获取多个集合中的所有元素

命令格式:

SUNION key [key ...]

作用:

获取一个或多个集合key中的全部元素,这个返回的集合是所有给定集合key的并集。如果集合key不存在则会被看作空集

返回值:

返回并集元素列表

注意:

SUNION命令只是单纯地返回并集元素列表,并不会保存这些元素。如果多个集合中含有相同的元素,会忽略重复的元素

例子:

127.0.0.1:6379[3]> SUNION citys citys1 citys2 citys3

保定

南京

广州

昆明

银川

襄阳

深圳

4.3集合运算

(1)SDIFF命令:获取多个集合元素的差集

命令格式:

SDIFF key [key ...]

作用:

获取一个或多个集合的全部元素,该集合是所有给定集合之间的差集。集合key不存在就视为空集合

返回值:

返回一个包含多个集合key的差集成员的列表

例子:

127.0.0.1:6379[3]> SDIFF citys1 citys2

杭州

南京

北京

深圳

苏州

广州

上海

成都

昆明

127.0.0.1:6379[3]> SADD citys2 '北京' '上海' '广州' '深圳'

4

127.0.0.1:6379[3]> SDIFF citys1 citys2

杭州

南京

苏州

成都

昆明

127.0.0.1:6379[3]> SDIFF citys2 citys1

合肥

厦门

济南

佛山

兰州

南昌

哈尔滨

解释:之所以 SDIFF citys1 citys2 命令与 SDIFF citys2 citys1命令产生的结果不同,是因为集合在进行差集运算时的顺序不同。

(2)SDIFFSTORE命令:获取多个集合差集的元素个数

命令格式:

SDIFFSTORE destination key [key ...]

作用:

获取一个或多个集合key的全部元素并将获取的元素保存到集合destination中,这个集合是给定的多个集合key的元素差集。如果集合destination已经存在则会被新的集合覆盖。如果给定的集合key是一个而不是多个,那么这个destination集合就是给定的集合key本身

返回值:

返回新集合 destination中的元素数量。

例子:

127.0.0.1:6379[3]> SDIFFSTORE citys4 citys citys1 citys2

6

127.0.0.1:6379[3]> SMEMBERS citys4

三亚

襄阳

银川

保定

丽江

桂林

127.0.0.1:6379[3]> SDIFFSTORE citys5 citys citys3

9

127.0.0.1:6379[3]> SMEMBERS citys5

杭州

深圳

北京

南京

苏州

广州

昆明

成都

上海

(3)SINTER命令:获取多个集合元素的交集

命令格式:

SINTER key [key ...]

作用:

获取给定的一个或多个集合key中的全部元素,该集合是所有给定集合的交集。如果集合 key不存在则会被看作空集合。如果给定的多个集合key中有一个是空集合,那么执行该命令后的结果集就是一个空集合

返回值:

返回交集中的元素列表。

注意:

被返回的交集中的元素并不会被保存

例子:

127.0.0.1:6379[3]> SINTER citys citys4

三亚

襄阳

银川

保定

丽江

桂林

127.0.0.1:6379[3]> SINTER citys3 citys5   #集合citys3与citys5没有交集,返回空

127.0.0.1:6379[3]> SINTER citys citys1 citys2

广州

上海

深圳

北京

127.0.0.1:6379[3]> SINTER citys citys1 citys2 citys3citys6  #集合citys6是空集合,因此交集为空

(4)SINTERSTORE命令:获取多个集合交集的元素个数

命令格式:

SINTERSTORE destination key [key ...]

作用:

获取给定的一个或多个集合key中的全部元素,并将这些元素保存到集合destination中,如果集合destination已经存在,则会被新产生的集合覆盖。当有一个集合key时,这个 destination集合就是集合key本身

返回值:

返回结果集destination中的成员数量

例子:

127.0.0.1:6379[3]> SINTERSTORE citys6 citys citys4

6

127.0.0.1:6379[3]> SINTERSTORE citys7 citys citys1 citys2

4

127.0.0.1:6379[3]> SINTERSTORE citys8 citys6 citys7

0   #返回的成员数量为0,表示没有交集

127.0.0.1:6379[3]> SINTERSTORE citys9 citys citys1 citys2citys3 citys4 citys5

0

127.0.0.1:6379[3]> SINTERSTORE citys10 citys3 citys5 citys7

0

127.0.0.1:6379[3]> SINTERSTORE citys11 citys citys2

11

4.4删除集合元素

(1)SPOP命令:删除集合中的元素

命令格式:

SPOP key [count]

作用:

随机删除集合key中的一个或多个元素

返回值:

返回被删除的随机元素,如果集合key不存在或者集合key是空集合则返回nil

例子:

127.0.0.1:6379[3]> SPOP citys5

苏州

127.0.0.1:6379[3]> SPOP citys5 2

广州

成都

127.0.0.1:6379[3]> SPOP citys 3

丽江

兰州

南昌

127.0.0.1:6379[3]> SMEMBERS citys5

杭州

南京

昆明

上海

北京

深圳

127.0.0.1:6379[3]> SPOP citys12  #集合citys12不存在,返回空

(2)SREM命令:删除集合中的多个元素

命令格式:

SREM key member [member ...]

作用:

删除集合key中的一个或多个member元素。该命令在执行过程中会忽略不存在的member 元素,如果key不是集合类型则返回一个错误

例子:

127.0.0.1:6379[3]> SMEMBERS citys5

杭州

南京

昆明

上海

北京

深圳

127.0.0.1:6379[3]> SREM citys5 '杭州'  '深圳'  #删除“杭州”“深圳”

2

127.0.0.1:6379[3]> SREM citys5 '杭州'  '深圳'  #之前已被删除,再次删除失败

0

127.0.0.1:6379[3]> SREM citys5 '北京' '上海' '广州' '武汉' #“广州”“武汉”不在集合中,删除失败

2

5、有序集合(SortedSet)类型

Redis的数据类型有序集合(SortedSet)也是String类型的集合。有序集合中不存在重复的元素,每个集合元素都有一个对应的double类型的分数。Redis就是通过这个元素对应的分数来为集合元素进行从小到大的排序的。集合中的元素是唯一的,但是集合元素所对应的分数值不唯一,可以重复。有序集合采用哈希表实现,当面对增加、删除、查询操作时效率特别高,复杂度为O(1)。有序集合中所能存储的最大元素数量是2^32 -1个

5.1添加元素到有序集合中

(1)ZADD命令:添加多个元素到有序集合中

命令格式:

ZADD key score member [[score member] [score member] ...]

作用:

将一个或多个member元素及它对应的score值加入有序集合key中。如果有序集合key中已经存在某个member元素,那么只更新这个member元素的score值,然后重新插入 member元素,以此来确保member元素在正确的位置上。score值可以是double类型的浮点数,也可以是整数值。如果有序集合key不存在,则创建一个新的有序集合,然后执行 ZADD操作。如果key存在,但它不是有序集合类型的,则返回一个错误

返回值:

返回被成功添加的新元素的数量,不包括那些被更新的、已经存在的元素

例子:

127.0.0.1:6379[4]> ZADD citys-GDP 15892 '北京' 15754 '上海' 13240 '广州' 11562 '深圳' 9854 '武汉' 

5

127.0.0.1:6379[4]> ZADD citys-GDP  7651 '昆明' 2351 '桂林' 10246 '南京' 8653 '贵阳'

4

(2)ZINCRBY命令:为分数值加上增量

命令格式:

ZINCRBY key increment member

作用:

为有序集合key中的member元素的score值加上增量increment。当increment是一个负数时,表示让score减去相应的值。当key不存在或有序集合key中没有member元素时,ZINCRBY key increment member命令等价于ZADD key increment member命令。当key不是有序集合类型时返回一个错误,参数score值可以是double类型的浮点数也可以是整数值(正负数)

返回值:

会以字符串的形式返回有序集合key中的member元素的score值

例子:

127.0.0.1:6379[4]> ZINCRBY citys-GDP 100 '昆明'    #为集合元素的分数值加上整数增量

7751

127.0.0.1:6379[4]> ZINCRBY citys-GDP -20 '贵阳'

8633

127.0.0.1:6379[4]> ZINCRBY citys-GDP 100.55 '桂林'   #为集合元素的分数值加上浮点数增量

2451.5500000000002

127.0.0.1:6379[4]> ZINCRBY citys-GDP -24.81 '昆明'

7726.1899999999996

5.2获取有序集合元素

(1)ZCARD命令:获取有序集合中的元素数量

命令格式:

ZCARDkey

作用:

获取有序集合key中的元素数量

返回值:

当key存在并且是有序集合时,返回有序集合中的元素个数。当key不存在时返回0

例子:

127.0.0.1:6379[4]> ZCARD citys-GDP

9

127.0.0.1:6379[4]> ZCARD citys-GDP1   #不存在的有序集合

0  

(2)ZCOUNT命令:获取在分数区间内的元素数量

命令格式:

ZCOUNT key min max

作用:

获取有序集合key中score值在min和max之间(默认包含score值等于min或max)的元素数量

返回值:

返回介于min和max值之间的元素数量

例子:

127.0.0.1:6379[4]> ZCOUNT citys-GDP 7000 9000

2

127.0.0.1:6379[4]> ZCOUNT citys-GDP 10000 13000

2

127.0.0.1:6379[4]> ZCOUNT citys-GDP 10000 20000

5

(3)ZLEXCOUNT命令:获取在指定区间内的元素数量

命令格式:

ZLEXCOUNT key min max

作用:

获取有序集合key中介于min和max范围内的元素数量,这个有序集合key中的所有元素的score值都相等, 参数min和max是一个区间,区间一般使用“(”或“[”表示,其中,“(”表示开区间,“(”指定的值不会被包含在范围之内,“[”表示闭区间,“[”指定的值会被包含在范围之内。另外特殊值 + 和 - 在参数 min 和 max 中具有特殊含义,其中,+ 表示正无穷,- 表示负无穷。

返回值:

返回一个整数值表示在指定范围内的元素数量

例子:

127.0.0.1:6379[4]> ZADD citys-GDP1 12000 '北京' 12000 '上海' 12000 '广州' 12000  '深圳' 12000 '武汉' 12000 '昆明'   #有序集合citys-GDP1中的所有元素分数值都相等

6

127.0.0.1:6379[4]>ZLEXCOUNT citys-GDP1 - +  #获取有序集合中的所有元素数量

6

127.0.0.1:6379[4]> ZLEXCOUNT citys-GDP1 (上海  [深圳

5

127.0.0.1:6379[4]> ZLEXCOUNT citys-GDP1 [上海  [上海

1

127.0.0.1:6379[4]>ZLEXCOUNT citys-GDP1 (上海  (昆明

(4)ZRANGE命令:获取在指定区间内的元素(升序)

命令格式:

ZRANGE key start stop [WITHSCORES]

作用:

用于返回有序集合key中指定区间内的元素。返回的元素按照score值从小到大的顺序排序。具有相同score值的元素会按照字典序排序。参数start和stop的默认值为0。0表示有序集合key中的第一个元素,以此类推。使用-1表示有序集合key中的最后一个元素,以此类推。超出有序集合的下标不会引起错误。当start的值大于有序集合key的最大下标或者start大于stop时,ZRANGE命令什么也不做,只是简单地返回一个空列表。当stop的值大于有序集合key的最大下标时,Redis会将这个stop的值作为有序集合key的新下标。可以使用WITHSCORES选项来实现同时返回集合元素和这些元素所对应的score值,返回的格式是:value1, score1, … , valueN,scoreN。返回的元素的数据类型可能会很复杂,如元组、数组等

返回值:

会返回指定区间内带有score值的列表元素集合

例子:

127.0.0.1:6379[4]>ZRANGE citys-GDP 0 -1 

桂林

昆明

贵阳

武汉

南京

深圳

广州

上海

北京

127.0.0.1:6379[4]>ZRANGE citys-GDP 0 -1 WITHSCORES

桂林

2451.5500000000002

昆明

7726.1899999999996

贵阳

8633

武汉

9854

南京

10246

深圳

11562

广州

13240

上海

15754

北京

15892

127.0.0.1:6379[4]>ZRANGE citys-GDP 4 -1 

南京

深圳

广州

上海

北京

(5)ZREVRANGE命令:获取在指定区间内的元素(降序)

命令格式:

ZREVRANGE key start stop [WITHSCORES]

作用:

用于返回有序集合key中指定区间内的元素。返回的元素按照score值从大到小的顺序排序。如果有相同score值的元素,则按照字典序的逆序排序。使用WITHSCORES选项来返回元素的score值。ZREVRANGE命令与ZRANGE命令相反,ZRANGE命令按照score值从小到大的顺序返回有序集合元素

返回值:

返回指定区间内的有序集合元素

例子:

127.0.0.1:6379[4]>ZREVRANGE citys-GDP 0 -1 WITHSCORES

北京

15892

上海

15754

广州

13240

深圳

11562

南京

10246

武汉

9854

贵阳

8633

昆明

7726.1899999999996

桂林

2451.2 

(6)ZSCORE命令:获取元素的分数值

命令格式:

ZSCOREkey member

作用:

用于返回有序集合key中member元素的score值。如果有序集合key中不存在member元素或者key不存在则返回nil

返回值:

以字符串的形式返回member元素的score值

例子:

127.0.0.1:6379[4]>

ZSCORE citys-GDP '北京'

15892

127.0.0.1:6379[4]>

ZSCORE citys-GDP '上海' '武汉'

ERRwrong number of arguments for 'zscore' command


127.0.0.1:6379[4]>

ZSCORE citys-GDP '上海'

15754

127.0.0.1:6379[4]>ZSCORE citys-GDP '昆明'

7726.1899999999996

(7)ZRANGEBYLEX命令:获取集合在指定范围内的元素

命令格式:

ZRANGEBYLEX key min max [LIMIT offset count]

作用:

返回有序集合key中元素score值介于min和max之间的元素,这个有序集合key中的所有元素具有相同的score值,它们按照字典序排序。如果有序集合key中的元素对应的 score值不同,返回的结果是未指定的。可选的LIMIT offset count参数用于获取指定范围内的匹配元素。此时需要注意,如果offset参数的值非常大,那么该命令在返回结果之前,需要先遍历到offset所指定的位置。参数min和max是一个区间,区间一般使用“(”或“[”表示,其中“(”表示开区间,“(”指定的值不会被包含在范围之内;“[”表示闭区间,“[”指定的值会被包含在范围之内。另外,特殊值+和-在参数min和max中具有特殊含义,其中+表示正无穷,-表示负无穷。我们向一个元素分数相同的有序集合发送命令ZRANGEBYLEX - +,将会返回这个有序集合中的所有元素。

返回值:

返回有序集合在指定范围内的元素

例子:

127.0.0.1:6379[4]>ZRANGEBYLEX citys-GDP1 - +

上海

北京

广州

昆明

武汉

深圳

127.0.0.1:6379[4]>ZLEXCOUNT citys-GDP1 (上海  (昆明

2

127.0.0.1:6379[4]>ZRANGEBYLEX citys-GDP1 (上海+

北京

广州

昆明

武汉

深圳

127.0.0.1:6379[4]>ZRANGEBYLEX citys-GDP1 - [深圳

上海

北京

广州

昆明

武汉

深圳

127.0.0.1:6379[4]>ZRANGEBYLEX citys-GDP1  (广州 (武汉

昆明

(8)ZRANGEBYSCORE命令:获取在指定分数区间内的元素

命令格式:

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

作用:

用于返回有序集合key中,所有score值介于min和max之间(包含等于min 和max)的元素。有序集合key中的元素按照score值从小到大的顺序排序。当你不知道min和max参数的具体值时,可以使用-inf来表示min值,使用+inf来表示max值。在默认情况下,min与max区间是闭区间(小于等于或大于等于),也可以在参数前面添加“(”符号来使用可选的开区间(小于或大于)。当具有相同score值的元素时,有序集合元素会按照字典序排序。使用WITHSCORES选项来返回元素的score值。可选的LIMIT offset count参数用于获取指定范围内的匹配元素。如果offset参数的值非常大,那么该命令在返回结果之前,需要先遍历到offset所指定 的位置。

返回值:

返回在指定分数区间内的有序集合元素

例子:

127.0.0.1:6379[4]>ZRANGEBYSCORE citys-GDP 7000 12000 WITHSCORES

昆明

7726.1899999999996

贵阳

8633

武汉

9854

南京

10246

深圳

11562

127.0.0.1:6379[4]>ZRANGEBYSCORE citys-GDP 9000 +inf 

武汉

南京

深圳

广州

上海

北京

127.0.0.1:6379[4]>ZRANGEBYSCORE citys-GDP 9000 +inf WITHSCORES

武汉

9854

南京

10246

深圳

11562

广州

13240

上海

15754

北京

15892

127.0.0.1:6379[4]>ZRANGEBYSCORE citys-GDP (11000 (13240 WITHSCORES

深圳

11562

127.0.0.1:6379[4]>ZRANGEBYSCORE citys-GDP (8000 (13240 

贵阳

武汉

南京

深圳

(9)ZREVRANGEBYSCORE命令:获取在指定区间内的所有元素

命令格式:

ZREVRANGEBYSCOREkey max min [WITHSCORES] [LIMIT offset count]

作用:

用于返回有序集合key中,score值介于max和min之间(包含等于max和min)的所有元素。返回的元素按照score值从大到小的顺序排序。具有相同score值的元素按照字典序的逆序排序。使用WITHSCORES选项来同时返回有序集合元素所对应的score值。可选的 LIMIT offset count参数用于获取指定范围内的匹配元素。如果offset参数的值非常大,那么该命令在返回结果之前,需要先遍历到offset所指定的位置。ZREVRANGEBYSCORE 命令除score值按照从大到小的顺序排序之外,其他都与ZRANGEBYSCORE命令相同

返回值:

返回在指定区间内的所有有序集合元素

例子:

127.0.0.1:6379[4]>ZREVRANGEBYSCORE citys-GDP 8000 1100 WITHSCORES

昆明

7726.1899999999996

桂林

2451.5500000000002

127.0.0.1:6379[4]>ZREVRANGEBYSCORE citys-GDP 15000 10000 WITHSCORES

广州

13240

深圳

11562

南京

10246

127.0.0.1:6379[4]>ZREVRANGEBYSCORE citys-GDP (15000 (11000 WITHSCORES

广州

13240

深圳

11562

5.3有序集合排名

(1)ZRANK命令:获取有序集合元素的排名

命令格式:

ZRANK key member

作用:

获取有序集合key中member元素的排名。其中有序集合元素会按照score值从小到大的顺序排序。排名以0为底,就是score值最小的元素排名为0

返回值:

如果member不是有序集合key中的元素返回nil,如果member是有序集合key 中的元素则在执行该命令后返回member元素的排名

例子:

127.0.0.1:6379[4]>ZRANGE citys-GDP 0 -1

桂林昆明贵阳武汉南京深圳广州上海北京

127.0.0.1:6379[4]>

ZRANK citys-GDP '桂林'

0

127.0.0.1:6379[4]>

ZRANK citys-GDP '上海'

7

127.0.0.1:6379[4]>

ZRANK citys-GDP '南京'

4

(2)ZREVRANK命令:获取有序集合元素的倒序排名

命令格式:

ZREVRANK key member

作用:

返回有序集合key中member元素的排名,其中有序集合元素按照score 值从大到小的顺序排序。排名以0为底,就是score值大的成员排名为0

返回值:

如果有序集合key中存在member元素则返回member元素的排名,如果有序集合key中不存在membe元素则返回nil

例子:

127.0.0.1:6379[4]>ZREVRANGE citys-GDP 0 -1 

北京

上海

广州

深圳

南京

武汉

贵阳

昆明

桂林

127.0.0.1:6379[4]>ZREVRANK citys-GDP '北京'

0

127.0.0.1:6379[4]>ZREVRANK citys-GDP '上海'

1

127.0.0.1:6379[4]>ZREVRANK citys-GDP '桂林'

8    

5.4 有序集合运算

(1)ZINTERSTORE 命令:保存多个有序集合的交集

命令格式:

ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM| MIN | MAX]

作用:

用于计算给定的一个或多个有序集合key的交集,其中给定key的数量必须和numkeys相等,并将该交集存储到destination中。在默认情况下,交集(结果集)中的某个元素的score 值是所有给定有序集合中该元素的score值之和

返回值:

返回保存到destination结果集中的元素个数

例子:

127.0.0.1:6379[4]>ZADD citys-GDP3 6783 '北京' 5000 '上海' 5439 '广州' 7012 '深圳'

9423

'武汉'

5

127.0.0.1:6379[4]>ZADD citys-GDP4 7651 '北京' 5000 '上海' 6130 '广州' 3791 '深圳'

8759 '昆明'

5

127.0.0.1:6379[4]>ZINTERSTORE citys-GDP5 2 citys-GDP3 citys-GDP4 #有序集合交集运算4

127.0.0.1:6379[4]>ZRANGE citys-GDP5 0 -1 WITHSCORES 上海

10000

深圳

10803

广州

11569

北京

14434

(2)ZUNIONSTORE 命令:保存多个有序集合的并集

命令格式:

ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [ weight ...]] [AGGREGATE SUM| MIN | MAX]

作用:

计算给定的一个或多个有序集合key的并集,其中给定key的数量必须等于numkeys,并将计算的并集结果存入destination中。在默认情况下,这个并集结果中的某个元素的score 值是所有指定集合中该元素的score值之和。使用WEIGHTS选项来为每个给定的有序集合分别指定一个乘数,每个给定的有序集合中的所有元素的score值在传递给聚合函数之前都会乘以这个乘数(weight)。如果没有指定 WEIGHTS 选项,则乘数默认设置为 1。

使用AGGREGATE选项来指定计算并集结果的聚合方式。具体如下:

● SUM:默认的聚合方式,它可以将所有有序集合中某个元素的score值之和作为结果集中该元素的score值

● MIN:这种聚合方式可以将所有有序集合中某个元素的最小score值作为结果集中该元素的score值

● MAX:这种聚合方式可以将所有有序集合中某个元素的最大score值作为结果集中该元素的score值

返回值:

返回保存到destination结果集中的元素数量

例子:

127.0.0.1:6379[4]>ZADD citys-GDP6 3415 '北京' 2500 '上海' 3201 '苏州' 2893 '杭州' 

4

127.0.0.1:6379[4]>ZADD citys-GDP7 5438 '北京' 3700 '上海' 5422 '贵阳' 4391 '昆明'

4

127.0.0.1:6379[4]>ZUNIONSTORE citys-GDP8 2 citys-GDP6 citys-GDP7 WEIGHTS 4 1.5 AGGREGATE MIN

#citys-GDP6 * 4,citys-GDP7 * 1.5,并集结果取小分数值

6

127.0.0.1:6379[4]>ZRANGE citys-GDP8 0 -1 WITHSCORES

上海

5550   #3700 * 1.5

昆明

6586.5  #4391 * 1.5

贵阳

8133   #5422 * 1.5

北京

8157   #5438 * 1.5

杭州

11572  #2893 * 4

苏州

12804  #3201 * 4

5.5删除有序集合元素

(1)ZREM 命令:删除有序集合中的多个元素                                

命令格式:

ZREM key member [member ...]

作用:

删除有序集合key中的一个或多个元素,不存在的元素会被忽略。当key存在但它不是有序集合类型时,返回一个错误

返回值:

返回被删除元素的数量,不包括被忽略的元素

例子:

127.0.0.1:6379[4]>ZRANGE citys-GDP2 0 -1

杭州

苏州

上海

昆明

贵阳

北京

127.0.0.1:6379[4]>ZREM citys-GDP2 '贵阳'

1

127.0.0.1:6379[4]>ZREM citys-GDP2 '贵阳'

0

127.0.0.1:6379[4]>ZREM citys-GDP2 '北京' '上海' '贵阳' '昆明'

Invalidargument(s)

127.0.0.1:6379[4]>ZREM citys-GDP2 '北京' '上海' '昆明'

3

(2)ZREMRANGEBYLEX命令:删除有序集合在指定区间内的元素            

命令格式:

ZREMRRANGEBYLEX key min max

作用:

删除有序集合key中,介于min和max范围内的score值相同的所有元素。该命令的min 和max参数的意义与ZRANGEBYLEX命令的min和max参数的意义相同

返回值:

返回被删除元素的数量

例子:

127.0.0.1:6379[4]>ZADD citys-GDP9 12000 '北京' 12000 '苏州' 12000 '杭州' 12000  '深圳'

12000 '合肥' 12000 '昆明' 

6

127.0.0.1:6379[4]>ZREMRANGEBYLEX citys-GDP9 - [北京1

127.0.0.1:6379[4]>ZREMRANGEBYLEX citys-GDP9 (昆明+

3

127.0.0.1:6379[4]>ZRANGE citys-GDP9 0 -1 合肥昆明

127.0.0.1:6379[4]>ZREMRANGEBYLEX citys-GDP9 - +   #删除有序集合中的全部元素

2

127.0.0.1:6379[4]>ZRANGE citys-GDP9 0 -1

(3)ZREMRANGEBYRANK命令:删除有序集合在指定排名区间内的元素

命令格式:

ZREMRANGEBYRANK key start stop

作用:

删除有序集合key在指定排名(rank)区间内的所有元素。区间范围由下标参数start和 stop给出,包含start和stop在内。下标参数start和stop的用法与命令ZRANGE中下标参数start和stop的用法相同,在此不再说明

返回值:

返回被删除元素的数量

例子:

127.0.0.1:6379[4]>ZRANGE citys-GDP2 0 -1

杭州

苏州

上海

昆明

贵阳

北京

127.0.0.1:6379[4]>ZREMRANGEBYRANK citys-GDP2 0 3  #删除有序集合citys-GDP2的元素排名在0~3之间的元素

4

127.0.0.1:6379[4]>ZREMRANGEBYRANK citys-GDP2 3 20  #排名区间超过了有序集合排名,删除失败

0

127.0.0.1:6379[4]>ZRANGE citys-GDP2 0 -1

贵阳

北京

(4)ZREMRANGEBYSCORE 命令:删除有序集合在指定分数区间内的元素         

命令格式:

ZREMRANGEBYSCORE key min max

作用:

删除有序集合key中所有score值介于min和max之间(包含等于min或max)的元素

返回值:

返回被删除元素的数量

例子:

127.0.0.1:6379[4]>ZRANGE citys-GDP 0 -1 WITHSCORES

桂林

2451.5500000000002

昆明

7726.1899999999996

贵阳

8633

武汉

9854

南京

10246

深圳

11562

广州

13240

上海

15754

北京

15892

127.0.0.1:6379[4]>ZREMRANGEBYSCORE citys-GDP 3000 4000

0  #为0,表示在3000~4000区间内没有元素

127.0.0.1:6379[4]>ZREMRANGEBYSCORE citys-GDP 2000 4000

1

127.0.0.1:6379[4]>ZREMRANGEBYSCORE citys-GDP 8000 10000

2  #表示成功删除两个元素

127.0.0.1:6379[4]>ZRANGE citys-GDP 0 -1 WITHSCORES

昆明

7726.1899999999996

南京

10246

深圳

11562

广州

13240

上海

15754

北京

15892

你可能感兴趣的:(第二章 Redis数据类型)