Redis使用指南(三)

59 阅读8分钟

前览:本次主要演示REDIS五大常见数据结构中的String、List、Hash数据类型

我们学习的过程就是不断具体、清晰问题边界的过程。就像有人按你家的门铃,家里人让你去看看门口是谁,你去看了之后回头告诉家里人,门外是“碳基生物”。理论上来说这种回答也是正确的,但是这个回答太空泛,门外站着一只大鹅,也可以说是“碳基生物”。我们关心的回答可能是,“门外是顺丰快递员,有个从XX发的快递到了。”当然,我们不一定关心更具体的情况,比如快递员身高、体重、年龄等问题。

Redis中的数据,整体是按照一个KEY键值对应一个VALUE,相当于JAVA中的HashMap。对于Redis的数据类型,我们大可以按照一个大KEY对应一个大VALUE的形式来回答。如果我们只是简单了解下什么是Redis,那么这个认识程度也就足够了,但是我们平常经常会与Redis打交道,我们需要更清晰的知道VALUE到底有哪些基本类型,分别适用于什么场景。

20%的核心知识点可以覆盖80%以上的场景,我们常用的Redis基本数据结构有简单字符串String、列表List、哈希Hash、集合Set、有序集合Zset。除此之外,Redis还有bitmap位图、Stream等数据结构,数据结构无非是让我们更方便地进行CRUD,对于应用场景不多的数据结构,如果碰到对应的应用常见,我们结合官网API手册与AI,可以非常快速地掌握如何使用。下面我们重点说明String、List和Hash类型。

image.png

String类型

非常适合高频读取低频更新的场景,比如支付场景中对手方发送的报文,论坛系统中文章的点赞数等。

1、SET/GET 设置/获取单一数据

image.png

如图所示,SET用于设置指定KEY的值,如果KEY的值已经存在,则直接进行覆盖。 GET用于获取指定KEY的值,如果KEY不存在,则返回NULL。

2、MSET/MGET 一次更新/获取多条数据

如同一台电梯载重1吨,我们借助电梯从1楼运砖头到5楼,我们可以每次上下往返运一个砖头,也可以每次往返运一批砖头。在批处理等场景中,通过MSET/MGET命令,我们可以一次网络交互处理多条数据,提高了处理效率。

命令格式:

MSET KEY1 VALUE1  [KEY2 VALUE2 ...]

MGET KEY1 [KEY2...]

image.png 如图所示,MSET/MGET相当于一次执行了多条SET/GET,同样遵循复写和返回NULL的规则。

3、SETNX 如果KEY不存在,则设置KEY和指定的VALUE,如果KEY已经存在,则设置失败

image.png 如图所示,当orderid:1不存在时,setnx可以成功进行设置,如果orderid:1已经存在了,则无法进行设置。这个命令在后续分布式锁中经常使用。

4、INCR 数据自增

数据可以表示64位有符号数,如果不是数字型则会直接报错。

image.png 如图所示,我们对art:like进行了自增的操作,对非数字型的a进行自增时,redis会直接报错,如果超过了数字的表示范围,比如mykey进行自增时,redis也会直接报数据集将会溢出的错误。

List类型

List在Redis中类似一个双端队列,我们可以在队列的左边或者右边添加/删除元素。 主要掌握以下基本命令:

image.png

1、LPUSH/RPUSH

在队列的左边或者右边添加一个元素

用法:LPUSH/RPUSH  KEY  VALUE1   VALUE2

如果KEY不存在则会新建一个KEY,如果KEY存在则在原有LIST的基础上进行操作

image.png

image.png

image.png

image.png

如图所示,LPUSH在名为list1的列表左边添加了元素a,RPUSH在名为list1的列表右边添加了元素b、c。

2、LPOP/RPOP

从队列的左边或者右边取出元素,如果不存在元素则返回Null

用法: LPOP/RPOP  KEY

image.png 执行lpop后:

image.png 执行rpop后:

image.png

3、LLEN

返回指定KEY的队列长度

用法: LLEN  KEY

image.png 当前list1中只有b一个元素,所以返回1。

4、LRANGE

返回列表中指定范围的元素

用法: LRANGE  KEY  开始位置  结束位置

image.png

先在list1列表的右端添加c、a元素,列表中的元素按照从左到右编号为0,1,...len-1,此时列表的元素如下:

image.png

image.png

image.png 此时执行lrange list1 0 -1表示找到list1列表中开头到结尾的所有元素,超出范围的元素不会被处理。

5、LTRIM

限制队列的长度 用法:LTRIM  KEY  开始位置  结束位置

