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

相关推荐
Zixhy5 分钟前
手撕Reactor模型实现同步高并发服务器及Muduo网络库深入解析
linux·服务器·网络·数据库·c++
傻啦嘿哟6 小时前
某招聘平台爬虫:爬取招聘岗位数据,分析各城市薪资水平
开发语言·爬虫·python
2501_933670796 小时前
2026秋招量化分析岗技能栈:Python、SQL、统计建模、回测项目怎么准备
开发语言·python·sql
2601_962077607 小时前
python Dejavu库快速识别音频指纹实例探究
python·音乐识别·dejavu库·音频指纹识别·实例探究
科技苑7 小时前
如何用Python编程实现一个简单的Web爬虫?
人工智能·python
程序员清风7 小时前
Java 后端高并发设计:线程池、限流、熔断与降级
java·数据库·oracle
天衍四九-7 小时前
MySQL中如何定位慢查询?如果SQL语句执行很慢,如何分析和优化?
数据库·sql·mysql
dayDayupbetter8 小时前
Visual C++ 2010安装与使用高手秘籍
python
隐擎fox8 小时前
深入理解网络传输层安全:TLS 指纹识别(JA3/JA4)原理与 Python 协议层检测实战
爬虫·python·网络协议·安全·网络安全·https
尚久龙8 小时前
mysql-5.7.26-winx64的安装步骤
数据库·mysql