【Redis从入门到进阶】第 1 讲:Redis的五大基本数据类型
【Redis从入门到进阶】第 1 讲:Redis的五大基本数据类型
专栏前言
本专栏开启,目的在于帮助大家更好的掌握学习Redis
,同时也是为了记录我自己学习Redis
的过程,将会从基础的数据类型开始记录,直到一些更多的应用,如缓存击穿还有分布式锁等。希望大家有问题也可以一起沟通,欢迎一起学习,对于专栏内容有错还望您可以及时指点,非常感谢大家 🌹。
1.Redis的五大基本类型
Redis
给我们提供了五大基本数据类型使用,分别是String
,hash
,list
,zset
。它们分别代表字符串、哈希、列表、有序集合,文章主要介绍它们的使用场景和基础的使用命令。
2.String (字符串)
String
类型是Redis
用的最多的类型,我们都知道Redis
是一个key-value
结构的数据库,一个key
只能对应一个value
,虽然是字符串类型,但它也可以存储数字和浮点数,可以进行自增自减操作。String
类型还是一个二进制安全的数据类型,意思是它可以存储任何数据,比如图片等等。它的值能存储的最大限度是512MB
。下面我们来看看它的基础操作常见操作有哪些
2.1 set和get
顾名思义,set
就是存储操作,get
就是获取操作,如图我们输入指令
help get/set
可以看到它的使用详情:
在这我们存入一个key
为name
,value
为Jack
的值,得到返回值为OK
:
然后我们通过get
去获取这个值也能获取成功:
当然set
的作用不仅是存储,如果redis
中已经存在该key
的值,我们会覆盖掉它,比如我们现在再次存储一个key
为name
的值,再获取它,可以发现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
中不存在的,否则它不执行,也就是它说它不会覆盖原数据。
我们连续插入两次,从返回值来看就可以知道插入成功还是失败,1
是true
而0
是flase
,最后get
获取值也发现x
并未改变。
1.7setex
这个指令也是插入数据,不过我们可以指定这个数据的有效期,也就是可以给它设置一个过期时间,这个操作在redis
中还是很常见的。
这里我们插入一个数据并指定它的过期时间,然后我们可以通过TTL
指令查看其剩余时间:
可以发现插入了一个时间为key
为time
且存活时间为1000
秒的数据,TTL
查询时还剩994
秒。
2. Hash (哈希)
Redis
中的hash
是一个键值对集合,它可以存储多个键值对,因此我们一般使用它来存储对象,它与Java中的Map<String,Object>
类似。我们直接通过命令学习就可以感受到它的作用。
2.1 hset和hget
作用同set
,但是一个hash
对象可能有多个属性,所以我们还需要指定我们插入或者修改的是哪个属性,我们来查看它的help
使用命令,可以发现它可以同时直接插入多条field-value
,这是因为redis
在4.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
从名字上来看,它们也是输出弹出元素的操作,但不同于lpop
和rpop
两个在使用时如果list
为空会立马返回null
值。我们可以给blpop
和brpop
指定一个等待时间,它们会进行阻塞,虽然此时可能不存在元素,但在阻塞等待的时间内如果进入了元素,将会被弹出,我们来看看help
指令:
当我们执行改blpop
操作时,发现进入阻塞等待状态,此时我们开多一个xshell
连接,去给list
加入一个数据。当我们操作完成以后,回头看此时的阻塞状态已经结束,输出了我们的list
以及弹出的数据还有阻塞时间。
为什么还会输出我们弹出的是哪个队列呢?其实从上面的help
指令能看出,blpop
可以同时指定多个等待的list
,哪个可以弹出我们就会输出哪个。比如我们下图同时等待三个空的list
集合,当给list2
加入元素后,就会弹出12
,并输出我们弹出的是list2
这个集合,以及等待了36.16s
。
4.Set
Redis
中的set
其实同Java
中的HashSet
类型,可以看做是一个value
为null
的hashmap
,因为是哈希表,所以其特性与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
中是否存在某个数,和hashet
的contains
函数是一样的效果,我们来看看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
一样,效果也一样。
更多推荐
所有评论(0)