关于 redis bitmap 的疑问

2021-12-30 15:56:38 +08:00
 Gaussen

虽然 redis 使用了很久,但是很惭愧的是一直以来都只是使用了 string 类型,而且也没有特别看过 redis 的知识,最近正好在看,然后对 bitmap 这个类型有一些疑问。

网上有很多举出 bitmap 的使用场景的博客,大多是统计日活,用户在线数等场景。

不过有一些疑问,如果仅仅只是统计登录数似乎用 bitmap 确实很不错,但是如果要统计具体某些用户登录了,就变得很不方便了。

例如:setbit userOnlineCount20211230 1 1 ... 如果仅仅统计今天有多少用户登录过,似乎一个 bitcount userOnlineCount20211230 就足够了,但是若想知道今天到底有哪些用户登录过,就无法直接实现了。能想到的似乎只能循环 getbit userOnlineCount20211230 offset ,但这样做太离谱了。

所以如果是用 bitmap 的情况下,是不是就无法实现上述的需求?即在能统计出数量的前提下,还能不使用遍历的做法实现查出所有登录用户的 id 。

2726 次点击
所在节点    Redis
10 条回复
leesam1024
2021-12-30 17:24:30 +08:00
bitmap 底层就是 string 。
可以直接 get 。返回 string 后,自己在内存里遍历一下就行
klakekent
2021-12-30 17:57:33 +08:00
那如果用户 id 是 string 比如 uuid 这样的 是不是 bitmap 就不适用了?
MidGap
2021-12-30 20:10:58 +08:00
如果你的用户 id 很长,你有算过 bitmap 占多少内存吗
des
2021-12-30 21:40:26 +08:00
如果只需要个数字,而且不需要非常精确 HyperLogLog 就够用了
bigwhite2021
2021-12-31 01:29:54 +08:00
是否可以维护一个 id 到 id 序号的映射,然后将 id 序号转成 bitmap ,每次取的时候先取 bitmap ,然后映射回真实 id ?
WriteCloser
2021-12-31 10:34:56 +08:00
不能
mreasonyang
2021-12-31 13:29:42 +08:00
这个场景在现在这个年代更适合用 flink 聚合成维表,目标数据源可以是 Doris/Druid 这类 OLAP 组件
liuhuan475
2021-12-31 16:05:04 +08:00
@leesam1024 能 get 出来算我输
leesam1024
2023-11-05 10:30:52 +08:00
@liuhuan475 你试试再说
liuhuan475
2023-11-06 11:37:41 +08:00
@leesam1024 bitmap 最大存储是 512M ,大小是根据最大索相关,比如说在第 1 个索引上设置 true ,占用内存大小是 1;在 1 百万设置索引位置设置 true ,占用内存大小就是 1 百万。如果你的最大索引足够大,占用的内存也足够大。get 请求会把 redis 带宽打满的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/825331

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX