本专栏开启,目的在于帮助大家更好的掌握学习Redis,同时也是为了记录我自己学习Redis的过程,将会从基础的数据类型开始记录,直到一些更多的应用,如缓存击穿还有分布式锁等。希望大家有问题也可以一起沟通,欢迎一起学习,对于专栏内容有错还望您可以及时指点,非常感谢大家 🌹。
Redis给我们提供了五大基本数据类型使用,分别是String,hash,list,zset。它们分别代表字符串、哈希、列表、有序集合,文章主要介绍它们的使用场景和基础的使用命令。
String类型是Redis用的最多的类型,我们都知道Redis是一个key-value结构的数据库,一个key只能对应一个value,虽然是字符串类型,但它也可以存储数字和浮点数,可以进行自增自减操作。String类型还是一个二进制安全的数据类型,意思是它可以存储任何数据,比如图片等等。它的值能存储的最大限度是512MB。下面我们来看看它的基础操作常见操作有哪些
顾名思义,set就是存储操作,get就是获取操作,如图我们输入指令
help get/set可以看到它的使用详情:


在这我们存入一个key为name,value为Jack的值,得到返回值为OK:

然后我们通过get去获取这个值也能获取成功:

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

这两个操作和上面是类似的,不过是可以同时进行批量操作,同时插入多个数据或者同时获取多个数据。看看help指令:

我们插入使用mset同时插入三条数据,然后使用mget去尝试获取:

incr的作用比较简单,可以让一个整型的key自增 1 ,如果这个key不存在,则我们会自动生成,我们来看看help指令:

我们先自增一个不存在的数,然后再自增一遍查看一下值:

从返回值来看,我们就可以发现它的作用是自增1。
它的作用同incr,只不过incrby我们可以指定它自增多少,我们来看看help指令:

我们直接对上面使用的num变量操作并通过返回值来查看它的值:

从它的名字来看,就知道它是操作浮点数类型的,不过在redis中浮点数也是用字符串来表示的,我们看看help指令:

再看看简单的演示效果:

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

我们连续插入两次,从返回值来看就可以知道插入成功还是失败,1是true而0是flase,最后get获取值也发现x并未改变。

这个指令也是插入数据,不过我们可以指定这个数据的有效期,也就是可以给它设置一个过期时间,这个操作在redis中还是很常见的。

这里我们插入一个数据并指定它的过期时间,然后我们可以通过TTL指令查看其剩余时间:

可以发现插入了一个时间为key为time且存活时间为1000秒的数据,TTL查询时还剩994秒。
Redis中的hash是一个键值对集合,它可以存储多个键值对,因此我们一般使用它来存储对象,它与Java中的Map类似。我们直接通过命令学习就可以感受到它的作用。
作用同set,但是一个hash对象可能有多个属性,所以我们还需要指定我们插入或者修改的是哪个属性,我们来查看它的help使用命令,可以发现它可以同时直接插入多条field-value,这是因为redis在4.0之后就实现了这个功能,hmset被弃用了,所以大家熟练使用hset即可。当hget指令从help指令看来,每次我们只能查询hash的某一个属性。


插入数据:

使用hget查询单个属性

使用hmget就可以同时获取hash的多个属性,我们来看看help指令教学:

获取前面插入的数据:

从redis可视化来看查询无问题:

使用hgetall就可以直接获取一个hash的全部属性和值,不然属性过多时我们不可能使用hmget去获取,而hkeys则是获取hash的全部属性,hvals则是获取全部的值,我们来看help指令:



进行使用:



hincrby 也是起自增效果的,可能指定增长的步长,我们看看help指令。

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

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

hsetnx的效果也是插入数据,同理它也只会插入hash里不存在的key,如果已经存在它将会插入失败。我们来看看help指令:

我们首先插入一个已经存在的属性,返回值为0说明插入失败。

这时我们再插入一个不存在的属性性别,返回值为1说明插入成功。

学过Java应该都对这个接口很熟悉,它的作用也和LinkedList类型,可以看成是一个双向链表的结构,支持头尾操作以及正向检索和反向检索。我们来学习一下它的常见指令
push就是加入的意思,那么lpush就是从左边加入数据,也可以看成在链表头加入数据,可以插入一条也可以插入多条。我们来看看help指令:

我们使用lpush插入三条数据

我们通过redis可视化来查看数据,可以发现从上到下的顺序是321,和我们插入的顺序相反,这也证实了我们是从左往右插入的

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

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

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

来看看插入效果

lrang是查询一段区间内的所有数,我们来看看使用的help指令:

此时我们查询的list内的元素为:

来进行查询操作,发现查询
[
1
,
3
]
[1,3]
[1,3]时输出的是5,4,3,而查询
[
0
,
3
]
[0,3]
[0,3]时输出的是6,5,4,3,说明我们的list也是从左往右下标从0开始的。

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


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



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


Redis中的set其实同Java中的HashSet类型,可以看做是一个value为null的hashmap,因为是哈希表,所以其特性与HashSet类似:
作用就是向一个set中同时添加一个或多个元素,当然元素不可重复,来查看help指令:

我们来插入多个元素,并插入一些重复的来看看效果,从返回值为5就可以看出我们成功插入的元素只有5个,可视化表也看出来不存在重复元素。


srem的作用是删除set中指定的元素,可以同时删除多个元素,我们来看看help的指令:

我们来进行使用,从返回值来看知道成功删除的元素只有两个1,3,因为6,7并不存在与set中。

使用比较简单,就是返回set中的元素个数,我们来查看一下help然后再演示一下使用:


用于判断set中是否存在某个数,和hashet的contains函数是一样的效果,我们来看看help指令该怎么使用

由于前面删除了1,3,此时set中只剩下了

我们来使用sismember演示一下查询,存在则返回1,否则返回0。

作用比较简单,获取set中的全部元素,来查看help指令

进行查询使用

这三个运算是一个二元的运算,也就是同时需要两个set,它们的功能分别是sinter是获取两个set的交集,sdiff是获取两个set的差集,sunion是获取两个set的并集。来查看help指令:

准备好两个set存储的元素分别如下:


首先使用sinter获取交集:

使用sdiff获取差集

使用sunion获取并集

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

我们假设一个场景,存在各个成员的考试成绩,这样score就说大家的分数:

我们此时可以对Jack进行分数更新

此时再看他们的排名:

zrem是删除sortedset的一个指定元素,我们来查看help指令

我们来尝试删除Jack,返回值为1说明删除成功。删除一个不存在的属性时返回值为0。

zscore是获取指定元素的score值,查看help指令:

我们来使用它获取分数,如果获取的属性不存在则会返回null值。

zrank是获取某个元素的排名,我们查看help指令:

我们通过它获取排名,可以看出排名是从0开始,如果不存在的属性则返回null。

作用是获取sortedset的元素个数,查看help指令:

使用进行查询

zcount的作用是获取一段分数区间的元素个数,我们查看help指令:

查询
[
70
,
90
]
[70,90]
[70,90]分数区间,返回值为3,说明查询的区间是闭区间。


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

我们让tom的分数增加,返回了增加后的分数为100。

作用是获取指定排名区间的所有元素,我们来查看help指令:

使用进行查询,下标从0开始:

这个用法同set一样,效果也一样。
