当前位置: 首页 > news >正文

Redis实战(4)-- BitMap结构与使用

假设一个场景:

当业务需要进行存储不同用户是否进行访问过当前页面时候

可以使用一个hash进行存储,键存储访问时间,值存储对应用户编号;

但是这样会有个问题,大量的hash使用导致所消耗存储空间会很大。

所以这时候可以使用BitMaps进行存储,可以将键设置为访问时间,值设置为对应数组位置上的值,如:

Setbit  2022-9-27  3  1

//具体存储值是(32个位)....000000100  表示3号id用户访问过,这样可以一个二进制位置数组(获取对应的getbit)

BitMaps实现原理

其实现是使用用int字节码的每一位表示一个数字一个int占32位,可以表示32个数据状态,那么由此可以使用一个Int数组进行标识不同数据的状态:

对应映射关系如图:

tmp[0]可以表示0-31

Tmp[1]可以表示32-63

Tmp[2]可以表示64-95.....以此类推

优点:很大程度节省空间

例如:有5000万用户日活的平台,需要记录当前用户是否登录过

使用集合:id -- long型 (64位) 则存储所需空间为 8*50 000 000 = 400M(每天)

使用bitmaps: 1位存一个用户状态,则需要 1/8 * 50 000 000 = 12.5M

实际使用场景:

当需要进行存储数据状态,而且状态就两种情况下,使用bitmaps进行可以优化存储开销。

常见面试题:

第一题:在限制条件下,可以使用bitmap进行存储,因为一个int类型32位即可以标识32个成员,很大程度上节省空间,所以使用int[]数组进行存储标识哪个自然数出现,且其对应的位置肯定是有序的。

第二题:因为每条URL平均64字节,所以可以转为固定64位长度数值,作为bitmap索引,在哪一位就标识哪个URL,这样只需要计算出对应的URL的64位长度数值即可依据HASH函数算出对应的bitmap中索引位,如果为1标识存在,为0标识不存在。

第三题:可以使用bitmap进行标识,采用用户ID+时间戳进行转化为BitMap的唯一索引,通过hash函数运算,计算出对应的二进制标识位,查看,1为登录过,0为不活跃。

第五题:黑名单标识位为1,白名单标识位为0。

第六题:可以进行黑名单校验,URL黑名单进行拦截这样的,可以使用BitMap实现,经过hash计算后对应标识位值为1则为黑名单拦截,需要进行磁盘精准校验,同时也要考虑哈希冲突的情况处理,0则为正常通过无需校验,可以有效避免无效IO。

http://www.dtcms.com/a/308383.html

相关文章:

  • uvicorn 启动重复加载 多次加载
  • 【LeetCode 热题 100】4. 寻找两个正序数组的中位数——(解法一)线性扫描
  • C++(模板)
  • java笔记——ConcurrentLinkedQueue
  • AUTOSAR进阶图解==>AUTOSAR_SRS_FunctionInhibitionManager
  • axios封装对比
  • 记录自己使用gitee和jenkins
  • PHP反序列化学习+解析+复现
  • 提升Windows操作效率:三款实用辅助工具功能解析​
  • 代码随想录Day35:动态规划(背包问题 二维 一维、分割等和子集)
  • Spring Boot整合MyBatis-Plus全攻略
  • 如何监控项目的每个阶段,提高执行效率
  • SchemaCrawler:一款免费开源的数据库文档工具
  • 斐波那契数
  • AI学习笔记三十三:基于Opencv的单目标跟踪
  • OpenCSG月度更新2025.7
  • leecode18 四数之和
  • 个股期权合约期内遇到标的停牌,如何处置?
  • DoRA详解:从LoRA到权重分解的进化
  • Redis线程模型讨论
  • 修改VSCode远程SSH的PATH
  • JVM字节码文件结构剖析
  • JVM学习日记(十二)Day12
  • 解释 MySQL 中的 EXPLAIN 命令的作用和使用场景
  • 格雷希尔G25F系列电气端口快速封堵接头,解决电池包、电机控制器等壳体的气密性测试难题,提升效率与可靠性,助力新能源汽车生产。
  • ARM--中断
  • 三坐标测量仪攻克深孔检测!破解新能源汽车阀体阀孔测量难题
  • 雷霆战机游戏代码
  • ABS系统专用磁阻式汽车轮速传感器
  • 建设公司如何优化梳理部门职责,提高运作效率?