前览:本次主要演示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类型。
String类型
非常适合高频读取低频更新的场景,比如支付场景中对手方发送的报文,论坛系统中文章的点赞数等。
1、SET/GET 设置/获取单一数据
如图所示,SET用于设置指定KEY的值,如果KEY的值已经存在,则直接进行覆盖。 GET用于获取指定KEY的值,如果KEY不存在,则返回NULL。
2、MSET/MGET 一次更新/获取多条数据
如同一台电梯载重1吨,我们借助电梯从1楼运砖头到5楼,我们可以每次上下往返运一个砖头,也可以每次往返运一批砖头。在批处理等场景中,通过MSET/MGET命令,我们可以一次网络交互处理多条数据,提高了处理效率。
命令格式:
MSET KEY1 VALUE1 [KEY2 VALUE2 ...]
MGET KEY1 [KEY2...]
如图所示,MSET/MGET相当于一次执行了多条SET/GET,同样遵循复写和返回NULL的规则。
3、SETNX 如果KEY不存在,则设置KEY和指定的VALUE,如果KEY已经存在,则设置失败
如图所示,当orderid:1不存在时,setnx可以成功进行设置,如果orderid:1已经存在了,则无法进行设置。这个命令在后续分布式锁中经常使用。
4、INCR 数据自增
数据可以表示64位有符号数,如果不是数字型则会直接报错。
如图所示,我们对art:like进行了自增的操作,对非数字型的a进行自增时,redis会直接报错,如果超过了数字的表示范围,比如mykey进行自增时,redis也会直接报数据集将会溢出的错误。
List类型
List在Redis中类似一个双端队列,我们可以在队列的左边或者右边添加/删除元素。 主要掌握以下基本命令:
1、LPUSH/RPUSH
在队列的左边或者右边添加一个元素
用法:LPUSH/RPUSH KEY VALUE1 VALUE2
如果KEY不存在则会新建一个KEY,如果KEY存在则在原有LIST的基础上进行操作
如图所示,LPUSH在名为list1的列表左边添加了元素a,RPUSH在名为list1的列表右边添加了元素b、c。
2、LPOP/RPOP
从队列的左边或者右边取出元素,如果不存在元素则返回Null
用法: LPOP/RPOP KEY
执行lpop后:
执行rpop后:
3、LLEN
返回指定KEY的队列长度
用法: LLEN KEY
当前list1中只有b一个元素,所以返回1。
4、LRANGE
返回列表中指定范围的元素
用法: LRANGE KEY 开始位置 结束位置
先在list1列表的右端添加c、a元素,列表中的元素按照从左到右编号为0,1,...len-1,此时列表的元素如下:
此时执行lrange list1 0 -1表示找到list1列表中开头到结尾的所有元素,超出范围的元素不会被处理。
5、LTRIM
限制队列的长度 用法:LTRIM KEY 开始位置 结束位置
考虑一个场景:在大促秒杀场景中,我们可以通过利用队列有序的特点,在redis中设置一个List用于保存购买的用户ID,为了防止队列无限增长超过了内存容量的极限,可以通过LTRIM命令来限制队列的长度。注意:LTRIM并不是设置后队列就无法增长了,而是将超过容量的数据进行删除,因此使用LTRIM是一种简化的处理方式,需要评估下数据量的增长模式。
6、LINDEX
获取队列中某个索引位置的元素
用法 LINDEX KEY 元素位置
如图所示,获取list1列表中位置为1的元素,返回元素c,如果查找不存在的元素,则返回NULL
7、LREM
删除列表中指定数量的匹配元素
命令用法:
LREM key count value
key:列表的键名。
count:删除策略的标识符,决定删除的方向和数量。
count > 0:从列表头部(左端)向尾部(右端)搜索,删除最多 count 个与 value 相等的元素。
count < 0:从列表尾部向头部搜索,删除最多 |count| 个与 value 相等的元素。
count = 0:删除列表中所有与 value 相等的元素。
如图所示,原有List中有五个元素,执行lrem从索引0开始扫描,最多删除2个匹配为z的元素。
8、BLPOP/BRPOP
如果队列中有元素则获取,如果没有则进行阻塞
命令用法:
BLPOP key [key ...] timeout
key:要操作的列表的键名,可以指定多个键。
timeout:阻塞等待的超时时间,单位为秒。如果设置为 0,表示无限阻塞,直到有元素可弹出。 返回值:
如果列表为空且超时,返回 null。
如果列表不为空,返回一个包含两个元素的列表,第一个元素是被弹出元素所属的键名,第二个元素是被弹出的值。
如图所示,通过BLPOP/BRPOP可以实现一个轻量级的消息订阅队列,在特定场景下可以替代重量级的消息队列中间件。
HASH类型
HASH数据类型也是Redis中一个非常重要的基础数据类型,类似于我们通过一个KEY键值去关联一个HASHMAP。
对于HASH类型,我们主要需要掌握以下的基本操作:
1. HSET
语法:HSET key field value [field value ...]
功能:设置哈希表中一个或多个字段的值。若字段存在则覆盖旧值,若哈希表不存在则自动创建。
示例:
2. HGET
语法:HGET key field
功能:获取哈希表中指定字段的值。若字段或键不存在返回null。
示例:
3. HGETALL
语法:HGETALL key
功能:返回哈希表所有字段及对应的值,按字段-值的交替顺序返回列表。
示例:
如图所示,将myhash中的hash Key和hash value交替输出。
4. HEXISTS
语法:HEXISTS key field
功能:检查哈希表中是否存在指定字段,存在返回1,否则返回0。
示例:
5. HDEL
语法:HDEL key field [field ...]
功能:删除哈希表中一个或多个字段,返回成功删除的字段数量。
示例:
6. HKEYS
语法:HKEYS key
功能:返回哈希表中所有字段名(不包含值)。
示例:
7. HVALS
语法:HVALS key
功能:返回哈希表中所有字段的值(不包含字段名)。
示例:
8. HLEN
语法:HLEN key
功能:返回哈希表中字段的总数。若键不存在返回0。
示例:
9. HSETNX
语法:HSETNX key field value
功能:仅当字段不存在时设置其值。成功返回1,失败返回0。
示例:
10. HSCAN
语法:HSCAN key cursor [MATCH pattern] [COUNT count]
功能:增量遍历哈希表中的字段和值。cursor为游标(初始为0),MATCH匹配字段模式,COUNT限制每批返回数量。
示例:
如图所示,其中0表示从哪个位置开始扫描,match表示匹配什么类型的hash key,这里支持正则表达式,count表示每次返回的数量。 其中返回的第一行0表示已经遍历完了整个hash对象,如果这个hash对象是一个大对象,可以限制返回数量,分批进行扫描,避免一次扫描花费太多时间,造成线上问题。
总结: 本次主要讲解redis中的String、List、Hash三个基本的数据类型和操作,基本数据类型在实际开发中十分常用,各位可以对其中基本的操作有大体的了解,实际开发中结合手册和搜索工具可以快速进行开发工作。