Redis-6-针对散列和有序集合的常用命令

上文中,介绍了list和set的一些常用的命令,下面再来看一下散列和有序集合的一些常用的命令

散列(hash)

和java中的hashmap其实是差不多的,redis其实就是存放的键值对,散列也是存放的键值对,,下面来具体看下一下一些常用的操作

hset

hset用来设置key指定的哈希集中指定字段的值, 如果key指定的哈希集不存在,就会创建一个新的哈希集并与key关联,如果字段在哈希集中存在,它将被重写,具体使用如下:

1
2
172.16.12.3:6379> hset myhash field1 hello
(integer) 1

这里的返回值:

  • 1: 表示这个field是一个新的字段
  • 0: 表示这个field是原来已经存在的

hget

hget用来返回key指定的哈希集中某一个field的值,如下:

1
2
172.16.12.3:6379> hget myhash field1
"hello"

hmset

hmset,批量添加的命令,使用如下:

1
2
172.16.12.3:6379> hmset myhash field2 world field3 java field4 php
OK

hmget

是一个批量查询的命令,如下:

1
2
3
4
5
172.16.12.3:6379> hmget myhash field1 field2 field3 field4
1) "hello"
2) "world"
3) "java"
4) "php"

hdel

用来删除key指定的哈希集中指定的field,如果这个field不存在,则会被忽略,如下:

1
2
3
4
5
6
7
172.16.12.3:6379> hdel myhash field1
(integer) 1
172.16.12.3:6379> hmget myhash field1 field2 field3 field4
1) (nil)
2) "world"
3) "java"
4) "php"

hsetnx

hsetnx命令,只在key指定的哈希集中,不存在指定的字段时再设置字段的值,如果是已经存在的,则命令无效,如下:

1
2
3
4
172.16.12.3:6379> hsetnx myhash field4 c++
(integer) 0
172.16.12.3:6379> hsetnx myhash field5 c++
(integer) 1

hvals

用来返回key指定的哈希集中的所有字段的值,如下:

1
2
3
4
5
172.16.12.3:6379> hvals myhash
1) "world"
2) "java"
3) "php"
4) "c++"

hkeys

用来返回key指定的哈希集中的所有字段的名字,如下:

1
2
3
4
5
172.16.12.3:6379> hkeys myhash
1) "field2"
2) "field3"
3) "field4"
4) "field5"

hgetall

返回key指定的哈希集中的所有字段和值,在返回值中,每个字段名的下一个是他的值,返回值的长度是该哈希集大小的两倍,如下:

1
2
3
4
5
6
7
8
9
172.16.12.3:6379> hgetall myhash
1) "field2"
2) "world"
3) "field3"
4) "java"
5) "field4"
6) "php"
7) "field5"
8) "c++"

hexists

用来判断key对应的哈希集中,指定的field是否存在,如下:

1
2
3
4
172.16.12.3:6379> hexists myhash field1
(integer) 0
172.16.12.3:6379> hexists myhash field2
(integer) 1

hincrby

用来增加key指定的哈希集中指定字段的数值

如果指定的哈希集不存在,那就会创建一个新的hash并与key关联

如果字段不存在,则字段的值在该操作执行前被设置为0

hincrby命令支持的值的范围限定在64位有符号整数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
172.16.12.3:6379> hgetall myhash
1) "field2"
2) "world"
3) "field3"
4) "java"
5) "field4"
6) "php"
7) "field5"
8) "c++"


172.16.12.3:6379> hset myhash field6 1
(integer) 1
172.16.12.3:6379> hincrby myhash field6 9
(integer) 10
172.16.12.3:6379> hincrby myhash field7 6
(integer) 6
172.16.12.3:6379> hget myhash field6
"10"
172.16.12.3:6379> hget myhash field7
"6"

hincrbyfloat

和上面的hincrby用法一样,只不过是可以加float类型的数据

1
2
3
4
172.16.12.3:6379> hincrbyfloat myhash field7 1.55
"7.55"
172.16.12.3:6379> hget myhash field7
"7.55"

hlen

可以获取到key指定的哈希集包含的字段的数量,如下:

1
2
3
4
5
6
7
8
9
10
172.16.12.3:6379> hkeys myhash
1) "field2"
2) "field3"
3) "field4"
4) "field5"
5) "field6"
6) "field7"

172.16.12.3:6379> hlen myhash
(integer) 6

hstrlen

获取key指定的哈希集中的,指定的field对应的value的长度 ,如果field不存在的话,就返回0,如下:

1
2
3
4
5
6
172.16.12.3:6379> hstrlen myhash field2
(integer) 5
172.16.12.3:6379> hstrlen myhash field7
(integer) 4
172.16.12.3:6379> hstrlen myhash field8
(integer) 0

有序集合(zset)

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

zadd

往键为key的集合里面添加元素

添加时,可以指定多个分数/成员(score/member)对,如果指定添加的成员已经存在,则会更新分数,然后将成员更新到正确的位置,如下:

1
2
172.16.12.3:6379> zadd myzset 60 v1
(integer) 1

首先是key,然后分数,最后是值.

zscore

返回有序集合key中, 指定成员的score值,如下:

1
2
172.16.12.3:6379> zscore myzset v1
"60"

zrange

