Redis中的Bitmap如何使用


在日常开发过程中,经常会有一些 bool 类型数据需要存取。比如记录用户一年内签到的次数,签了是 1,没签是 0。如果使用 key-value 来存储,那么每个用户都要记录 365 次,当用户成百上亿时,需要的存储空间将非常巨大。解决这个问题,可以使用redis中的位图。

位图(bitmap)同样属于 string 数据类型。Redis 中一个字符串类型的值最多能存储 512 MB 的内容,每个字符串由多个字节组成,每个字节又由 8 个 Bit 位组成。位图结构正是使用“位”来实现存储的,它通过将比特位设置为 0 或 1来达到数据存取的目的,这大大增加了 value 存储数量,它存储上限为2^32。

位图本质上就是一个普通的字节串,也就是 bytes 数组。可以通过使用 getbit/setbit 命令处理该位图数组,其结构如下所示:

Redis中的Bitmap如何使用

位图通常用于一些特定应用,例如跟踪用户签到次数或登录次数。上图是表示一位用户 10 天内来网站的签到次数,1 代表签到,0 代表未签到,这样可以很轻松地统计出用户的活跃程度。使用位图记录每一条记录仅占用一个 bit 位,相对于直接使用字符串,大大减少了内存空间的使用率。

Redis 官方也做了一个实验,他们模拟了一个拥有 1 亿 2 千 8 百万用户的系统,然后使用 Redis 的位图来统计“日均用户数量”,最终所用时间的约为 50ms,且仅仅占用 16 MB内存。

位图应用原理

如果使用字符串类型存储,某个网站必须要记录一个用户一年的签到记录,那么需要 365 个键值对。若使用位图存储,用户签到就存 1,否则存 0。最后会生成 00010101… 这样的存储结果,其中每天的记录只占一位,一年就是 365 位,约为 46 个字节。如果只想统计用户签到的天数,那么统计 1 的个数即可。

位图操作的优势,相比于字符串而言,它不仅效率高,而且还非常的节省空间。

Redis 的位数组是自动扩展的,如果设置了某个偏移位置超出了现有的内容范围,位数组就会自动扩充。

位图常用命令

1) SETBIT命令

用来设置或者清除某一位上的值,其返回值是原来位上存储的值。key 在初始状态下所有的位都为 0 ,示例如下:

SETBIT key offset value

其中 offset 表示偏移量,从 0 开始。示例如下:

127.0.0.1:6379> SET user:1 a
OK
#设置偏移量offset为0
127.0.0.1:6379> SETBIT user:1 0 1
(integer) 0
#当对应位的字符是不可打印字符,redis会以16进制形式显示
127.0.0.1:6379> GET user:1
"\xe1"

2) GETBIT命令

用来获取某一位上的值。示例如下:

127.0.0.1:6379> GETBIT user:1 0
(integer) 1

当偏移量 offset 比字符串的长度大,或者当 key 不存在时,返回 0。

redis> EXISTS bits
(integer) 0
redis> GETBIT bits 100000
(integer) 0

3) BITCOUNT命令

统计指定位区间上,值为 1 的个数。语法格式如下:

易森网络企业版 易森网络企业版

如果您是新用户,请直接将本程序的所有文件上传在任一文件夹下,Rewrite 目录下放置了伪静态规则和筛选器,可将规则添加进IIS,即可正常使用,不用进行任何设置;(可修改图片等)默认的管理员用户名、密码和验证码都是:yeesen系统默认关闭,请上传后登陆后台点击“核心管理”里操作如下:进入“配置管理”中的&ld

易森网络企业版 0 查看详情 易森网络企业版
BITCOUNT key [start end]

示例如下:

127.0.0.1:6379> BITCOUNT user:1
(integer) 8

只需指定 start 和 end 参数,即可仅对特定字节进行计数。start 和 end 参数和 GETRANGE 命令的参数类似,都可以使用负数,比如 -1 表示倒数第一个位, -2 表示倒数第二个位。.

4)Redis Bitop 命令

对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上

操作可以为四种中的任意一种:AND、OR、NOT、XOR

  • BITOP AND destkey key [key …] ,对一个或多个 key 求逻辑并,并将结果保存到 destkey 。

  • BITOP OR destkey key [key …] ,对一个或多个 key 求逻辑或,并将结果保存到 - destkey 。

  • BITOP XOR destkey key [key …] ,对一个或多个 key 求逻辑异或,并将结果保存到 destkey 。

  • BITOP NOT destkey key ,对给定 key 求逻辑非,并将结果保存到 destkey 。

