深入学习 Redis - Stream、Geospatial、HyperLogLog、Bitmap、Bitfields 类型扩展

目录

前言

Stream

geospatial

HyperLogLog

Bitmaps

Bitfields


前言


redis 中最关键的五个数据类型 String、List、Hash、Set、Zset 应用最广泛,同时 redis 也推出了额外的 5 个数据类型,他们分别是针对特殊场景才进行的应用的.

Ps:这几种类型的具体使用不用记,记你也记不住,因为不常用,因此我们只需要了解其对应的应用场景,需要的时候去官方文档一查就清楚了~

Stream


Stream 就是一个阻塞队列,是 redis 作为消息队列的重要支撑,属于是 List 的 blpop / brpop 的升级版本.

Stream 类型,按照官方文档的意思,就是用来模拟实现事件传播机制~

事件是什么?例如以下两个场景:

  1. epoll / io 多路复用:每次网卡 / socket 上有可读可写的数据,都会通过这种事件回调的机制来通知到咱们的应用程序代码.
  2. 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 来说,目的是为了节省空间.

使用场景就是游戏中的杀怪计数:

相关推荐
Ahern_21 分钟前
Oracle 普通表至分区表的分区交换
大数据·数据库·sql·oracle
夜半被帅醒39 分钟前
MySQL 数据库优化详解【Java数据库调优】
java·数据库·mysql
不爱学习的啊Biao1 小时前
【13】MySQL如何选择合适的索引?
android·数据库·mysql
破 风1 小时前
SpringBoot 集成 MongoDB
数据库·mongodb
汤姆和佩琦1 小时前
2024-12-25-sklearn学习(20)无监督学习-双聚类 料峭春风吹酒醒,微冷,山头斜照却相迎。
学习·聚类·sklearn
Rverdoser1 小时前
MySQL-MVCC(多版本并发控制)
数据库·mysql
好学近乎知o1 小时前
正则表达式(学习Django过程中可能涉及的)
学习·正则表达式·django
雨中奔跑的小孩1 小时前
爬虫学习案例8
爬虫·学习
m0_748233641 小时前
SQL数组常用函数记录(Map篇)
java·数据库·sql
jieshenai1 小时前
使用 VSCode 学习与实践 LaTeX:从插件安装到排版技巧
ide·vscode·学习