Redis如何利用位图快速判断数据存在性

用 SETBIT 和 GETBIT 做存在性判断最直接:SETBIT 设定位为 1,GETBIT 查该位是否为 1,O(1) 时间、极省空间;不可用 BITCOUNT 替代,不支持三态,需确保 ID 到偏移量映射一致。用 SETBIT 和 GETBIT 做存在性判断最直接Redis 位图(Bitmap)本质是字符串的底层操作,SETBIT 把某一位设为 1,GETBIT 查某一位是否为 1------这比存完整 key 更省空间,也比用 EXISTS 查 key 是否存在更快(尤其在海量稀疏数据场景下)。但注意:位图不自动扩容,SETBIT 写入超出当前长度的位置会自动补零,而 GETBIT 查询未写过的位默认返回 0。适合判断"某 ID 是否被标记过",比如用户签到、设备在线状态、风控黑名单 ID不要用它查"值是多少",位图只存 0/1,没有中间态SETBIT user:sign:20240501 <uid> 1 中 <uid> 是整数偏移量,不是字符串 ID;如果原始 ID 是字符串,得先映射成唯一递增整数(比如用 INCR 或预分配 ID 段)单个字符串最大支持 232 位(约 512MB),超了会报错 ERR bit offset is not an integer or out of range别把 BITCOUNT 当存在性检查用BITCOUNT 统计 1 的个数,常被误用来"间接判断是否存在"------比如先 BITCOUNT 再看是否 > 0。这多了一次全量扫描,完全没必要。只要确认某一位是 1,就代表存在;查一位用 GETBIT 是 O(1),查全量是 O(N)。错误做法:BITCOUNT user:sign:20240501 然后判断结果是否非零正确做法:GETBIT user:sign:20240501 <uid>,返回 1 就存在,0 就不存在(注意:0 不代表"明确不存在",而是"没被设过 1")如果业务要求区分"从未设置"和"显式设为 0",位图做不到------它没有三态,只有 0 和 1,且未设置位默认读作 0用 BITOP AND 做交集判断时小心空 key想判断"用户是否在多个条件集合中都存在",比如"既签到又完成实名又通过风控",常用 BITOP AND dest k1 k2 k3 得到共同位,再 GETBIT dest uid。但只要任意一个源 key 不存在,BITOP 会把它当作全 0 字符串参与运算,结果可能全 0,导致误判。 通义听悟 阿里云通义听悟是聚焦音视频内容的工作学习AI助手,依托大模型,帮助用户记录、整理和分析音视频内容,体验用大模型做音视频笔记、整理会议记录。

相关推荐
代钦塔拉1 分钟前
Qt4 vs Qt5 带参数信号槽的连接方式详解
开发语言·数据库·qt
2401_846339561 分钟前
MySQL在云环境如何选择存储类型_SSD与高性能云盘配置建议
jvm·数据库·python
2601_9577808434 分钟前
Claude 4.6 对阵 GPT-5.4:2026 开发者大模型 API 选型深度解析
人工智能·python·gpt·ai·claude
2601_9577808434 分钟前
GPT-5.5 深度解析:2026年4月OpenAI旗舰模型的技术跨越与商业决策指南
大数据·人工智能·python·gpt·openai
zhaoyong2221 小时前
SQL如何统计每个用户的首次行为时间_MIN聚合与分组
jvm·数据库·python
2501_901006471 小时前
C#怎么实现配置热更新 C#如何在运行时动态刷新配置文件不需要重启程序【技巧】
jvm·数据库·python
m0_470857641 小时前
HTML怎么创建响应式图片备选方案_HTML srcset与sizes结构【详解】
jvm·数据库·python
lifewange1 小时前
PostgreSQL介绍
数据库·postgresql
oradh2 小时前
Oracle数据库中的Java概述
java·数据库·oracle·sql基础·oracle数据库java概述
2301_795099742 小时前
如何优化SQL中大批量数据的物理删除_分批次与间隔控制
jvm·数据库·python