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助手,依托大模型,帮助用户记录、整理和分析音视频内容,体验用大模型做音视频笔记、整理会议记录。

相关推荐
java资料站1 分钟前
十一、评估测试
开发语言·人工智能·python
白帽攻防录9 分钟前
SRC 挖洞:Roundcube 预认证 SQL 注入深度复盘,CVE-2026-48842 preg_replace 转义绕过怎么打穿邮件系统
网络·数据库·sql·网络安全·sql注入
szial11 分钟前
网络爬虫与 CDP 实战(二):浏览器能访问,Python 却被拒绝?拆开登录态与 CSRF
爬虫·python·csrf
꯭自꯭闭꯭36 分钟前
达梦SQL优化相关
linux·运维·数据库·sql
对空六课1 小时前
支持注意力分析的热力图工具有哪些?
前端·数据库·数据分析
青少儿编程课堂1 小时前
后缀自动机解析:本质不同子串与最长重复片段统计
c++·python·算法·bfs·信息学竞赛
南京码讯光电技术有限公司1 小时前
How to Design an Antenna System for an Industrial WiFi Module
数据库·人工智能
怕浪猫2 小时前
LLM 面试必问的 8 个问题,答不上来直接淘汰
人工智能·python·面试
lusklusklusk2 小时前
Oracle数据库基础之2_体系结构
数据库·oracle
老歌老听老掉牙2 小时前
从三维旋转的深度解析到Python实现:绕任意轴旋转的奥秘
python·三维旋转