bitmap数据结构

32位机器上的自然数一共有2的32次方约42亿个,如果用一个bit来存放一个整数,1代表存在,0代表不存在,那么把全部自然数存储在内存只要4294967296 / (8 * 1024 * 1024) = 512MB(8bit = 一个字节),而这些自然数存放在文件中,一行一个数字,1个整数4个字节,4*8*512MB需要16G的容量。可见,bitmap算法节约了非常多的空间。

ps:占内存 10bit

应用:

Bitmap不仅方便查询,还可以去除掉重复的整型数。

使用场景:

开发一个用户画像系统,实现用户信息的标签化。用户标签包含用户的社会属性,生活习惯,消费行为。

通过用户标签,实现多样的用户群体统计,统计用户的男女比例,统计喜欢旅游的用户数量等。

1. 建立用户名和用户ID的映射:  1->me   2->you  3->he

2.让每一个标签存储包含此标签的所有用户ID,每一个标签都是一个独立的Bitmap。

男[1,2]   女[3] 爱旅游[2]  程序员[1,2]

3. 这样,实现用户的去重和查询统计,就变得一目了然:

Bitmap在做交集和并集运算的时候也有极大的便利。位运算的高性能。

男性的程序员  110&110=110

不能做非运算,并不是除了1,2的其他都是女性,其实只有3是女性。除非提供一个全量的Bitmap,做异或即可。

一个很长的Bitmap里使用率低的话很浪费空间。

谷歌所实现的EWAHCompressedBitmap中,对存储空间做了优化:

com.googlecode.javaewah

JavaEWAH

1.1.0

redis 用setbit(bitmap)统计活跃用户

Redis支持对String类型的value进行基于二进制位的置位操作。通过将一个用户的id对应value上的一位,通过对活跃用户对应的位进行置位,就能够用一个value记录所有活跃用户的信息。如下图所未,下图中的bitmap有9个位被置为1,表示这9个位上对应的用户是今天的活跃用户。其中第15位表示uid为15的用户,第一位表示uid为0的用户。(如果你的uid不是从1开始的,比如从100000开始,实际上你也可以相应的用uid减去初始值来表示其位数,比如1000000用户对应到bitmap的第一位)

具体的代码类似下面这样:

redis.setbit(play:yyyy-mm-dd, user_id, 1)

这样一次记录的复杂度是O(1),在Redis中速度非常快。

mysql bitmap实现_bitmap原理和应用相关推荐

  1. mysql主从_MySQL主从原理及配置详解

    MySQL主从配置及原理,供大家参考,具体内容如下 一.环境选择: 1.Centos 6.5 2.MySQL 5.7 二.什么是MySQL主从复制 MySQL主从复制是其最重要的功能之一.主从复制是指 ...

  2. MySQL事务ACID实现原理

    照例,我们先来一个场景~ 面试官:"知道事务的四大特性么?" 你:"懂,ACID嘛,原子性(Atomicity).一致性(Consistency).隔离性(Isolati ...

  3. MySQL的MVCC底层原理二

    承接上文MySQL的MVCC底层原理 上文说到时序图中的第12步这篇文章咱接着聊完 时序图 图1 时序图第12步中的查询事务的read-view情况 图2 read-view为[100,200],30 ...

  4. MySQL的MVCC底层原理

    MySQL的MVCC底层原理 图1 这是一个account表 有id和name字段 图2 MySQL底层会给表添加2个字段 一个是trx id(事务id)一个是roll pointer(回滚指针) 事 ...

  5. mysql数据库ACID实现原理

    说到事物的四大特性原子性.一致性.隔离性.持久性,懂的人很多,但是稍微涉及细节,四大特性在数据库中的实现原理是怎么实现的?几乎很少有人能够答上来.所以这里着重讨论下mysql中的实现原理. 问题一:M ...

  6. 《深入理解分布式事务》第二章 MySQL 事务的实现原理

    shua# <深入理解分布式事务>第二章 MySQL 事务的实现原理 文章目录 一.Redo Log 1.Redo Log 基本概念 2.Redo Log 基本原理 3.Redo Log ...

  7. mysql+join的原理,Mysql连接join查询原理知识点

    Mysql连接join查询原理知识点 Mysql连接(join)查询 1.基本概念 将两个表的每一行,以"两两横向对接"的方式,所得到的所有行的结果. 假设: 表A有n1行,m1列 ...

  8. ntp同步 mysql_解析Mysql 主从同步延迟原理及解决方案

    MySQL的主从同步是一个很成熟的架构,优点为:①在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力;②在从主服务器进行备份,避免备份期间影响主服务器服务;③当主服务器出现问题时,可以 ...

  9. 深入解析Mysql 主从同步延迟原理及解决方案

    深入解析Mysql 主从同步延迟原理及解决方案 参考文章: (1)深入解析Mysql 主从同步延迟原理及解决方案 (2)https://www.cnblogs.com/fengff/p/1101170 ...

最新文章

  1. miniz库简介及使用
  2. 人工智能如何彻底改变全球物流和供应链管理
  3. servlet 初步 (四) session
  4. how to become a good teacher
  5. Redis 实战笔记
  6. oracle jet auto,如何启用sqlplus的AutoTrace功能
  7. RocketMQ入门到入土(二)事务消息顺序消息
  8. Cognos 增加全局类
  9. EXCHANGE 2003 恢复存储组的使用
  10. [转]在一个工程中添加别的工程的中已创建好的对话框资源。
  11. mysql varbinary 长度_mysql8 参考手册--BINARY和VARBINARY类型
  12. 真4k测试样片_用真4K看片是什么体验?半年没进电影院,却被夏普70B6UM惊艳到了...
  13. 一键获取喜马拉雅音频文件(Python3爬虫)
  14. 操作系统不等于 Linux,六问操作系统新时代 | 1024 程序员节
  15. Base64 混淆加密+迭代次数,Base64前后端加解密不一致、Base64 js加解密结果与java加解密结果不一致,Base64中文加密乱码
  16. MAP(Maximum A Posteriori,最大后验准则)算法
  17. 【MATLAB】plot和fplot的区别
  18. DDR3详解(以Micron MT41J128M8 1Gb DDR3 SDRAM为例)
  19. 【网路编程】网络基础知识(IP、子网掩码、网关等)概念概述
  20. Linux 命令和参数 英文全称

热门文章

  1. sudo命令,配置sudo不要密码
  2. 谈谈免费开源的知识产权话题
  3. Excel快速打印底端标题,教你一招,肯定行!
  4. 2020原生Android基础实用开发
  5. crowd counting——利用高斯核函数将坐标点转换为density map
  6. 经典 IP + Web3|蓝精灵官方游戏 The Smurfs‘ Society 带来全新体验
  7. NOKIA各机型相对应操作系统平台及屏幕参数http://www.nokiacn.net/thread-213829-1-1.html
  8. vue+elementUI实现前端分页
  9. 三极管开关电路_硬件电路设计之“三极管开关速度”
  10. 基于FPGA的SDRAM控制器设计(1)