前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis特殊数据结构 - Java技术债务

Redis特殊数据结构 - Java技术债务

作者头像
Java技术债务
发布2024-06-21 17:04:55
680
发布2024-06-21 17:04:55
举报
文章被收录于专栏:Java技术债务Java技术债务

Bitmap (位图)

介绍

根据官网介绍:

Bitmaps are not an actual data type, but a set of bit-oriented operations defined on the String type which is treated like a bit vector. Since strings are binary safe blobs and their maximum length is 512 MB, they are suitable to set up to 2^32 different bits. Bitmap 不是 Redis 中的实际数据类型,而是在 String 类型上定义的一组面向位的操作,将其视为位向量。由于字符串是二进制安全的块,且最大长度为 512 MB,它们适合用于设置最多 2^32 个不同的位。

Bitmap 存储的是连续的二进制数字(0 和 1),通过 Bitmap, 只需要一个 bit 位来表示某个元素对应的值或者状态,key 就是对应元素本身 。我们知道 8 个 bit 可以组成一个 byte,所以 Bitmap 本身会极大的节省储存空间。

你可以将 Bitmap 看作是一个存储二进制数字(0 和 1)的数组,数组中每个元素的下标叫做 offset(偏移量)。

常用命令

命令

介绍

SETBIT key offset value

设置指定 offset 位置的值

GETBIT key offset

获取指定 offset 位置的值

BITCOUNT key start end

获取 start 和 end 之前值为 1 的元素个数

BITOP operation destkey key1 key2 ...

对一个或多个 Bitmap 进行运算,可用运算符有 AND, OR, XOR 以及 NOT

Bitmap 基本操作演示

应用场景

需要保存状态信息(0/1 即可表示)的场景

  • 举例:用户签到情况、活跃用户情况、用户行为统计(比如是否点赞过某个视频)。
  • 相关命令:SETBITGETBITBITCOUNTBITOP

HyperLogLog(基数统计)

介绍

HyperLogLog 是一种有名的基数计数概率算法 ,基于 LogLog Counting(LLC)优化改进得来,并不是 Redis 特有的,Redis 只是实现了这个算法并提供了一些开箱即用的 API。

Redis 提供的 HyperLogLog 占用空间非常非常小,只需要 12k 的空间就能存储接近2^64个不同元素。这是真的厉害,这就是数学的魅力么!并且,Redis 对 HyperLogLog 的存储结构做了优化,采用两种方式计数:

  • 稀疏矩阵:计数较少的时候,占用空间很小。
  • 稠密矩阵:计数达到某个阈值的时候,占用 12k 的空间。

Redis 官方文档中有对应的详细说明:

基数计数概率算法为了节省内存并不会直接存储元数据,而是通过一定的概率统计方法预估基数值(集合中包含元素的个数)。因此, HyperLogLog 的计数结果并不是一个精确值,存在一定的误差(标准误差为 0.81% )。

HyperLogLog 的使用非常简单,但原理非常复杂。HyperLogLog 的原理以及在 Redis 中的实现可以看这篇文章:HyperLogLog 算法的原理讲解以及 Redis 是如何应用它的open in new window

再推荐一个可以帮助理解 HyperLogLog 原理的工具:Sketch of the Day: HyperLogLog — Cornerstone of a Big Data Infrastructureopen in new window

除了 HyperLogLog 之外,Redis 还提供了其他的概率数据结构,对应的官方文档地址:https://redis.io/docs/data-types/probabilistic/open in new window 。

常用命令

HyperLogLog 相关的命令非常少,最常用的也就 3 个。

命令

介绍

PFADD key element1 element2 ...

添加一个或多个元素到 HyperLogLog 中

PFCOUNT key1 key2

获取一个或者多个 HyperLogLog 的唯一计数。

PFMERGE destkey sourcekey1 sourcekey2 ...

将多个 HyperLogLog 合并到 destkey 中,destkey 会结合多个源,算出对应的唯一计数。

HyperLogLog 基本操作演示

应用场景

数量量巨大(百万、千万级别以上)的计数场景

  • 举例:热门网站每日/每周/每月访问 ip 数统计、热门帖子 uv 统计、
  • 相关命令:PFADDPFCOUNT

Geospatial (地理位置)

介绍

Geospatial index(地理空间索引,简称 GEO) 主要用于存储地理位置信息,基于 Sorted Set 实现。

通过 GEO 我们可以轻松实现两个位置距离的计算、获取指定位置附近的元素等功能。

常用命令

命令

介绍

GEOADD key longitude1 latitude1 member1 ...

添加一个或多个元素对应的经纬度信息到 GEO 中

GEOPOS key member1 member2 ...

返回给定元素的经纬度信息

GEODIST key member1 member2 M/KM/FT/MI

返回两个给定元素之间的距离

GEORADIUS key longitude latitude radius distance

获取指定位置附近 distance 范围内的其他元素,支持 ASC(由近到远)、DESC(由远到近)、Count(数量) 等参数

GEORADIUSBYMEMBER key member radius distance

类似于 GEORADIUS 命令,只是参照的中心点是 GEO 中的元素

基本操作

通过 Redis 可视化工具查看 personLocation ,果不其然,底层就是 Sorted Set。

GEO 中存储的地理位置信息的经纬度数据通过 GeoHash 算法转换成了一个整数,这个整数作为 Sorted Set 的 score(权重参数)使用。

获取指定位置范围内的其他元素

GEORADIUS 命令的底层原理解析可以看看阿里的这篇文章:Redis 到底是怎么实现“附近的人”这个功能的呢?open in new window

移除元素

GEO 底层是 Sorted Set ,你可以对 GEO 使用 Sorted Set 相关的命令。

应用场景

需要管理使用地理空间数据的场景

  • 举例:附近的人。
  • 相关命令: GEOADDGEORADIUSGEORADIUSBYMEMBER

总结

数据类型

说明

Bitmap

你可以将 Bitmap 看作是一个存储二进制数字(0 和 1)的数组,数组中每个元素的下标叫做 offset(偏移量)。通过 Bitmap, 只需要一个 bit 位来表示某个元素对应的值或者状态,key 就是对应元素本身 。我们知道 8 个 bit 可以组成一个 byte,所以 Bitmap 本身会极大的节省储存空间。

HyperLogLog

Redis 提供的 HyperLogLog 占用空间非常非常小,只需要 12k 的空间就能存储接近2^64个不同元素。不过,HyperLogLog 的计数结果并不是一个精确值,存在一定的误差(标准误差为 0.81% )。

Geospatial index

Geospatial index(地理空间索引,简称 GEO) 主要用于存储地理位置信息,基于 Sorted Set 实现。

参考

  • Redis Data Structures:https://redis.com/redis-enterprise/data-structures/open in new window 。
  • 《Redis 深度历险:核心原理与应用实践》1.6 四两拨千斤——HyperLogLog
  • 布隆过滤器,位图,HyperLogLog:https://hogwartsrico.github.io/2020/06/08/BloomFilter-HyperLogLog-BitMap/index.htmlopen in new window
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-06-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 常用命令
  • 应用场景
  • HyperLogLog(基数统计)
    • 介绍
      • 常用命令
        • 应用场景
        • Geospatial (地理位置)
          • 介绍
            • 常用命令
              • 应用场景
              • 总结
              • 参考
              相关产品与服务
              对象存储
              对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档