考虑一个场景:在大促秒杀场景中,我们可以通过利用队列有序的特点,在redis中设置一个List用于保存购买的用户ID,为了防止队列无限增长超过了内存容量的极限,可以通过LTRIM命令来限制队列的长度。注意:LTRIM并不是设置后队列就无法增长了,而是将超过容量的数据进行删除,因此使用LTRIM是一种简化的处理方式,需要评估下数据量的增长模式。

image.png

6、LINDEX

获取队列中某个索引位置的元素

用法 LINDEX  KEY  元素位置

image.png 如图所示,获取list1列表中位置为1的元素,返回元素c,如果查找不存在的元素,则返回NULL

7、LREM

删除列表中指定数量的匹配元素

命令用法:

LREM key count value

key:列表的键名。

count:删除策略的标识符,决定删除的方向和数量。

count > 0:从列表头部(左端)向尾部(右端)搜索,删除最多 count 个与 value 相等的元素。

count < 0:从列表尾部向头部搜索,删除最多 |count| 个与 value 相等的元素。

count = 0:删除列表中所有与 value 相等的元素。

image.png

如图所示,原有List中有五个元素,执行lrem从索引0开始扫描,最多删除2个匹配为z的元素。

8、BLPOP/BRPOP

如果队列中有元素则获取,如果没有则进行阻塞

命令用法:

BLPOP key [key ...] timeout

key:要操作的列表的键名,可以指定多个键。

timeout:阻塞等待的超时时间,单位为秒。如果设置为 0,表示无限阻塞,直到有元素可弹出。 返回值:

如果列表为空且超时,返回 null。

如果列表不为空,返回一个包含两个元素的列表,第一个元素是被弹出元素所属的键名,第二个元素是被弹出的值。

image.png 如图所示,通过BLPOP/BRPOP可以实现一个轻量级的消息订阅队列,在特定场景下可以替代重量级的消息队列中间件。

HASH类型

HASH数据类型也是Redis中一个非常重要的基础数据类型,类似于我们通过一个KEY键值去关联一个HASHMAP。

image.png 对于HASH类型,我们主要需要掌握以下的基本操作:

image.png

1. ​HSET​

语法:HSET key field value [field value ...]

功能:设置哈希表中一个或多个字段的值。若字段存在则覆盖旧值,若哈希表不存在则自动创建。

示例:

image.png

image.png

2. ​HGET​

语法:HGET key field

功能:获取哈希表中指定字段的值。若字段或键不存在返回null。

示例:

image.png

 

 

3. ​HGETALL​

语法:HGETALL key

功能:返回哈希表所有字段及对应的值,按字段-值的交替顺序返回列表。

示例:

image.png

如图所示,将myhash中的hash Key和hash value交替输出。

 

4. ​HEXISTS​

语法:HEXISTS key field

功能:检查哈希表中是否存在指定字段,存在返回1,否则返回0。

示例:

image.png

 

5. ​HDEL​

语法:HDEL key field [field ...]

功能:删除哈希表中一个或多个字段,返回成功删除的字段数量。

示例:

image.png

 

6. ​HKEYS​

语法:HKEYS key

功能:返回哈希表中所有字段名(不包含值)。

示例:

  image.png

7. ​HVALS​

语法:HVALS key

功能:返回哈希表中所有字段的值(不包含字段名)。

示例:

image.png

 

8. ​HLEN​

语法:HLEN key

功能:返回哈希表中字段的总数。若键不存在返回0。

示例:

image.png

 

 

9. ​HSETNX​

语法:HSETNX key field value

功能:仅当字段不存在时设置其值。成功返回1,失败返回0。

示例:

image.png

 

10. ​HSCAN​

语法:HSCAN key cursor [MATCH pattern] [COUNT count]

功能:增量遍历哈希表中的字段和值。cursor为游标(初始为0),MATCH匹配字段模式,COUNT限制每批返回数量。

示例:

image.png

如图所示,其中0表示从哪个位置开始扫描,match表示匹配什么类型的hash key,这里支持正则表达式,count表示每次返回的数量。 其中返回的第一行0表示已经遍历完了整个hash对象,如果这个hash对象是一个大对象,可以限制返回数量,分批进行扫描,避免一次扫描花费太多时间,造成线上问题。

总结: 本次主要讲解redis中的String、List、Hash三个基本的数据类型和操作,基本数据类型在实际开发中十分常用,各位可以对其中基本的操作有大体的了解,实际开发中结合手册和搜索工具可以快速进行开发工作。