Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Redis特殊数据结构 - Java技术债务

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

作者头像
Java技术债务
发布于 2024-06-21 09:04:55
发布于 2024-06-21 09:04:55
13300
代码可运行
举报
文章被收录于专栏:Java技术债务Java技术债务
运行总次数:0
代码可运行

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 基本操作演示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# SETBIT 会返回之前位的值(默认是 0)这里会生成 7 个位
> SETBIT mykey 7 1
(integer) 0
> SETBIT mykey 7 0
(integer) 1
> GETBIT mykey 7
(integer) 0
> SETBIT mykey 6 1
(integer) 0
> SETBIT mykey 8 1
(integer) 0
# 通过 bitcount 统计被被设置为 1 的位的数量。
> BITCOUNT mykey
(integer) 2

应用场景

需要保存状态信息(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 基本操作演示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> PFADD hll foo bar zap
(integer) 1
> PFADD hll zap zap zap
(integer) 0
> PFADD hll foo bar
(integer) 0
> PFCOUNT hll
(integer) 3
> PFADD some-other-hll 1 2 3
(integer) 1
> PFCOUNT hll some-other-hll
(integer) 6
> PFMERGE desthll hll some-other-hll
"OK"
> PFCOUNT desthll
(integer) 6

应用场景

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

  • 举例:热门网站每日/每周/每月访问 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 中的元素

基本操作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> GEOADD personLocation 116.33 39.89 user1 116.34 39.90 user2 116.35 39.88 user3
3
> GEOPOS personLocation user1
116.3299986720085144
39.89000061669732844
> GEODIST personLocation user1 user2 km
1.4018

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> GEORADIUS personLocation 116.33 39.87 3 km
user3
user1
> GEORADIUS personLocation 116.33 39.87 2 km
> GEORADIUS personLocation 116.33 39.87 5 km
user3
user1
user2
> GEORADIUSBYMEMBER personLocation user1 5 km
user3
user1
user2
> GEORADIUSBYMEMBER personLocation user1 2 km
user1
user2

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

移除元素

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> ZREM personLocation user1
1
> ZRANGE personLocation 0 -1
user3
user2
> ZSCORE personLocation user2
4069879562983946

应用场景

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

  • 举例:附近的人。
  • 相关命令: 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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Redis 的 3 个高级数据结构
来源:https://www.jianshu.com/p/87a576d29d4b
芋道源码
2019/10/29
5670
Redis 的 3 个高级数据结构
深入浅出Redis(十一):Geosptial、Hypeloglog、Bitmap、Bloom Filter布隆过滤器
Redis提供丰富的数据结构来解决各种场景下的问题,前段时间的一篇文章深入浅出Redis(一):对象与数据结构已经深入浅出的说明Redis中的常用基础对象与数据结构
菜菜的后端私房菜
2024/09/20
4230
【Redis 系列】redis 学习五,多学习一些 redis 的三种特殊数据类型
返回一个或者多个GEOHASH 表示的元素, 返回 11 个字符 Geohash 字符串
阿兵云原生
2023/02/16
2960
Redis 新数据类型
命令大小写都可以,如果你只想单纯看 API,不想看例子,请移到最下面的 指令总结。
用户9615083
2022/12/25
6660
【Redis基础】Redis新数据类型(Bitmaps,HyperLoglog,Geospatial)命令简介与案例演示
Bitmaps 并不是实际的数据类型,而是定义在String类型上的一个面向字节操作的集合。因为字符串是二进制安全的块,他们的最大长度是512M,最适合设置成2^32个不同字节。 bitmaps的位操作分成两类:1.固定时间的单个位操作,比如把String的某个位设置为1或者0,或者获取某个位上的值 2.对于一组位的操作,对给定的bit范围内,统计设定值为1的数目(比如人口统计)。 bitmaps最大的优势是在存储数据时可以极大的节省空间,比如在一个项目中采用自增长的id来标识用户,就可以仅用512M的内存来记录40亿用户的信息(比如用户是否希望收到新的通知,用1和0标识)
小尘要自信
2023/10/10
3450
【C#与Redis】--Redis 数据结构
Redis(Remote Dictionary Server)是一个开源的内存数据存储系统,可以用作数据库、缓存和消息中间件。它支持多种数据结构,使其在不同场景下都能发挥作用。以下是一些常见的Redis数据结构:
喵叔
2023/12/24
3690
你说啥?Redis中除了五大数据类型,还有特殊数据类型!
可以用于基于地理位置的业务场景。比如:查询两地之间的距离,方圆几里存在的地理位置等等。
爪哇缪斯
2023/05/10
2590
你说啥?Redis中除了五大数据类型,还有特殊数据类型!
Redis系列:Redis的数据结构
Redis 的基本数据类型包括:二进制安全字符串 String、Hashes(哈希)、Lists 列表、Sets 集合 和 Sorted sets 有序集合;
栗筝i
2022/12/01
4660
Redis源码阅读(一)总体概览
”昨夜西风凋碧树。独上高楼,望尽天涯路”,我们先从Redis的特性、用途及数据类型这几个方面介绍下Redis,对其有个总体上的认知。
星沉
2022/01/28
8530
【Redis】005-Redis三大特殊数据类型:geospatial地理位置、HyperLogLog基数统计、Bitmaps位图
将指定的地理空间位置(纬度、经度、名称)添加到指定的key中。这些数据将会存储到sorted set这样的目的是为了方便使用GEORADIUS或者GEORADIUSBYMEMBER命令对数据进行半径查询等操作;
訾博ZiBo
2025/01/06
1610
【Redis】005-Redis三大特殊数据类型:geospatial地理位置、HyperLogLog基数统计、Bitmaps位图
Redis6发布订阅及Redis新数据类型
Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息
大忽悠爱学习
2021/11/15
5610
6.Redis新数据类型
现代计算机用二进制(位) 作为信息的基础单位, 1个字节等于8位, 例如“abc”字符串是由3个字节组成, 但实际在计算机存储时将其用二进制表示, “abc”分别对应的ASCII码分别是97、 98、 99, 对应的二进制分别是01100001、 01100010和01100011,如下图
一个风轻云淡
2022/11/13
3320
6.Redis新数据类型
【Redis】Redis 高级数据类型Bitmaps、HyperLogLog、GEO
对于bitmap,我们取值的时候,需要知道bit的位置,改值的时候,需要知道位置和修改结果。取值和修改的操作变得复杂了一些,但是节省了存储空间,属于时间换空间。其实redis并没有提供bitmap这种数据类型,只是提供了对string类型操作bit的接口
终有救赎
2023/10/24
2910
【Redis】Redis 高级数据类型Bitmaps、HyperLogLog、GEO
七天玩转Redis | Day3、Redis地理位置、基数统计、位图场景使用详解
博主简介👨🏼‍⚕️:国内某一线互联网公司Java工程师👨🏼‍💻,业余自媒体创作者💻,CSDN博客专家🏆,Java领域优质创作者📕,华为云享专家🥇,华为HDZ核心成员👨‍💼,曾发表并出版ISEAE信息科学国际论文,全网累计发表技术博客60余万字📒,公众号【码猿编程日记】作者,坚信每一次敲动键盘都能让生活变得更智能,世界变得更有趣! 课前答疑:很多小伙伴问我零基础或者根本没有使用过Redis,可以学习嘛?当然是可以的!充分考虑到小伙伴们的学习程度有所不同,所以本次课程的所有操作都是在Windows环境下进行
灰小猿
2022/05/05
4870
七天玩转Redis | Day3、Redis地理位置、基数统计、位图场景使用详解
Redis 中的 3 种特殊数据类型
Redis 中除开最常用的 5 种数据类型之外,还有 3 种特殊的数据类型,他们是:
村雨遥
2020/09/11
7640
【Redis】四大特殊的数据类型之 HyperLogLog
我们都知道 Redis 提供了丰富的数据类型,特殊的有四种:BitMap、HyperLogLog、Geospatial、Stream。
sidiot
2023/08/31
4360
你知道redis提供的其他功能吗?快来看看吧!
1. 字符串类型1.1 常用APISET key value //存入...
友儿
2022/09/11
4330
分布式之redis的三大衍生数据结构
说起redis的数据结构,大家可能对五大基础数据类型比较熟悉:String,Hash,List,Set,Sorted Set。那么除此之外,还有三大衍生数据结构,大家平时是很少接触的,即:bitmaps、hyperloglog、geo 另外,我觉得,这三个数据结构,只能说是锦上添花。真正在项目中,我还真没用过。 下面大家来看看这三大数据结构的定义和用途
Java_老男孩
2019/12/02
5210
redis慢查询、pipeline、发布订阅、Bitmap、HyperLogLog、GEO
Redis的pipeline(管道)功能在命令行中没有,但redis是支持pipeline的,而且在各个语言版的client中都有相应的实现
GH
2020/04/09
6400
Redis三种特殊类型
朋友的定位, 附近的人, 打车的距离计算 Redis的Geo在Redis3.2版本就推出了.这个功能可以推算地理位置信息, 两地之间的距离, 方圆几里的人 首先需要一个城市经度纬度查询工具 自行百度搜索
后端码匠
2021/01/20
6990
推荐阅读
相关推荐
Redis 的 3 个高级数据结构
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验