目录
前言
redis 中最关键的五个数据类型 String、List、Hash、Set、Zset 应用最广泛,同时 redis 也推出了额外的 5 个数据类型,他们分别是针对特殊场景才进行的应用的.
Ps:这几种类型的具体使用不用记,记你也记不住,因为不常用,因此我们只需要了解其对应的应用场景,需要的时候去官方文档一查就清楚了~
Stream
Stream 就是一个阻塞队列,是 redis 作为消息队列的重要支撑,属于是 List 的 blpop / brpop 的升级版本.
Stream 类型,按照官方文档的意思,就是用来模拟实现事件传播机制~
事件是什么?例如以下两个场景:
- epoll / io 多路复用:每次网卡 / socket 上有可读可写的数据,都会通过这种事件回调的机制来通知到咱们的应用程序代码.
- JS:点击事件、键盘事件、窗口大小改变 / 位置改变事件.
简单来讲,就是有些操作,我们也不知道什么时候出现,只能等这个事件出现之后,再采取动作.
geospatial
用来存储坐标,就是经纬度的.
存储了一些点之后,就可以让用户给定一个坐标,去刚才存储的点中查找(按照半径,矩形区域...),这个功能在 "地图" 应用中非常重要~
HyperLogLog
应用场景只有一个,就是用来估算集合中元素的个数.
Set 有一个应用场景就是统计 UV(多少个不同用户进行了访问) ,但问题在于一旦数据非常大,Set 就会消耗很多的内存空间~
假设 Set 存储 userId,每个按照 8 字节计算,1亿 UV = 8 亿字节,相当于 800 MB,而使用 HyperLogLog 最多会使用 12KB 的空间.
Ps:HyperLogLog 不存储元素的内容,但是能够记录 "元素的特征"(具体实现,看源码才知道,核心思路是"位操作"),从而在新增元素的时候,能够知道新增元素,是一个存在的元素,还是一个新元素~
因此,HyperLogLog 只用来计数(记录当前集合有多少个不同的元素 => 多少个不同用户访问了你这个服务器),但是不能告诉你这些元素是啥~
Bitmaps
使用 bit 位来表示整数,存储的底层数据结构式位图~
位图的本质还是一个集合,属于式 Set 类型针对整数优化的特殊版本(节省空间)
对比 HyperLogLog:
HyperLogLog 既可以存储数字也可以存储字符串,但是不存储元素内容,只是计数效果,因此 hyperloglog 存储元素,提取特征的过程是不可逆的(信息丢失),例如给你个猪肉,可以做成火腿肠,但是给你火腿肠是还原不回猪肉的。
Bitfields
bitfields 和 C 语言中的位域是很相似的~
bitfield 可以理解成一串二进制序列(字节数组),同时可以把这个字节数组中的几个位,赋予特殊的含义,并可以进行 读取/修改/算数运算 等操作.
位域相比较 String / hash 来说,目的是为了节省空间.
使用场景就是游戏中的杀怪计数: