admin管理员组

文章数量:1446760

【redis】streams、geospatial、HyperLogLog、bitmaps、bitfields类型

streams

此类型,可以用来模拟实现“事件传播”的机制

什么是事件?有些操作,我们也不知道它什么时候出现,只能等这个事情出现了之,再采取行动

  • 比如,一旦着火了,就立即使用灭火器灭火
  • 此处的“着火”就是“事件“,“使用灭火器”就是“事件触发的回调函数

现在我们准备好了 stream,有事件产生了,我们就把这个事件当做一个元素,插入到这个 stream 里面。同时另有一些消费者在这里监听这个 stream,一旦有事件来了,消费者就感知到了,就立刻采取动作

stream 就是一个队列(阻塞队列)。redis 作为一个消息队列的重要支撑,属于是 list 里面 blpop/brpop 升级版本

基本命令

  • XADD:往 stream 里面插入元素
  • XREAD:从 stream 里面取元素
  • XRANGE:展示 stream 里面的元素
  • XLEN:获取 stream 里面的元素个数

geospatial

(地理空间的)

用来存储坐标(经纬度)

存储一些点之后,就可以让用户给定一个坐标,去从刚才存储的点里进行查找(按照半径,矩形区域…)

  • 在地图领域非常重要
image.png

基本命令

  • GEOADD:添加位置坐标
  • GEOSEARCH:在给定的范围里面进行查找

HyperLogLog

应用场景只有一个:估算集合中的元素个数

set 有一个应用场景,统计服务器的 UV(用户访问的次数)

  • 使用 set 当然可以统计 UV,但是最大的问题在于:如果 UV 数据量非常大,set 就会消耗很多的内存空间
  • 假设 set 存储 userId,每个 userId 按照 8 个字节算。1 亿 UV >8 亿字节>0.8GB HyperLogLog` 可以最多使用 12 KB 的空间,实现上述效果

之所以 set 要消耗这么大的空间,是因为 set 需要存储每个元素。而 HyperLogLog 不存储元素的内容,但是能够记录“元素的特征”,从而在新增元素的时候,能够知道当前新增的元素,是一个已经存在的元素,还是一个第一次出现的元素

  • HyperLogLog 用来计数(记录出当前集合中有多少个不同的元素),但是不能告诉你这些元素都是什么

HyperLogLog 存储元素的时候,提前特征的过程是不可逆的(信息量丢失了)

  • 给你猪肉,可以做成火腿肠
  • 但是给你火腿肠,不能还原成猪肉了

bitmaps

(位图)

使用 bit 位来表示整数

位图本质上,就还是一个集合,属于是 set 类型针对整数的特化版本

  • 为了节省空间
  • 计算机进行位操作,一般都是比较高效的

HyperLogLog 虽然更省空间,但是它只计数,不存储元素内容,而 bitmap 存储元素

bitfields

(位域)

可以理解成一串二进制序列(字节数组),同时可以吧这个字节数组中的某几个位赋予特定的含义,并且可以进行读取/修改/算术运算相关操作

  • 相比与之前的 string/hash 来说,还是节省了空间
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2025-03-15,如有侵权请联系 cloudcommunity@tencent 删除geospatialredis集合事件存储

本文标签: redisstreamsgeospatialHyperLogLogbitmapsbitfields类型