redis中bitmap应用

原理介绍

Redis Bitmap 是 Redis 中的一种数据结构,它类似于位图,可以用来表示一组二进制位,每个二进制位只能是 0 或 1。Redis Bitmap 提供了一些操作命令,如 SETBIT、GETBIT、BITCOUNT 等,可以对位图进行设置、获取和计数等操作。

在Redis 中,可以把Bitmaps想象成一个以比特位为单位的数组,数组的每个单元只能存储0和1,数组的下标在Bitmaps 中叫做偏移量。

BitMap 在 Redis 中并不是一个新的数据类型,其底层是 Redis 实现。Redis 其实只支持 5 种数据类型,并没有 BitMap 这种类型,BitMap 底层是基于 Redis 的字符串类型实现的。

BitMap占用的空间,就是底层字符串占用的空间。假如BitMap偏移量的最大值是OFFSET_MAX,那么它底层占用的空间就是︰

8*1024*1024*512 = 2^32

由于C语言中字符串的末尾都要存储一位分隔符,所以实际上BitMap的offset值上限是︰

2^32-1

适用场景

  1. 用户在线状态:可以使用一个位图来表示用户的在线状态,每个用户对应一个二进制位,如果该位为 1,则表示该用户在线;如果该位为 0,则表示该用户离线。通过 SETBIT 命令可以将某个用户的在线状态设置为 1 或 0,通过 BITCOUNT 命令可以统计在线用户的数量。

  2. 签到系统:可以使用一个位图来表示用户的签到情况,每个二进制位表示一天,如果该位为 1,则表示该用户在该天签到过;如果该位为 0,则表示该用户在该天未签到。通过 SETBIT 命令可以将某个用户在某天的签到状态设置为 1,通过 BITCOUNT 命令可以统计某个用户累计签到的天数。

  3. 统计 UV 和 PV:可以使用一个位图来表示用户的访问情况,每个二进制位表示一天,如果该位为 1,则表示该天有用户访问过网站;如果该位为 0,则表示该天没有用户访问过网站。通过 SETBIT 命令可以将某个用户在某天的访问状态设置为 1,通过 BITCOUNT 命令可以统计某段时间内的 UV 和 PV 数量。

  4. 过滤器:可以使用一个位图来表示一组元素的存在情况,每个二进制位表示一个元素,如果该位为 1,则表示该元素存在;如果该位为 0,则表示该元素不存在。通过 SETBIT 命令可以将某个元素的存在状态设置为 1,通过 GETBIT 命令可以查询某个元素是否存在。

  5. 统计活跃用户:使用日期key,用户ID为offset,当日活跃就设置为1。可统计连续多天登录等情况。

相关推荐
考虑考虑5 小时前
JDK26中的Map.ofLazy
java·后端·java ee
鶴哥只手遮天9 小时前
Spring AI 2.0.1 深度解析-第 14 章 MCP 服务端(上):注解式实现与工具来源
java·人工智能·开源
鶴哥只手遮天9 小时前
Spring AI 2.0.1 深度解析-第 15 章 MCP 服务端(下):三种协议形态、Streamable 传输与状态管理
java·人工智能·开源
鶴哥只手遮天9 小时前
Spring AI 2.0.1 深度解析-第 16 章 向量存储(上):`VectorStore` 接口体系、`BatchingStrategy`
java·人工智能·开源
鶴哥只手遮天9 小时前
Spring AI 2.0.1 深度解析-第 12 章 工具循环的流式形态、Usage 累加与扩展体系
java·人工智能·开源
鶴哥只手遮天9 小时前
Spring AI 2.0.1 深度解析-第 23 章 模型供应商实现:从 `OpenAiSetup` 到 Bedrock
java·人工智能·开源
鶴哥只手遮天9 小时前
Spring AI 2.0.1 深度解析-第 06 章 内置 Advisor 全景:13 个实现逐个剖到源码级
java·人工智能·开源
鶴哥只手遮天9 小时前
Spring AI 2.0.1 深度解析-第 03 章 消息体系与 Prompt:不可变模型、`ChatOptions` 与模板渲染
java·人工智能·开源
鶴哥只手遮天9 小时前
Spring AI 2.0.1 深度解析-第 24 章 生产实践与 2.x 迁移:陷阱清单、AOT 与调优
java·人工智能·开源
鶴哥只手遮天9 小时前
Spring AI 2.0.1 深度解析-第 10 章 工具调用(中):执行链路、结果转换与工具限制
java·人工智能·开源