虽然 redis 使用了很久,但是很惭愧的是一直以来都只是使用了 string 类型,而且也没有特别看过 redis 的知识,最近正好在看,然后对 bitmap 这个类型有一些疑问。
网上有很多举出 bitmap 的使用场景的博客,大多是统计日活,用户在线数等场景。
不过有一些疑问,如果仅仅只是统计登录数似乎用 bitmap 确实很不错,但是如果要统计具体某些用户登录了,就变得很不方便了。
例如:setbit userOnlineCount20211230 1 1 ... 如果仅仅统计今天有多少用户登录过,似乎一个 bitcount userOnlineCount20211230 就足够了,但是若想知道今天到底有哪些用户登录过,就无法直接实现了。能想到的似乎只能循环 getbit userOnlineCount20211230 offset ,但这样做太离谱了。
所以如果是用 bitmap 的情况下,是不是就无法实现上述的需求?即在能统计出数量的前提下,还能不使用遍历的做法实现查出所有登录用户的 id 。
1
leesam1024 2021-12-30 17:24:30 +08:00
bitmap 底层就是 string 。
可以直接 get 。返回 string 后,自己在内存里遍历一下就行 |
2
klakekent 2021-12-30 17:57:33 +08:00
那如果用户 id 是 string 比如 uuid 这样的 是不是 bitmap 就不适用了?
|
3
MidGap 2021-12-30 20:10:58 +08:00
如果你的用户 id 很长,你有算过 bitmap 占多少内存吗
|
4
des 2021-12-30 21:40:26 +08:00 via iPhone
如果只需要个数字,而且不需要非常精确 HyperLogLog 就够用了
|
5
bigwhite2021 2021-12-31 01:29:54 +08:00 via iPhone
是否可以维护一个 id 到 id 序号的映射,然后将 id 序号转成 bitmap ,每次取的时候先取 bitmap ,然后映射回真实 id ?
|
6
WriteCloser 2021-12-31 10:34:56 +08:00
不能
|
7
mreasonyang 2021-12-31 13:29:42 +08:00
这个场景在现在这个年代更适合用 flink 聚合成维表,目标数据源可以是 Doris/Druid 这类 OLAP 组件
|
8
liuhuan475 2021-12-31 16:05:04 +08:00
@leesam1024 能 get 出来算我输
|
9
leesam1024 2023-11-05 10:30:52 +08:00
@liuhuan475 你试试再说
|
10
liuhuan475 2023-11-06 11:37:41 +08:00
@leesam1024 bitmap 最大存储是 512M ,大小是根据最大索相关,比如说在第 1 个索引上设置 true ,占用内存大小是 1;在 1 百万设置索引位置设置 true ,占用内存大小就是 1 百万。如果你的最大索引足够大,占用的内存也足够大。get 请求会把 redis 带宽打满的
|