Redis五大数据类型

五大数据类型介绍

redis 中的数据都是以 key/value 的形式存储的,五大数据类型主要是指 value 的数据类型,包含如下五种:

STRING

STRING 是 redis 中最基本的数据类型,redis 中的 STRING 类型是二进制安全的,即它可以包含任何数据,比如一个序列化的对象甚至一个 jpg 图片,要注意的是 redis 中的字符串大小上限是 512M 。

LIST

LIST 是一个简单的字符串列表,按照插入顺序进行排序,我们可以从 LIST 的头部 (LEFT) 或者尾部 (RIGHT) 插入一个元素,也可以从 LIST 的头部(LEFT)或者尾部 (RIGHT) 弹出一个元素。

HASH

HASH 类似于 Java 中的 Map ,是一个键值对集合,在 redis 中可以用来存储对象。

SET

SET 是 STRING 类型的无序集合,不同于 LIST ,SET 中的元素不可以重复。

ZSET

ZSET 和 SET 一样,也是 STRING 类型的元素的集合,不同的是 ZSET 中的每个元素都会关联一个 double 类型的分数,ZSET 中的成员都是唯一的,但是所关联的分数可以重复。

OK,通过上面的介绍,相信小伙伴们对五大数据类型都有一个大致的认识了,接下来我们就来看看这五种数据类型要怎么操作。

key 相关的命令

由于五大数据类型的数据结构本身有差异,因此对应的命令也会不同,但是有一些命令不管对于哪种数据类型都是存在的,我们今天就先来看看这样一些特殊的命令。

首先通过 redis-server redis.conf 命令启动 redi s,再通过 redis-cli 命令进入到控制台中,如下:

img

首先我们可以通过 set 命令插入一条记录:

127.0.0.1:6379> set k1 v1
OK

DEL 命令

看到 OK 表示插入成功。通过 DEL 命令我们可以删除一个已经存在的 key,如下:

127.0.0.1:6379> DEL k1
(integer) 1

看到 (integer) 1 表示数据已经删除成功。

DUMP 命令

DUMP 命令可以序列化给定的 key,并返回序列化之后的值:

127.0.0.1:6379> DUMP k1
"\x00\x02v1\b\x00\xe6\xc8\\\xe1bI\xf3c"

EXISTS 命令

EXISTS 命令用来检测一个给定的 key 是否存在,如下:

127.0.0.1:6379> EXISTS k1
(integer) 1
127.0.0.1:6379> EXISTS k2
(integer) 0
127.0.0.1:6379>

上面的运行结果表示 k1 存在而 k2 不存在。

TTL 命令

TTL 命令可以查看一个给定 key 的有效时间:

127.0.0.1:6379> TTL k1
(integer) -1
127.0.0.1:6379> TTL k2
(integer) -2

-2 表示 key 不存在或者已过期;-1 表示 key 存在并且没有设置过期时间(永久有效)。当然,我们可以通过下面的命令给 key 设置一个过期时间:

EXPIRE 命令

EXPIRE 命令可以给 key 设置有效期,在有效期过后,key 会被销毁。

127.0.0.1:6379> EXPIRE k1 30
(integer) 1
127.0.0.1:6379> TTL k1
(integer) 25
127.0.0.1:6379>

30 表示 30 秒,TTL k1 返回 25 表示这个 key 的有效期还剩 25 秒。

PERSIST 命令

PERSIST 命令表示移除一个 key 的过期时间,这样该 key 就永远不会过期:

127.0.0.1:6379> EXPIRE k1 60
(integer) 1
127.0.0.1:6379> ttl k1
(integer) 57
127.0.0.1:6379> PERSIST k1
(integer) 1
127.0.0.1:6379> ttl k1
(integer) -1

PEXPIRE 命令

PEXPIRE 命令的功能和 EXPIRE 命令的功能基本一致,只不过这里设置的参数是毫秒:

127.0.0.1:6379> PEXPIRE k1 60000
(integer) 1

PTTL 命令

PTTL 命令和 TTL 命令基本一致,只不过 PTTL 返回的是毫秒数:

127.0.0.1:6379> PTTL k1
(integer) 25421

KEYS 命令

KEYS 命令可以获取满足给定模式的所有 key,比如:

127.0.0.1:6379> KEYS *
1) "k3"
2) "k2"
3) "k1"

KEYS * 表示获取所有的 KEY, * 也可以是一个正则表达式。

STRING

APPEND

使用 APPEND 命令时,如果 key 已经存在,则会直接在 value 后追加值,如果 key 不存在,则会先创建一个 value 为空字符串的 key ,然后再追加:

127.0.0.1:6379> APPEND k1 hello
(integer) 5
127.0.0.1:6379> GET k1
"hello"
127.0.0.1:6379> APPEND k1 world
(integer) 10
127.0.0.1:6379> GET k1
"helloworld"

DECR

DECR 命令可以实现对 value 的减 1 操作,如果 key 不存在,则 key 对应的初始值会被置为 0 ,如果 key 的 value 不为数字,则会报错,如下:

127.0.0.1:6379> SET k3 19
OK
127.0.0.1:6379> DECR k3
(integer) 18
127.0.0.1:6379> GET k3
"18"
127.0.0.1:6379> SET k4 aa
OK
127.0.0.1:6379> DECR k4
(error) ERR value is not an integer or out of range

DECRBY

DECRBY 和 DECR 类似,不同的是 DECRBY 可以指定步长,如下:

127.0.0.1:6379> GET k3
"8"
127.0.0.1:6379> DECRBY k3 4
(integer) 4
127.0.0.1:6379> GET k3
"4"

GET

GET 命令用来获取对应 key 的 value,如果 key 不存在则返回 nil ,如下:

127.0.0.1:6379> GET k5
(nil)

GETRANGE

GETRANGE 用来返回 key 所对应的 value 的子串,子串由 start 和 end 决定,从左往右计算,如果下标是负数,则从右往左计算,其中 -1 表示最后一个字符, -2 是倒数第二个…,如下:

127.0.0.1:6379> SET k1 helloworld
OK
127.0.0.1:6379> GETRANGE k1 0 2
"hel"
127.0.0.1:6379> GETRANGE k1 -3 -1
"rld"

GETSET

GETSET 命令可以用来获取 key 所对应的 value ,并对 key 进行重置,如下:

127.0.0.1:6379> SET k1 v1
OK
127.0.0.1:6379> GET k1
"v1"
127.0.0.1:6379> GETSET k1 vv
"v1"
127.0.0.1:6379> GET k1
"vv"

INCR

INCR 操作可以对指定 key 的 value 执行加 1 操作,如果指定的 key 不存在,那么在加 1 操作之前,会先将 key 的 value 设置为 0 ,如果 key 的 value 不是数字,则会报错。如下:

127.0.0.1:6379> INCR k2
(integer) 1

INCRBY

INCRBY 和 INCR 功能类似,不同的是可以指定增长的步长,如下:

127.0.0.1:6379> INCRBY k2 99
(integer) 100

INCRBYFLOAT

INCRBYFLOAT 命令可以用来增长浮点数,如下:

127.0.0.1:6379> SET k1 0.5
OK
127.0.0.1:6379> INCRBYFLOAT k1 0.33
"0.83"

MGET与MSET

MGET 与 MSET 分别用来批量设置值和批量获取值,如下:

127.0.0.1:6379> MSET k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> MGET k1 k2 k3
1) "v1"
2) "v2"
3) "v3"

SETEX

SETEX 用来给 key 设置 value ,同时设置过期时间,等效于先给 key 设置 value ,再给 key 设置过期时间,如下:

127.0.0.1:6379> SETEX k1 30 v1
OK
127.0.0.1:6379> TTL k1
(integer) 26
127.0.0.1:6379> GET k1
"v1"

PSETEX

PSETEX 的作用和 SETEX 类似,不同的是,这里设置过期时间的单位是毫秒,如下:

127.0.0.1:6379> PSETEX k1 60000 v1
OK
127.0.0.1:6379> PTTL k1
(integer) 55412

SETNX

SETNX 是 SET if Not eXists 的简写,SET 命令在执行时,如果 key 已经存在,则新值会覆盖掉旧值,而对于 SETNX 命令,如果 key 已经存在,则不做任何操作,如果 key 不存在,则效果等同于 SET 命令。如下:

127.0.0.1:6379> SETNX k1 v1
(integer) 1
127.0.0.1:6379> SETNX k1 vv
(integer) 0
127.0.0.1:6379> GET k1
"v1"

MSETNX

MSETNX 兼具了 SETNX 和 MSET 的特性,但是 MSETNX 在执行时,如果有一个 key 存在,则所有的都不会执行,如下:

127.0.0.1:6379> MSETNX k1 v1 k2 v2
(integer) 0

因为 k1 已经存在,所以 k2 也没执行成功。

SETRANGE

SETRANGE 用来覆盖一个已经存在的 key 的 value ,如下:

127.0.0.1:6379> set k1 helloworld
OK
127.0.0.1:6379> get k1
"helloworld"
127.0.0.1:6379> SETRANGE k1 5 redis
(integer) 10
127.0.0.1:6379> get k1
"helloredis"

但是如果已经存在的 key 的 value 长度小于 offset ,则不足的地方用 0 补齐,如下:

127.0.0.1:6379> set k1 helloredis
OK
127.0.0.1:6379> SETRANGE k1 20 --java
(integer) 26
127.0.0.1:6379> GET k1
"helloredis\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00--java"

STRLEN

STRLEN 用来计算 key 的 value 的长度,如下:

127.0.0.1:6379> STRLEN k1
(integer) 26

准备知识

在学习这几个命令之前,我们得先了解下 redis 中字符串的存储方式,redis 中的字符串都是以二进制的方式进行存储的,比如说我执行如下命令:

127.0.0.1:6379> SET k1 a
OK

a 对应的 ASCII 码是 97 ,转换为二进制数据是 01100001 ,我们 BIT 相关命令都是对这个二进制数据进行操作。请继续往下看。

GETBIT

GETBIT 命令可以返回 key 对应的 value 在 offset 处的 bit 值,以上文提到的 k1 为例, a 对应的二进制数据是 01100001 ,所以当 offset 为 0 时,对应的 bit 值为 0 ; offset 为 1 时,对应的 bit 值为 1 ; offset 为 2 时,对应的 bit 值为 1 ;offset 为 3 时,对应的 bit 值为 0,依此类推….,如下:

127.0.0.1:6379> GETBIT k1 0
(integer) 0
127.0.0.1:6379> GETBIT k1 1
(integer) 1
127.0.0.1:6379> GETBIT k1 2
(integer) 1
127.0.0.1:6379> GETBIT k1 3
(integer) 0
127.0.0.1:6379> GETBIT k1 4
(integer) 0
127.0.0.1:6379> GETBIT k1 5
(integer) 0
127.0.0.1:6379> GETBIT k1 6
(integer) 0
127.0.0.1:6379> GETBIT k1 7
(integer) 1

SETBIT

SETBIT 可以用来修改二进制数据,比如 a 对应的 ASCII 码为 97,c 对应的 ASCII 码为 99,97 转为二进制是 01100001 ,99 转为二进制是 01100011 ,两个的差异在于第六位一个是 0 一个是 1 ,通过 SETBIT 命令,我们可以将 k1 的第六位的 0 改为 1 (第六位是从 0 开始算),如下:

127.0.0.1:6379> SETBIT k1 6 1
(integer) 0
127.0.0.1:6379> GET k1
"c"

此时,k1 中存储的字符也就变为了 c。SETBIT 在执行时所返回的数字,表示该位上原本的 bit 值。

BITCOUNT

BITCOUNT 可以用来统计这个二进制数据中 1 的个数,如下:

127.0.0.1:6379> BITCOUNT k1
(integer) 4

关于 BITCOUNT,redis 官网上有一个非常有意思的案例:用户上线次数统计。节选部分原文如下:

