redis 学习(13)-- BitMap
BitMap
什么是 BitMap
BitMap,即位图,其实也就是 byte 数组,用二进制表示,只有 0 和 1 两个数字。
如图所示:

重要 API
| 命令 | 含义 |
|---|---|
| getbit key offset | 对key所存储的字符串值,获取指定偏移量上的位(bit) |
| setbit key offset value | 对key所存储的字符串值,设置或清除指定偏移量上的位(bit) 1. 返回值为该位在setbit之前的值 2. value只能取0或1 3. offset从0开始,即使原位图只能10位,offset可以取1000 |
| bitcount key [start end] | 获取位图指定范围中位值为1的个数 如果不指定start与end,则取所有 |
| bitop op destKey key1 [key2...] | 做多个BitMap的and(交集)、or(并集)、not(非)、xor(异或)操作并将结果保存在destKey中 |
| bitpos key tartgetBit [start end] | 计算位图指定范围第一个偏移量对应的的值等于targetBit的位置 1. 找不到返回-1 2. start与end没有设置,则取全部 3. targetBit只能取0或者1 |
演示

应用场景
统计每日用户的登录数。每一位标识一个用户ID,当某个用户访问我们的网页或执行了某个操作,就在bitmap中把标识此用户的位设置为1。
这里做了一个 使用 set 和 BitMap 存储的对比。
场景1:1 亿用户,5千万独立
| 数据类型 | 每个 userid 占用空间 | 需要存储的用户量 | 全部内存量 |
|---|---|---|---|
| set | 32位(假设userid用的是整型,实际很多网站用的是长整型) | 50,000,000 | 32位 * 50,000,000 = 200 MB |
| BitMap | 1 位 | 100,000,000 | 1 位 * 100,000,000 = 12.5 MB |
| 一天 | 一个月 | 一年 | |
|---|---|---|---|
| set | 200M | 6G | 72G |
| BitMap | 12.5M | 375M | 4.5G |
场景2:只有 10 万独立用户
| 数据类型 | 每个 userid 占用空间 | 需要存储的用户量 | 全部内存量 |
|---|---|---|---|
| set | 32位(假设userid用的是整型,实际很多网站用的是长整型) | 1,000,000 | 32位 * 1,000,000 = 4 MB |
| BitMap | 1 位 | 100,000,000 | 1 位 * 100,000,000 = 12.5 MB |
通过上面的对比,我们可以看到,如果独立用户数量很多,使用 BitMap 明显更有优势,能节省大量的内存。但如果独立用户数量较少,还是建议使用 set 存储,BitMap 会产生多余的存储开销。
使用经验
- type = string,BitMap 是 sting 类型,最大 512 MB。
- 注意 setbit 时的偏移量,可能有较大耗时
- 位图不是绝对好。
redis 学习(13)-- BitMap的更多相关文章
- Redis学习笔记二 (BitMap算法分析与BitCount语法)
Redis学习笔记二 一.BitMap是什么 就是通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身.我们知道8个bit可以组成一个Byte,所以bitmap本身会极大的节省 ...
- Redis学习1
Redis 学习记录 简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zs ...
- redis学习笔记(2)
redis学习笔记第二部分 --配置文件介绍 二,解析redis的配置文件redis.conf常见配置参数说明redis.conf 配置项说明如下:1. Redis默认不是以守护进程的方式运行,可以通 ...
- Redis学习手册(目录)
为什么自己当初要选择Redis作为数据存储解决方案中的一员呢?现在能想到的原因主要有三.其一,Redis不仅性能高效,而且完全免费.其二,是基于C/C++开发的服务器,这里应该有一定的感情因素吧.最后 ...
- Redis——学习之路三(初识redis config配置)
我们先看看config 默认情况下系统是怎么配置的.在命令行中输入 config get *(如图) 默认情况下有61配置信息,每一个命令占两行,第一行为配置名称信息,第二行为配置的具体信息. ...
- Redis学习手册——转载
转载出处:http://www.cnblogs.com/stephen-liu74/archive/2012/04/16/2370212.html 为什么自己当初要选择Redis作为数据存储解决方案中 ...
- (转)redis 学习笔记(1)-编译、启动、停止
redis 学习笔记(1)-编译.启动.停止 一.下载.编译 redis是以源码方式发行的,先下载源码,然后在linux下编译 1.1 http://www.redis.io/download 先 ...
- Redis学习手册
为什么自己当初要选择Redis作为数据存储解决方案中的一员呢?现在能想到的原因主要有三.其一,Redis不仅性能高效,而且完全免费.其二,是基于C/C++开发的服务器,这里应该有一定的感情因素吧.最后 ...
- redis学习大全
http://blog.csdn.net/menergy/article/details/17577985 http://blog.sina.com.cn/s/blog_64008ed70102uy ...
- Redis学习笔记(2)——Redis的下载安装部署
一.下载Redis Redis的官网下载页上有各种各样的版本,如图 但是官网下载的Redis项目不正式支持Windows.如果需要再windows系统上部署,要去GitHub上下载.我下载的是Redi ...
随机推荐
- Inter IPP 绘图 ippi/ipps
IPP的资料网上比较少,主要还是参考Inter官网和文档 官方文档ipps.pdf主要是对数据做处理,包括加减乘除.FFT.DFT等 文档ippi.pdf只要是对图像做处理,包括通道转换.图片处理等 ...
- Liunx 命令之链接操作
Linux 系统中有软链接和硬链接两种特殊的"文件". 软链接可以看作是Windows中的快捷方式,可以让你快速链接到目标档案或目录. 硬链接则透过文件系统的inode来产生新档名 ...
- 【转】Microsoft SQL Server 2008 R2 官方简体中文正式版下载(附激活序列号密钥)
原文: https://www.bensblog.cn/1238.html
- A Beginner's Guide To Understanding Convolutional Neural Networks Part One (CNN)笔记
原文链接:https://adeshpande3.github.io/adeshpande3.github.io/A-Beginner's-Guide-To-Understanding-Convolu ...
- DAY 5 & 6
DAY 5 之前整过一个DP 动态规划 DP 啥是DP? DP等价于DAG!!! (1)无后效性:DP的所有状态之间组成一个DAG (2)最优子结构 (3)阶段性 (4)转移方程:如何计算状态 一般 ...
- git add时遇到类似fatal: Path 'XXX' is in submodule 'XXX'错误提示如何解决?
答:示例如下: fatal: Pathspec 'Vundle.vim/autoload/vundle.vim' is in submodule '.vim/bundle/Vundle.vim' 解决 ...
- mandatory argument 'crshome' is missing
1. 错误信息 在oracle 10.2.0.4 to 11.1.0.6 的各个版本中,尽管变量ORA_CRS_HOME设置正确,也会遇到如下错误: # ./diagcollection.pl -c ...
- matplotlib之直方图
1.知识点 1.通过数据和组距得到组数 2.使用plt.hist(数据,组数)绘制频数直方图:使用plt.hist(数据,组数,normed=True)绘制频率直方图 3.使用plt.xticks(a ...
- C# lock 为什么要设置成只读
首先给出MSDN的定义: lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断.这是通过在代码块运行期间为给定对象获取互斥锁来实现的. 先来看看执行过程,代码示例如下: 假设线程A先执行, ...
- Ironic 的 Rescue 救援模式实现流程
目录 文章目录 目录 救援模式 实现 UML 图 救援模式 以往只有虚拟机支持救援模式,裸机是不支持的.直到 Queen 版本 Ironic 实现了这个功能.救援模式下,用户可以完成修复.Troubl ...