除了 NOT 操作之外,其他操作都可以接受一个或多个 key 作为输入。

场景

统计当日活跃用户

每日活跃统计创建一个bitmap键,当用户活跃了根据用户id的偏移量来设置
对应的位为1

用户签到

每个用户创建一个位图的键,以某一天为基础,之后的天数距离这一天的天数为偏移量,
如果用户点击了签到,则设置对用的偏移位为1。

以上就是Redis中的Bitmap如何使用的详细内容,更多请关注其它相关文章!


# 都是  # 赤峰seo公司推荐10火星  # 来凤网站推广哪家好  # 建设网站的主题  # 电商网站怎么推广产品  # 上饶网络营销推广怎么做  # 采摘园营销推广  # 营销宝自助推广在哪里找  # 莘县响应式网站建设  # 陕西西安抖音推广营销  # 企业免费网站优化价格  # redis  # 如何实现  # 网络带宽  # 创建一个  # 约为  # 可以使用  # 如何使用  # 偏移量  # 并将  # 多个  # bitmap 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 《大学搜题酱》官网地址登录  《真我》申请退款方法  汽车之家网页版免费登录_汽车之家官网首页直接进入  12306不能订票的时间段是固定的吗? | 节假日购票时间有无变化  Lar*el Eloquent:高效删除多对多关系中无关联子记录的父模型  自定义你的VS Code状态栏,监控关键信息  三角洲行动2025年9月10日摩斯密码分享  抖音赚钱快速入门_新手必看的抖音赚钱步骤  如何在mysql中设计餐饮点餐系统_mysql点餐系统项目实战  CSS绝对定位与溢出控制:实现背景元素局部显示不触发滚动条  《原神》月之一版本新增书籍一览  Win10共享文件夹设置方法 Win10局域网文件共享全攻略【教程】  基于 Flink 和 Kafka 实现高效流处理:连续查询与时间窗口  J*aScript文本高亮功能优化:解决多词匹配错误与精确分割策略  优化 WooCommerce 产品价格显示与自定义短代码集成  解决jQuery多计算器输入字段冲突的教程  学习通网页版课程打不开_课程无法访问时的解决方法  iPhone17Pro如何连接蓝牙耳机_iPhone17Pro蓝牙设备配对与连接方法介绍  风神瞳获取全攻略  Sublime怎么格式化HTML代码_Sublime前端代码美化插件使用指南  哈尔滨城市通昵称修改方法  《健康大兴》注册方法介绍  c++如何使用std::thread::join和detach_c++线程生命周期管理  《蓝色星原:旅谣》坐骑获取攻略  我的世界官方网址入口 我的世界游戏主页直达入口  抖音手机分身两个账号怎么切换?分身两个系统是一样的吗?  sublime如何配置PHP开发环境_在sublime中运行与调试PHP代码  《饿了么》拼好饭点外卖教程2025  J*aScript:从子元素中批量移除特定CSS类  《爱南宁》认证电动车方法  键盘测试软件哪个好_键盘故障检测工具推荐  C#中的Record类型有什么优势?C# 9新特性Record与Class的用法区别  感染了幽门螺杆菌一定会导致胃癌吗?蚂蚁庄园今日答案最新11.30  c++类和对象到底是什么_c++面向对象编程基础  mysql中如何配置字符集和排序规则_mysql字符集排序配置  C++中std::thread和std::async的区别_C++并发编程与线程与异步任务比较  研招网官方网站招生平台入口_中国研究生招生信息网官网登录  mysql如何限制远程访问_mysql远程访问限制方法  《杖剑传说》食谱大全  C++ static关键字作用_C++静态成员变量与静态函数  mysql镜像配置如何设置用户权限组_mysql镜像配置用户组与权限分级管理方法  歌词怎么展示在|直播|间视频号?有什么注意事项?  J*aScript对象中深度嵌套URL键的查找与更新策略  抖音如何进行蓝V认证 抖音企业号申请所需资料与流程  《爱笔思画x》涂色教程  《宝可梦大集结》S4冠军之路开始时间介绍  猫眼电影app怎么查询电影院的营业时间_猫眼电影影院营业时间查询教程  微博网页版访问入口 微博网页版网页端使用指南  解决J*aScript动态图片上传中ID重复问题:在同一页面显示多张独立图片  如何在CSS中实现盒模型多列间距_grid-gap与padding结合 

 2023-05-31

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.