举个例子,如果今天是网站上线的第 100 天,而用户 peter 在今天阅览过网站,那么执行命令 SETBIT peter 100 1 ;如果明天 peter 也继续阅览网站,那么执行命令 SETBIT peter 101 1 ,以此类推。当要计算 peter 总共以来的上线次数时,就使用 BITCOUNT 命令:执行 BITCOUNT peter ,得出的结果就是 peter 上线的总天数。

这种统计方式最大的好处就是节省空间并且运算速度快。每天占用一个 bit,一年也就 365 个 bit,10 年也就 10*365 个 bit ,也就是 456 个字节,对于这么大的数据,bit 的操作速度非常快。

BITOP

BITOP 可以对一个或者多个二进制位串执行并 (AND)、或 (OR)、异或 (XOR) 以及非 (NOT) 运算,如下:a 对应的 ASCII 码转为二进制是 01100001 ,c 对应的二进制位串是 01100011 。对这两个二进制位串分别执行 AND\OR\XOR 的结果如下:

127.0.0.1:6379> set k1 a
OK
127.0.0.1:6379> set k2 c
OK
127.0.0.1:6379> BITOP and k3 k1 k2
(integer) 1
127.0.0.1:6379> get k3
"a"
127.0.0.1:6379> BITOP or k3 k1 k2
(integer) 1
127.0.0.1:6379> get k3
"c"
127.0.0.1:6379> BITOP xor k3 k1 k2
(integer) 1
127.0.0.1:6379> get k3
"\x02"

另外,BITOP 也可以执行 NOT 运算,但是注意参数个数,如下:

127.0.0.1:6379> BITOP not k3 k4
(integer) 1

这里会对 k4 的二进制位串取反,将取反结果交给 k3 。

BITPOS

BITPOS 用来获取二进制位串中第一个 1 或者 0 的位置,如下:

127.0.0.1:6379> set k1 a
OK
127.0.0.1:6379> BITPOS k1 1
(integer) 1
127.0.0.1:6379> BITPOS k1 0
(integer) 0

也可以在后面设置一个范围,不过后面的范围是字节的范围,而不是二进制位串的范围。

列表

列表是 Redis 中另外一种数据类型。下面我们来看看列表中一些基本的操作命令。

LPUSH

将一个或多个值 value 插入到列表 key 的表头,如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表头,如下:

127.0.0.1:6379> LPUSH k1 v1 v2 v3
(integer) 3

LRANGE

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

127.0.0.1:6379> LRANGE k1 0 -1
1) "v3"
2) "v2"
3) "v1"

RPUSH

RPUSH 与 LPUSH 的功能基本一致,不同的是 RPUSH 的中的 value 值是按照从右到左的顺序依次插入,如下:

127.0.0.1:6379> RPUSH k2 1 2 3 4 5
(integer) 5
127.0.0.1:6379> LRANGE k2 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"

RPOP

RPOP 命令可以移除并返回列表 key 的尾元素。如下:

127.0.0.1:6379> RPOP k2
"5"
127.0.0.1:6379> LRANGE k2 0 -1
1) "1"
2) "2"
3) "3"
4) "4"

LPOP

LPOP 和 RPOP 类似,不同的是 LPOP 移除并返回列表 key 的头元素,如下:

127.0.0.1:6379> LPOP k2
"1"
127.0.0.1:6379> LRANGE k2 0 -1
1) "2"
2) "3"
3) "4"

LINDEX

LINDEX 命令可以返回列表 key 中,下标为 index 的元素,正数下标 0 表示第一个元素,也可以使用负数下标,-1 表示倒数第一个元素,如下:

127.0.0.1:6379> LINDEX k2 0
"2"
127.0.0.1:6379> LINDEX k2 -1
"4"

LTRIM

LTRIM 命令可以对一个列表进行修剪,即让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。下标与之前介绍的写法都一致,这里不赘述。如下:

127.0.0.1:6379> LRANGE k1 0 -1
1) "v3"
2) "v2"
3) "v1"
127.0.0.1:6379> LTRIM k1 0 1
OK
127.0.0.1:6379> LRANGE k1 0 -1
1) "v3"
2) "v2"

BLPOP

BLPOP 是阻塞式列表的弹出原语。它是命令 LPOP 的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BLPOP 命令阻塞。当给定多个 key 参数时,按参数 key 的先后顺序依次检查各个列表,弹出第一个非空列表的头元素。同时,在使用该命令时也需要指定阻塞的时长,时长单位为秒,在该时长内如果没有元素可供弹出,则阻塞结束。返回的结果是 key 和 value 的组合,如下:

127.0.0.1:6379> BLPOP k1 10
1) "k1"
2) "v2"
127.0.0.1:6379> BLPOP k1 10
(nil)
(10.03s)

最后,BRPOP、BPOPLPUSH、BRPOPLPUSH 都是相应命令的阻塞版本,这里就不赘述了。

集合

接下来我们来看看集合中一些常见的操作命令:

SADD

SADD 命令可以添加一个或多个指定的 member 元素到集合的 key 中,指定的一个或者多个元素 member 如果已经在集合 key 中存在则忽略,如果集合 key 不存在,则新建集合 key ,并添加 member 元素到集合 key 中。如下:

127.0.0.1:6379> SADD k1 v1 v2 v3 v4
(integer) 4

SREM

SREM 命令可以在 key 集合中移除指定的元素,如果指定的元素不是 key 集合中的元素则忽略。如果 key 集合不存在则被视为一个空的集合,该命令返回 0 。如下:

127.0.0.1:6379> SREM k1 v2
(integer) 1
127.0.0.1:6379> SREM k1 v10
(integer) 0

SISMEMBER

SISMEMBER 命令可以返回成员 member 是否是存储的集合 key 的成员。如下:

127.0.0.1:6379> SISMEMBER k1 v3
(integer) 1

SCARD

SCARD 命令可以返回集合存储的 key 的基数(集合元素的数量),如下:

127.0.0.1:6379> SCARD k1
(integer) 3

SMEMBERS

SMEMBERS 命令可以返回 key 集合所有的元素,如下:

127.0.0.1:6379> SMEMBERS k1
1) "v4"
2) "v1"
3) "v3"

SRANDMEMBER

SRANDMEMBER 仅需我们提供 key 参数,它就会随机返回 key 集合中的一个元素,从 Redis2.6 开始,该命令也可以接受一个可选的 count 参数,如果 count 是整数且小于元素的个数,则返回 count 个随机元素,如果 count 是整数且大于集合中元素的个数时,则返回集合中的所有元素,当 count 是负数,则会返回一个包含 count 的绝对值的个数元素的数组,如果 count 的绝对值大于元素的个数,则返回的结果集里会出现一个元素出现多次的情况。如下:

127.0.0.1:6379> SRANDMEMBER k1
"v4"
127.0.0.1:6379> SRANDMEMBER k1 2
1) "v4"
2) "v1"
127.0.0.1:6379> SRANDMEMBER k1 5
1) "v4"
2) "v1"
3) "v3"
127.0.0.1:6379> SRANDMEMBER k1 -1
1) "v4"
127.0.0.1:6379> SRANDMEMBER k1 -5
1) "v3"
2) "v1"
3) "v1"
4) "v3"
5) "v3"

SPOP

SPOP 命令的用法和 SRANDMEMBER 类似,不同的是,SPOP 每次选择一个随机的元素之后,该元素会出栈,而 SRANDMEMBER 则不会出栈,只是将该元素展示出来。

SMOVE

SMOVE 命令可以将 member 从 source 集合移动到 destination 集合中,如下:

127.0.0.1:6379> SMOVE k1 k2 v1
(integer) 1
127.0.0.1:6379> SMEMBERS k1
1) "v4"
2) "v3"
127.0.0.1:6379> SMEMBERS k2
1) "v1"

SDIFF

SDIFF 可以用来返回一个集合与给定集合的差集的元素,如下:

127.0.0.1:6379> SDIFF k1 k2
1) "v4"
2) "v3"

k1 中的元素是 v3、v4,k2 中的元素是 v1,差集就是 v3、v4.

SDIFFSTORE

SDIFFSTORE 命令与 SDIFF 命令基本一致,不同的是 SDIFFSTORE 命令会将结果保存在一个集合中,如下:

127.0.0.1:6379> SDIFFSTORE key k1 k2
(integer) 2
127.0.0.1:6379> SMEMBERS key
1) "v4"
2) "v3"

SINTER

SINTER 命令可以用来计算指定 key 之间元素的交集,如下:

127.0.0.1:6379> SMEMBERS k1
1) "v4"
2) "v3"
127.0.0.1:6379> SMEMBERS k2
1) "v1"
2) "v3"
127.0.0.1:6379> SINTER k1 k2
1) "v3"

SINTERSTORE

SINTERSTORE 命令和 SINTER 命令类似,不同的是它会将结果保存到一个新的集合中,如下:

127.0.0.1:6379> SINTERSTORE k3 k1 k2
(integer) 1
127.0.0.1:6379> SMEMBERS k3
1) "v3"

SUNION

SUNION 可以用来计算两个集合的并集,如下:

127.0.0.1:6379> SUNION k1 k2
1) "v4"
2) "v1"
3) "v3"

SUNIONSTORE

SUNIONSTORE 和 SUNION 命令类似,不同的是它会将结果保存到一个新的集合中,如下:

127.0.0.1:6379> SUNIONSTORE k4 k1 k2
(integer) 3
127.0.0.1:6379> SMEMBERS k4
1) "v4"
2) "v1"
3) "v3"

散列

很多时候,散列就像一个微缩版的 redis ,在本文中,小伙伴们对看到的许多散列命令都会有似曾相识的感觉。

HSET

HSET 命令可以用来设置 key 指定的哈希集中指定字段的值,如下:

127.0.0.1:6379> HSET k1 h1 v1(integer) 1

HGET

HGET 命令可以用来返回 key 指定的哈希集中该字段所关联的值,如下:

127.0.0.1:6379> HGET k1 h1
"v1"

HMSET

HMSET 命令可以批量设置 key 指定的哈希集中指定字段的值,如下:

127.0.0.1:6379> HMSET k2 h1 v1 h2 v2 h3 v3
OK

HMGET

HMGET 可以批量返回 key 指定的哈希集中指定字段的值,如下:

127.0.0.1:6379> HMGET k2 h1 h2 h3
1) "v1"
2) "v2"
3) "v3"

HDEL

HDEL 命令可以从 key 指定的哈希集中移除指定的域,在哈希集中不存在的域将被忽略,如下:

127.0.0.1:6379> HMGET k2 h1 h2 h3
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> HDEL k2 h1
(integer) 1
127.0.0.1:6379> HMGET k2 h1 h2 h3
1) (nil)
2) "v2"
3) "v3"

HSETNX

HSETNX 命令只在 key 指定的哈希集中不存在指定的字段时,设置字段的值,如果字段已存在,该操作无效果。如下:

127.0.0.1:6379> HSETNX k2 h3 1
(integer) 0
127.0.0.1:6379> HSETNX k2 h4 1
(integer) 1

HVALS

HVALS 命令可以返回 key 指定的哈希集中所有字段的值,如下:

127.0.0.1:6379> HVALS k2
1) "v2"
2) "v3"
3) "1"

HKEYS

HKEYS 命令可以返回 key 指定的哈希集中所有字段的名字,如下:

127.0.0.1:6379> HKEYS k2
1) "h2"
2) "h3"
3) "h4"

HGETALL

HGETALL 命令可以返回 key 指定的哈希集中所有的字段和值。返回值中,每个字段名的下一个是它的值,所以返回值的长度是哈希集大小的两倍,如下:

127.0.0.1:6379> HGETALL k2
1) "h2"
2) "v2"
3) "h3"
4) "v3"
5) "h4"
6) "1"

