• 【Redis从入门到进阶】第 1 讲:Redis的五大基本数据类型


    本文已收录于专栏
    🍅《Redis从入门到进阶》🍅

    专栏前言

       本专栏开启,目的在于帮助大家更好的掌握学习Redis,同时也是为了记录我自己学习Redis的过程,将会从基础的数据类型开始记录,直到一些更多的应用,如缓存击穿还有分布式锁等。希望大家有问题也可以一起沟通,欢迎一起学习,对于专栏内容有错还望您可以及时指点,非常感谢大家 🌹。

    1.Redis的五大基本类型

       Redis给我们提供了五大基本数据类型使用,分别是Stringhashlistzset。它们分别代表字符串、哈希、列表、有序集合,文章主要介绍它们的使用场景和基础的使用命令。

    2.String (字符串)

      String类型是Redis用的最多的类型,我们都知道Redis是一个key-value结构的数据库,一个key只能对应一个value,虽然是字符串类型,但它也可以存储数字和浮点数,可以进行自增自减操作。String类型还是一个二进制安全的数据类型,意思是它可以存储任何数据,比如图片等等。它的值能存储的最大限度是512MB。下面我们来看看它的基础操作常见操作有哪些

    2.1 set和get

      顾名思义,set就是存储操作,get就是获取操作,如图我们输入指令
    help get/set可以看到它的使用详情:
    在这里插入图片描述
    在这里插入图片描述

    在这我们存入一个keyname,valueJack的值,得到返回值为OK
    在这里插入图片描述
    然后我们通过get去获取这个值也能获取成功:

    在这里插入图片描述
    当然set的作用不仅是存储,如果redis中已经存在该key的值,我们会覆盖掉它,比如我们现在再次存储一个keyname的值,再获取它,可以发现name的值已经被修改。
    在这里插入图片描述

    2.2 mset和mget

      这两个操作和上面是类似的,不过是可以同时进行批量操作,同时插入多个数据或者同时获取多个数据。看看help指令:
    在这里插入图片描述
    我们插入使用mset同时插入三条数据,然后使用mget去尝试获取:
    在这里插入图片描述

    1.3 incr

       incr的作用比较简单,可以让一个整型的key自增 1 ,如果这个key不存在,则我们会自动生成,我们来看看help指令:
    在这里插入图片描述
    我们先自增一个不存在的数,然后再自增一遍查看一下值:

    在这里插入图片描述
    从返回值来看,我们就可以发现它的作用是自增1。

    1.4 incrby

      它的作用同incr,只不过incrby我们可以指定它自增多少,我们来看看help指令:
    在这里插入图片描述
    我们直接对上面使用的num变量操作并通过返回值来查看它的值:
    在这里插入图片描述

    1.5 incrbyfloat

      从它的名字来看,就知道它是操作浮点数类型的,不过在redis中浮点数也是用字符串来表示的,我们看看help指令:
    在这里插入图片描述
    再看看简单的演示效果:
    在这里插入图片描述

    1.6 setnx

      这个指令也是插入数据的,不过它set插入的差距在于它插入的数据必须是redis中不存在的,否则它不执行,也就是它说它不会覆盖原数据。

    在这里插入图片描述
    我们连续插入两次,从返回值来看就可以知道插入成功还是失败,1true0flase,最后get获取值也发现x并未改变。
    在这里插入图片描述

    1.7setex

      这个指令也是插入数据,不过我们可以指定这个数据的有效期,也就是可以给它设置一个过期时间,这个操作在redis中还是很常见的。
    在这里插入图片描述
    这里我们插入一个数据并指定它的过期时间,然后我们可以通过TTL指令查看其剩余时间:
    在这里插入图片描述
    可以发现插入了一个时间为keytime且存活时间为1000秒的数据,TTL查询时还剩994秒。

    2. Hash (哈希)

      Redis中的hash是一个键值对集合,它可以存储多个键值对,因此我们一般使用它来存储对象,它与Java中的Map类似。我们直接通过命令学习就可以感受到它的作用。

    2.1 hset和hget

      作用同set,但是一个hash对象可能有多个属性,所以我们还需要指定我们插入或者修改的是哪个属性,我们来查看它的help使用命令,可以发现它可以同时直接插入多条field-value,这是因为redis4.0之后就实现了这个功能,hmset被弃用了,所以大家熟练使用hset即可。当hget指令从help指令看来,每次我们只能查询hash的某一个属性。
    在这里插入图片描述
    在这里插入图片描述

    插入数据:
    在这里插入图片描述
    使用hget查询单个属性
    在这里插入图片描述

    2.2 hmget

      使用hmget就可以同时获取hash的多个属性,我们来看看help指令教学:
    在这里插入图片描述

    获取前面插入的数据:
    在这里插入图片描述
    redis可视化来看查询无问题:
    在这里插入图片描述

    2.2 hgetall、hkeys、hvals

      使用hgetall就可以直接获取一个hash的全部属性和值,不然属性过多时我们不可能使用hmget去获取,而hkeys则是获取hash的全部属性,hvals则是获取全部的值,我们来看help指令:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    进行使用:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    2.3 hincrby

      hincrby 也是起自增效果的,可能指定增长的步长,我们看看help指令。
    在这里插入图片描述

    我们使用它对上面的插入数据的年龄进行自增10的操作,返回值看出来没什么问题
    在这里插入图片描述

    但如果我们对非整型的属性进行自增会怎样呢?
    它会报错告诉我们这个值非整型

    在这里插入图片描述

    2.4 hsetnx

      hsetnx的效果也是插入数据,同理它也只会插入hash里不存在的key,如果已经存在它将会插入失败。我们来看看help指令:
    在这里插入图片描述
    我们首先插入一个已经存在的属性,返回值为0说明插入失败。
    在这里插入图片描述
    这时我们再插入一个不存在的属性性别,返回值为1说明插入成功。
    在这里插入图片描述

    3.List

      学过Java应该都对这个接口很熟悉,它的作用也和LinkedList类型,可以看成是一个双向链表的结构,支持头尾操作以及正向检索和反向检索。我们来学习一下它的常见指令

    3.1 lpush

      push就是加入的意思,那么lpush就是从左边加入数据,也可以看成在链表头加入数据,可以插入一条也可以插入多条。我们来看看help指令:

    在这里插入图片描述
    我们使用lpush插入三条数据
    在这里插入图片描述
    我们通过redis可视化来查看数据,可以发现从上到下的顺序是321,和我们插入的顺序相反,这也证实了我们是从左往右插入的
    在这里插入图片描述

    3.2 lpop

      pop操作顾名思义,就是弹出的操作,所以lpop会从左边弹出第一个元素,如果没有元素则会返回一个null值,我们来看help指令操作:
    在这里插入图片描述

    我们来将刚才插入的元素逐渐弹出来看看弹出的元素顺序以及list为空时使用lpop的效果。
    在这里插入图片描述

    3.3 rpush、rpop

      这两个对应效果和lpush以及lpop是一样的,只不过改成了从右边插入,其余效果都是一样的,所以我们一起进行演示,来看看help指令:
    在这里插入图片描述
    来看看插入效果
    在这里插入图片描述

    3.4 lrange

      lrang是查询一段区间内的所有数,我们来看看使用的help指令:
    在这里插入图片描述
    此时我们查询的list内的元素为:
    在这里插入图片描述
    来进行查询操作,发现查询 [ 1 , 3 ] [1,3] [1,3]时输出的是5,4,3,而查询 [ 0 , 3 ] [0,3] [0,3]时输出的是6,5,4,3,说明我们的list也是从左往右下标从0开始的。
    在这里插入图片描述

    3.5 blpop、brpop

      从名字上来看,它们也是输出弹出元素的操作,但不同于lpoprpop两个在使用时如果list为空会立马返回null值。我们可以给blpopbrpop指定一个等待时间,它们会进行阻塞,虽然此时可能不存在元素,但在阻塞等待的时间内如果进入了元素,将会被弹出,我们来看看help指令:
    在这里插入图片描述
    在这里插入图片描述

    当我们执行改blpop操作时,发现进入阻塞等待状态,此时我们开多一个xshell连接,去给list加入一个数据。当我们操作完成以后,回头看此时的阻塞状态已经结束,输出了我们的list以及弹出的数据还有阻塞时间。
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述

    为什么还会输出我们弹出的是哪个队列呢?其实从上面的help指令能看出,blpop可以同时指定多个等待的list,哪个可以弹出我们就会输出哪个。比如我们下图同时等待三个空的list集合,当给list2加入元素后,就会弹出12,并输出我们弹出的是list2这个集合,以及等待了36.16s
    在这里插入图片描述
    在这里插入图片描述

    4.Set

      Redis中的set其实同Java中的HashSet类型,可以看做是一个valuenullhashmap,因为是哈希表,所以其特性与HashSet类似:

    • 无序
    • 元素不可重复
    • 查找效率高
    • 支持交集、并集、差集等功能

    4.1 sadd

      作用就是向一个set中同时添加一个或多个元素,当然元素不可重复,来查看help指令:
    在这里插入图片描述
    我们来插入多个元素,并插入一些重复的来看看效果,从返回值为5就可以看出我们成功插入的元素只有5个,可视化表也看出来不存在重复元素。
    在这里插入图片描述
    在这里插入图片描述

    4.2 srem

      srem的作用是删除set中指定的元素,可以同时删除多个元素,我们来看看help的指令:
    在这里插入图片描述
    我们来进行使用,从返回值来看知道成功删除的元素只有两个1,3,因为6,7并不存在与set中。
    在这里插入图片描述

    4.3 scard

       使用比较简单,就是返回set中的元素个数,我们来查看一下help然后再演示一下使用:
    在这里插入图片描述
    在这里插入图片描述

    4.4 sismember

       用于判断set中是否存在某个数,和hashetcontains函数是一样的效果,我们来看看help指令该怎么使用
    在这里插入图片描述

    由于前面删除了1,3,此时set中只剩下了
    在这里插入图片描述
    我们来使用sismember演示一下查询,存在则返回1,否则返回0
    在这里插入图片描述

    4.5 smembers

       作用比较简单,获取set中的全部元素,来查看help指令
    在这里插入图片描述
    进行查询使用

    在这里插入图片描述

    4.6 sinter、sdiff、sunion

      这三个运算是一个二元的运算,也就是同时需要两个set,它们的功能分别是sinter是获取两个set交集sdiff是获取两个set集,sunion是获取两个set并集。来查看help指令:
    在这里插入图片描述
    准备好两个set存储的元素分别如下:
    在这里插入图片描述
    在这里插入图片描述
    首先使用sinter获取交集:
    在这里插入图片描述
    使用sdiff获取差集
    在这里插入图片描述
    使用sunion获取并集
    在这里插入图片描述

    5.sortedset

      Redis中的sortedset和Java中sortedset也是类似的,是一个有序的不可重复的集合,本质就是在set的基础上增加了有序的特点。它是如何达到有序的功能呢?它是在set的基础上关联上一个粉丝score,然后sortedset会根据这个分数来进行排序,如果分数相同时,则按照存储数据的字典序来进行排序,也就是说sortedset存储的元素不允许重复,但分数允许相同。

    5.1 zadd

      zadd是的作用是添加一个或多个元素到sortedset,如果已经存在的我们则更新其score值。我们来看其help指令:
    在这里插入图片描述

    我们假设一个场景,存在各个成员的考试成绩,这样score就说大家的分数:
    在这里插入图片描述
    我们此时可以对Jack进行分数更新
    在这里插入图片描述
    此时再看他们的排名:
    在这里插入图片描述

    5.2 zrem

      zrem是删除sortedset的一个指定元素,我们来查看help指令
    在这里插入图片描述

    我们来尝试删除Jack,返回值为1说明删除成功。删除一个不存在的属性时返回值为0
    在这里插入图片描述

    5.3 zscore

      zscore是获取指定元素的score值,查看help指令:
    在这里插入图片描述
    我们来使用它获取分数,如果获取的属性不存在则会返回null值。
    在这里插入图片描述

    5.4 zrank

      zrank是获取某个元素的排名,我们查看help指令:
    在这里插入图片描述
    我们通过它获取排名,可以看出排名是从0开始,如果不存在的属性则返回null
    在这里插入图片描述

    5.5 zcard

      作用是获取sortedset的元素个数,查看help指令:
    在这里插入图片描述

    使用进行查询
    在这里插入图片描述

    5.6 zcount

      zcount的作用是获取一段分数区间的元素个数,我们查看help指令:
    在这里插入图片描述

    查询 [ 70 , 90 ] [70,90] [70,90]分数区间,返回值为3,说明查询的区间是闭区间。
    在这里插入图片描述
    在这里插入图片描述

    5.7 zincrby

      作用是让指定元素的score自增,可以指定增长的步长,查看help指令:

    在这里插入图片描述
    我们让tom的分数增加,返回了增加后的分数为100

    在这里插入图片描述

    5.8 zrange

      作用是获取指定排名区间的所有元素,我们来查看help指令:
    在这里插入图片描述
    使用进行查询,下标从0开始:
    在这里插入图片描述

    5.9 zdiff、zinter、zunion

    这个用法同set一样,效果也一样。
    在这里插入图片描述

  • 相关阅读:
    【C语言入门】ZZULIOJ 1036-1040
    荐书丨《实验心理学指导手册》:如何快速掌握一篇文献中的实验范式
    Vue项目中配置eslint
    【WebForms王者归来】在 ASP.NET Core 中运行 WebForms 业务代码,99%相似度!
    【Python】快速入门
    06_Node.js服务器开发
    JVM相关概念
    Python爬虫自动切换爬虫ip的完美方案
    如何用架构的思维为云原生做减法?
    从零开始实现大语言模型(五):缩放点积注意力机制
  • 原文地址:https://blog.csdn.net/m0_57487901/article/details/127909882