mysql bitmap实现_bitmap原理和应用
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原理和应用相关推荐
- mysql主从_MySQL主从原理及配置详解
MySQL主从配置及原理,供大家参考,具体内容如下 一.环境选择: 1.Centos 6.5 2.MySQL 5.7 二.什么是MySQL主从复制 MySQL主从复制是其最重要的功能之一.主从复制是指 ...
- MySQL事务ACID实现原理
照例,我们先来一个场景~ 面试官:"知道事务的四大特性么?" 你:"懂,ACID嘛,原子性(Atomicity).一致性(Consistency).隔离性(Isolati ...
- MySQL的MVCC底层原理二
承接上文MySQL的MVCC底层原理 上文说到时序图中的第12步这篇文章咱接着聊完 时序图 图1 时序图第12步中的查询事务的read-view情况 图2 read-view为[100,200],30 ...
- MySQL的MVCC底层原理
MySQL的MVCC底层原理 图1 这是一个account表 有id和name字段 图2 MySQL底层会给表添加2个字段 一个是trx id(事务id)一个是roll pointer(回滚指针) 事 ...
- mysql数据库ACID实现原理
说到事物的四大特性原子性.一致性.隔离性.持久性,懂的人很多,但是稍微涉及细节,四大特性在数据库中的实现原理是怎么实现的?几乎很少有人能够答上来.所以这里着重讨论下mysql中的实现原理. 问题一:M ...
- 《深入理解分布式事务》第二章 MySQL 事务的实现原理
shua# <深入理解分布式事务>第二章 MySQL 事务的实现原理 文章目录 一.Redo Log 1.Redo Log 基本概念 2.Redo Log 基本原理 3.Redo Log ...
- mysql+join的原理,Mysql连接join查询原理知识点
Mysql连接join查询原理知识点 Mysql连接(join)查询 1.基本概念 将两个表的每一行,以"两两横向对接"的方式,所得到的所有行的结果. 假设: 表A有n1行,m1列 ...
- ntp同步 mysql_解析Mysql 主从同步延迟原理及解决方案
MySQL的主从同步是一个很成熟的架构,优点为:①在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力;②在从主服务器进行备份,避免备份期间影响主服务器服务;③当主服务器出现问题时,可以 ...
- 深入解析Mysql 主从同步延迟原理及解决方案
深入解析Mysql 主从同步延迟原理及解决方案 参考文章: (1)深入解析Mysql 主从同步延迟原理及解决方案 (2)https://www.cnblogs.com/fengff/p/1101170 ...
最新文章
- miniz库简介及使用
- 人工智能如何彻底改变全球物流和供应链管理
- servlet 初步 (四) session
- how to become a good teacher
- Redis 实战笔记
- oracle jet auto,如何启用sqlplus的AutoTrace功能
- RocketMQ入门到入土(二)事务消息顺序消息
- Cognos 增加全局类
- EXCHANGE 2003 恢复存储组的使用
- [转]在一个工程中添加别的工程的中已创建好的对话框资源。
- mysql varbinary 长度_mysql8 参考手册--BINARY和VARBINARY类型
- 真4k测试样片_用真4K看片是什么体验?半年没进电影院,却被夏普70B6UM惊艳到了...
- 一键获取喜马拉雅音频文件(Python3爬虫)
- 操作系统不等于 Linux,六问操作系统新时代 | 1024 程序员节
- Base64 混淆加密+迭代次数,Base64前后端加解密不一致、Base64 js加解密结果与java加解密结果不一致,Base64中文加密乱码
- MAP(Maximum A Posteriori,最大后验准则)算法
- 【MATLAB】plot和fplot的区别
- DDR3详解(以Micron MT41J128M8 1Gb DDR3 SDRAM为例)
- 【网路编程】网络基础知识(IP、子网掩码、网关等)概念概述
- Linux 命令和参数 英文全称
热门文章
- sudo命令,配置sudo不要密码
- 谈谈免费开源的知识产权话题
- Excel快速打印底端标题,教你一招,肯定行!
- 2020原生Android基础实用开发
- crowd counting——利用高斯核函数将坐标点转换为density map
- 经典 IP + Web3|蓝精灵官方游戏 The Smurfs‘ Society 带来全新体验
- NOKIA各机型相对应操作系统平台及屏幕参数http://www.nokiacn.net/thread-213829-1-1.html
- vue+elementUI实现前端分页
- 三极管开关电路_硬件电路设计之“三极管开关速度”
- 基于FPGA的SDRAM控制器设计(1)