HEXISTS

HEXISTS 命令可以返回 hash 里面 field 是否存在,如下:

127.0.0.1:6379> HEXISTS k2 h3
(integer) 1

HINCRBY

HINCRBY 可以增加 key 指定的哈希集中指定字段的数值。如果 key 不存在,会创建一个新的哈希集并与 key 关联。如果字段不存在,则字段的值在该操作执行前被设置为 0, HINCRBY 支持的值的范围限定在 64 位有符号整数,如下:

127.0.0.1:6379> HEXISTS k2 h3
(integer) 1
127.0.0.1:6379>
127.0.0.1:6379> HGET k2 h4
"1"
127.0.0.1:6379> HINCRBY k2 h4 5
(integer) 6
127.0.0.1:6379> HGET k2 h4
"6"
127.0.0.1:6379> HGET k2 h5
(nil)
127.0.0.1:6379> HINCRBY k2 h5 99
(integer) 99
127.0.0.1:6379> HGET k2 h5
"99"

HINCRBYFLOAT

HINCRBYFLOAT 与 HINCRBY 用法基本一致,只不过这里允许 float 类型的数据,不赘述。

HLEN

HLEN 返回 key 指定的哈希集包含的字段的数量,如下:

127.0.0.1:6379> HLEN k2
(integer) 4sh

HSTRLEN

HSTRLEN 可以返回 hash 指定 field 的 value 的字符串长度,如果 hash 或者 field 不存在,返回 0 ,如下:

127.0.0.1:6379> HSTRLEN k2 h2
(integer) 2

有序集合

有序集合类似 Sets ,但是每个字符串元素都关联到一个叫 score 浮动数值。里面的元素总是通过 score 进行着排序,因此它是可以检索的一系列元素。

ZADD

ZADD 命令可以将所有指定成员添加到键为 key 的有序集合里面。添加时可以指定多个分数/成员(score/member)对。 如果指定添加的成员已经是有序集合里面的成员,则会更新该成员的分数(scrore)并更新到正确的排序位置。如下:

127.0.0.1:6379> ZADD k1 60 v1
(integer) 1

ZSCORE

ZSCORE 命令可以返回有序集 key 中,成员 member 的score 值。如下:

127.0.0.1:6379> ZSCORE k1 v1
"60"

ZRANGE

ZRANGE 命令可以根据 index 返回 member ,该命令在执行时加上 withscores 参数可以连同 score 一起返回:

127.0.0.1:6379> ZRANGE k1 0 3
1) "v1"
2) "v2"
3) "v3"
4) "v4"
127.0.0.1:6379> ZRANGE k1 0 3 withscores
1) "v1"
2) "60"
3) "v2"
4) "70"
5) "v3"
6) "80"
7) "v4"
8) "90"

ZREVRANGE

ZREVRANGE 和 ZRANGE 功能基本一致,不同的是 ZREVRANGE 是反着来的,如下:

127.0.0.1:6379> ZREVRANGE k1 0 3
1) "v5"
2) "v4"
3) "v3"
4) "v2"
127.0.0.1:6379> ZREVRANGE k1 0 3 withscores
1) "v5"
2) "100"
3) "v4"
4) "90"
5) "v3"
6) "80"
7) "v2"
8) "70"

ZCARD

ZCARD 命令可以返回 key 的有序集元素个数。如下:

127.0.0.1:6379> ZCARD k1
(integer) 5

ZCOUNT

ZCOUNT 命令可以返回有序集 key 中,score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员。如下:

127.0.0.1:6379> ZCOUNT k1 60 90
(integer) 4

如果在统计时,不需要包含 60 或者 90 ,则添加一个 ( 即可,如下:

127.0.0.1:6379> ZCOUNT k1 60 (90
(integer) 3

ZRANGEBYSCORE

ZRANGEBYSCORE 命令可以按照 score 范围范围元素,加上 withscores 可以连 score 一起返回。如下:

127.0.0.1:6379> ZRANGEBYSCORE k1 60 80
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> ZRANGEBYSCORE k1 60 80 withscores
1) "v1"
2) "60"
3) "v2"
4) "70"
5) "v3"
6) "80"
127.0.0.1:6379> ZRANGEBYSCORE k1 (60 80 withscores
1) "v2"
2) "70"
3) "v3"
4) "80"

ZRANK

ZRANK 命令可以返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。排名以 0 为底,即 score 值最小的成员排名为 0 。如下:

127.0.0.1:6379> ZRANK k1 v1
(integer) 0
127.0.0.1:6379> ZRANK k1 v2
(integer) 1

ZREVRANK

ZREVRANK 和 ZRANK 命令功能基本一致,不同的是,ZREVRANK 中的排序是从大到小:

127.0.0.1:6379> ZREVRANK k1 v1
(integer) 4
127.0.0.1:6379> ZREVRANK k1 v2
(integer) 3

ZINCRBY

ZINCRBY 命令可以为有序集 key 的成员 member 的 score 值加上增量 increment 。如果 key 中不存在 member ,就在 key 中添加一个 member ,score 是 increment(就好像它之前的 score 是0.0)。如果 key 不存在,就创建一个只含有指定 member 成员的有序集合:

127.0.0.1:6379> ZINCRBY k1 3 v1
"63"
127.0.0.1:6379> ZRANGE k1 0 0 withscores
1) "v1"
2) "63"

ZINTERSTORE

ZINTERSTORE 命令可以计算给定的 numkeys 个有序集合的交集,并且把结果放到 destination 中。 在给定要计算的 key 和其它参数之前,必须先给定 key 个数( numberkeys )。该命令也可以在执行的过程中给原 score 乘以 weights 后再求和,如下:

127.0.0.1:6379> ZADD k2 2 v1
(integer) 1
127.0.0.1:6379> ZADD k2 3 v2
(integer) 1
127.0.0.1:6379> ZADD k2 4 v3
(integer) 1
127.0.0.1:6379> ZADD k3 9 v2
(integer) 1
127.0.0.1:6379> ZADD k3 10 v3
(integer) 1
127.0.0.1:6379> ZADD k3 11 v4
(integer) 1
127.0.0.1:6379> ZINTERSTORE k4 2 k2 k3
(integer) 2
127.0.0.1:6379> ZRANGE k4 0 -1 withscores
1) "v2"
2) "12"
3) "v3"
4) "14"
127.0.0.1:6379> ZINTERSTORE k5 2 k2 k3 weights 3 1
(integer) 2
127.0.0.1:6379> ZRANGE k5 0 -1 withscores
1) "v2"
2) "18"
3) "v3"
4) "22"

ZREM

ZREM 命令可以从集合中弹出一个元素,如下:

127.0.0.1:6379> ZRANGE k2 0 -1 withscores
1) "v1"
2) "2"
3) "v2"
4) "3"
5) "v3"
6) "4"
127.0.0.1:6379> ZREM k2 v1
(integer) 1
127.0.0.1:6379> ZRANGE k2 0 -1 withscores
1) "v2"
2) "3"
3) "v3"
4) "4"

ZLEXCOUNT

ZLEXCOUNT 命令用于计算有序集合中指定成员之间的成员数量。如下:

127.0.0.1:6379> ZLEXCOUNT k2 - +
(integer) 2
127.0.0.1:6379> ZLEXCOUNT k2 [v2 [v4
(integer) 2

**注意:**可以用 -+ 表示得分最小值和最大值,如果使用成员名的话,一定要在成员名之前加上 [ 。

ZRANGEBYLEX

ZRANGEBYLEX 返回指定成员区间内的成员,按成员字典正序排序, 分数必须相同。如下:

127.0.0.1:6379> ZRANGEBYLEX k2 [v2 [v4
1) "v2"
2) "v3"
127.0.0.1:6379> ZRANGEBYLEX k2 - +
1) "v2"
2) "v3"
127.0.0.1:6379>

注意 min 和 max 参数的写法和 ZLEXCOUNT 一致。


版权声明:本文为m0_54797663原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。