之前我们已经学习了redis中常见的五种数据类型:string, list, hash,set, zset。这五种数据类型是最常见,最广泛被使用的,下面我们再来认识一下针对特定场景下的一些数据类型
🐼Streams
根据官方文档的介绍,stream可以模拟事件传播的机制。其实就是一个生产者消费者的阻塞队列,作为消息队列的重要支撑,属于list的blpop,brpop的升级版本。
🐼Geospatial
这个数据类型用来存储坐标,经纬度。
存储一些点之后,就可以让用户给定一个坐标,去从刚刚存储的点为中心,或者一个范围,半径进行查找。比如找到在地图中以某个地点为中心,半径为1km的所有餐馆。
🐼HyperLogLog
HyperLogLog是一种概率数据结构,用于估计集合的基数。
我们之前说过,set有一个应用场景,就是统计UV的次数。
使用Set当然可以统计,但是如果UV的数量非常大,那么Set会占很多内存空间。假设每个用户的userid为8个字节,一亿个用户那么就是8亿字节,相当于0.8G,如果直接使用Set
但是对于场景直接使用HypeerLogLog就仅仅需要12kb。是不是数量级一下小了好多倍。
HyperLogLog适用于统计是不是第一次出现的元素,它提取了元素的特征,从而在新增元素的时候,只 能够知道这个元素是一个已经存在的元素,还是一个崭新的元素,但是它不能存储元素的内容,也就是说这个过程是不可逆的。它可以记录当前集合中有多少元素,但是不能告诉你这些元素都是啥。
如果我们想统计一下UV,这种场景,只想计数,但是又不想知道具体的元素内容,就可以使用HyperLogLog,如果即想计数,又想知道元素的内容,那么还是使用Set吧
🐼 Bitmaps
Bitmaps本质还是一个集合,属于是Set类型针对整数的特化版本。实际上就是普通的字符串(byte array),每个 bit 位只能是 0 或 1
-
存储 1 亿用户在线状态只需约 12MB(
100,000,000 / 8 / 1024 / 1024 ≈ 12MB) -
相比 Set 类型节省大量内存
如果对于一个场景只有两面性,比如用户在线或者不在线,那么就可以使用Bitmaps。1表示用户在线,0表示用户不在线。并且可以支持查找。也就是保存了用户的状态信息,而HpterLogLog没有保存用户的状态信息。
🐼 Bitfileds
即位域,有点类似于C语言的位段。
可以将bitmaps理解为一串二进制序列,字节数组。
同时可以把这个字节数组的某几位,赋予特殊的含义,进行位操作,来达到不同的效果。