zrange 命令可以根据下标返回元素, 要指定开始和结束的下标, 还可以加一个withscores 参数,可以将元素的score

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
172.16.12.3:6379> zadd myzset 61 v2
(integer) 1
172.16.12.3:6379> zadd myzset 62 v3
(integer) 1
172.16.12.3:6379> zadd myzset 63 v4
(integer) 1

172.16.12.3:6379> zrange myzset 0 3
1) "v1"
2) "v2"
3) "v3"
4) "v4"

172.16.12.3:6379> zrange myzset 0 3 withscores
1) "v1"
2) "60"
3) "v2"
4) "61"
5) "v3"
6) "62"
7) "v4"
8) "63"

zrevrange

zrevrange和zrange的功能基本一样,只不过zrevrange返回数据的顺序是反着的,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
172.16.12.3:6379> zrevrange myzset 0 3 withscores
1) "v4"
2) "63"
3) "v3"
4) "62"
5) "v2"
6) "61"
7) "v1"
8) "60"
172.16.12.3:6379> zrevrange myzset 0 3
1) "v4"
2) "v3"
3) "v2"
4) "v1"

zcard

可以返回zset中元素的个数,如下:

1
2
172.16.12.3:6379> zcard myzset
(integer) 4

zcount

zcount可以返回有序集key中,score值在min和max之间(默认包括score值等于min或max)的成员的数量

1
2
172.16.12.3:6379> zcount myzset 60 63
(integer) 4

如果我们想统计的不需要包含 开始或者结束区间的值,可以加一个(,如下:

1
2
3
4
172.16.12.3:6379> zcount myzset 60 (63
(integer) 3
172.16.12.3:6379> zcount myzset (60 (63
(integer) 2

zrangebyscore

zrangebyscore,可以按照分数的范围,获取对应的元素,加上withscores可以连score一起返回,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
172.16.12.3:6379> zrangebyscore myzset 60 63
1) "v1"
2) "v2"
3) "v3"
4) "v4"
172.16.12.3:6379> zrangebyscore myzset 60 63 withscores
1) "v1"
2) "60"
3) "v2"
4) "61"
5) "v3"
6) "62"
7) "v4"
8) "63"
172.16.12.3:6379> zrangebyscore myzset (60 (63
1) "v2"
2) "v3"

zrank

zrank,可以返回有序集合中指定成员的排名, 在zset中,成员的排名是按照score分数从小到大去排序的,排名是从0开始的,如下:

1
2
3
4
172.16.12.3:6379> zrank myzset v1
(integer) 0
172.16.12.3:6379> zrank myzset v3
(integer) 2

zrevrank

zrevrank和zrank是差不多的,只不过zrevrank是按照score是从大到小去排序的,如下:

1
2
3
4
172.16.12.3:6379> zrevrank myzset v3
(integer) 1
172.16.12.3:6379> zrevrank myzset v1
(integer) 3

zincrby

语法是:

1
zincrby key increment member

为有序集合key的成员member的score值加上增量increment

如果key中不存在member,就在key中添加一个member,score是increment

如果key不存在,就创建一个只含有指定member成员的有序集合.

当key不是有序集类型时,返回一个错误

1
2
172.16.12.3:6379> zincrby myzset 10 v1
"70"

zinterstore

语法如下:

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

该命令是用来计算给定的numkeys个有序集合的交集,并且把结果放到destination中

在给定要计算的key和其它参数之前,必须先给定key个数(numberkeys)

默认情况下,结果集destination中一个元素的分数是有序集合中该元素分数之和,前提是该元素在这些有序集合中都存在,因为交集要求其成员必须是给定的每个有序集合中的成员

WEIGHTS,是在执行的过程中给原score乘以weights后再求和

如果destination存在,就把它覆盖

返回值是结果有序集合destination中元素个数

具体使用如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
172.16.12.3:6379> zadd zset1 1 one
(integer) 1
172.16.12.3:6379> zadd zset1 2 two
(integer) 1

172.16.12.3:6379> zadd zset2 1 one
(integer) 1
172.16.12.3:6379> zadd zset2 2 two
(integer) 1
172.16.12.3:6379> zadd zset2 3 three
(integer) 1

172.16.12.3:6379> zinterstore outzset 2 zset1 zset2 weights 2 3
(integer) 2
172.16.12.3:6379> zrange outzset 0 -1 withscores
1) "one"
2) "5"
3) "two"
4) "10"

zrem

zrem命令,可以从集合中移除一个元素,如下:

1
2
3
4
5
172.16.12.3:6379> zrem outzset one
(integer) 1
172.16.12.3:6379> zrange outzset 0 -1 withscores
1) "two"
2) "10"

zlexcount

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
172.16.12.3:6379> zrange myzset 0 -1 withscores
1) "v2"
2) "61"
3) "v3"
4) "62"
5) "v4"
6) "63"
7) "v1"
8) "70"

172.16.12.3:6379> zlexcount myzset - +
(integer) 4

172.16.12.3:6379> zlexcount myzset [v1 [v2
(integer) 1

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

zrangebylex

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

1
2
3
4
5
6
7
172.16.12.3:6379> zrangebylex myzset [v1 [v2
1) "v2"
172.16.12.3:6379> zrangebylex myzset - +
1) "v2"
2) "v3"
3) "v4"
4) "v1"

好了,就介绍这么多的命令,其他需要的话,请参考官方文档