我们之前说了redis中的五个类型 分别是:String List Hash Set ZSet,那除了这五个redis文档中还给我们提供了一些其他的数据类型
(一)一些其他的数据类型
1.stream
这里的数据类型我们只做简单的一些介绍,如果想了解具体要怎么做的,我们可以去redis官网中看看
Redis 中Stream是一种强大的数据结构,用于处理数据流,类似于消息队列或只读日志。它适用于需要实时流处理、可扩展性、持久性和可靠消息传输的应用程序。
主要优势:
实时流式传输:实时向多个消费者传输数据。
可扩展性:处理大量消息。
持久性:确保可靠的消息传递和重播功能。
消费者组:允许多个消费者从同一流中读取数据。
2.geospatial
这个命令通常是用来存储一个坐标的,而且在其中,我们可以通过一个坐标来对其他坐标进行范围查找,所以这个功能在地图中被广泛运用
这就是这个数据类型的一个简单命令
使用Redis获取地理空间数据的好处:
低延迟和高吞吐量:内存数据存储确保快速查询响应。
可伸缩性:有效地处理大量地理空间数据。
实时功能:非常适合需要即时位置查询的应用程序,如交付跟踪或商店定位器。
3.hyperloglog
这个数据结构的应用场景只有一个,用来估算集合中的元素个数
那这时候我们就有疑问,我们set中不是有scard来计算有多少元素嘛,为啥还要用这个数据类型呢?
这是因为set是会切实的存储我们的数据就会导致我们的数据会占用我们很多的内存空间,而hyperloglog不会,他不会存储元素内容,但是他会通过一些元素的特征,在我们新增元素的时候,能够知道这个新增的元素是不是一个已经存在的元素,如果是不存在的,就会入集合(通过hyperloglog这个数据类型,可以将我们的空间控制在12kb内)
但是这个是有误差的,我们说是通过一些元素的特征,那如果有两个元素特征一样。就会误以为元素的重复的,所以我们这里会有一个大概0.81%的误差存在
4.bitmap
bitmap叫做位图,其实还是一个集合,但是是Set类型针对整数的一个特化版本,把一个个字节来当作数字进行存储,更加的节省空间
5.bitfield
Redis位域允许你设置、增加和获得任意位长度的整数值,使用二进制编码的Redis字符串存储。位字段支持原子读、写和自增操作。
(二)渐进式遍历
我们之前在说到keys *这个命令的时候我们说会因为一次性获取太多数据导致redis卡住了,然后回导致一系列问题,那如果我们一定要获取全部key就要进行拆分,一次获取一部分,这样多次获取就可以完成获取到所有key的操作
渐进式遍历是一组命令,这一组命令的使用方法都是一样的,所以我们这里用SCAN来举例子
首先我们cursor叫做光标,他指向了当前遍历的位置如果为0就表示这次的遍历从头开始获取 ,match pattern和keys的命令是一样的,也是类似于keys h?llo的效果,count是给这个命令的返回值提供一个参考,也就是要返回大概多少个元素(默认是10),type就是指定要查询的类型
然后我们来看返回值,这个1)后的这个数字表示我们下一次的cursor应该从哪里开始,但是这个值并不是我们访问到哪一个元素了,只是一个字符串不是下标,所以只有redis服务器知道这个光标对应的一个元素位置。然后2)后的就是本次查询的元素
同时我们要注意,count里的数字不需要每次都设置成一样的,这里的渐进式遍历是无状态的,遍历过程中不会在服务器里存储信息,所以我们的遍历是可以随时终止的
但是渐进式遍历也有一定的风险,如果我们在渐进式遍历的期间,进行插入,删除操作,就会导致遍历时有所遗漏或者重复,但是这个也不知存在于渐进式遍历,其实所有遍历都会有这个问题
(三)database
我们之前在学习mysql的时候有一个概念叫做database,一个mysql服务器上有很多database,一个database有很多个table,我们称为关系型数据库。
那我们学习redis的时候只是说了是键值对的方式存数据,好像没有说到类似database这样的概念,但是其实我们redis是有的,只是不常用,而且我们对于数据库的操作也是极其有限的,不像mysql一样可以手动创建和删除
redis默认给我们提供了16个数据库,分别是0-15号,这些数据库间的数据是隔离的,如果我们使用了一个数据库,那么就无法直接访问到另一个数据库的数据,默认情况下我们使用0号数据库
我们通过这个命令就可以更改我们目前使用的数据库,我们之前讲过的flushall就是删除所有库上的所有key,我们还有个命令叫flushdb,是删除当前库上的所有操作