Redis学习笔记二 (BitMap算法分析与BitCount语法)
Redis学习笔记二
一、BitMap是什么
就是通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身。我们知道8个bit可以组成一个Byte,所以bitmap本身会极大的节省储存空间。
二、BitMap算法基本描述
BitMap 是使用 bit位来标记某个元素对应的value,而key 即是该元素,因此对于之前位数存储换成bit位存储数据能大大的节省存储空间。
三、BitMap的实现思想
假设我们要对于0-7内的5个元素(4,7,2,5,3)进行排序(假设元素没有重复),我们可以利用bitmap达到该目的,要表示8个数,我们需要8bit,每个bit相当于一个标志位,我们可以通过标志位(0,1)去标识本次这个元素是否存在(0,标识不存在;1,标识存在,1Byte=8bit)
首先先开辟1byte的空间,将8个bit位设为0.如这张图
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
然后遍历这几个元素,4为第一个元素,所以把4对应的位置变为1.如下图
|
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
接下去遍历可以得到:
|
0 |
0 |
1 |
1 |
1 |
1 |
0 |
1 |
然后我们通过GETBIT这个命令可以遍历bit区域,将标识为1的遍历出来,得到(2,3,4,5,7)序列,这样子就得到了排序的结果。
GETBIT key offset
四、BitMap 40亿数据处理题目
给你一个文件,里面包含40亿个整数,如何利用bitMap思想找出该文件中不包含的一个整数, 假设你有1GB内存可用。
我们用1Byte代替一个整数,那40亿数据大概要40*10^8*bit = 0.5GB,满足内存要求。
用int来表示:Int bmap[1+sum/32]; //N是总数,sum=40*(10^8),一个int=32Bit=4Byte
然后我们插入一个整数ze,要先计算整数ze位于数组Bitmap中的索引:index = ze/32;(除以32是得到整数位于第几个Byte,也就是第几位)
比如整数35,index=35/32=1, 35%32=3(取余) 第35位于数组中的index=1(位于数组BitMap[1]中标识等于3的位置),然后就是标识这个位置为1。
知道了这些,我们就可以检测哪个整数不在数据里面了。
如:检测35,先计算index,在数组BitMap的标识位置
35: index = 1, 在BitMap[1]中的位置为 1,只需要检测这个位置是否为1
BitMap[1] &(1<<1),这样是1返回true,否侧返回false
五、Bit-Map的应用
1)可进行数据的快速查找,判重,删除,一般来说数据范围是int的10倍以下。
2)去重数据而达到压缩数据
BitCount
一、bitcount.语法
BitCount:计算key 所储存的字符串值中,被设置为 1 的比特位的数量。
BITCOUNT key
|
BITCOUNT key start end |
|
计算key 所储存的字符串值中,指定字节区间[start,end]被设置为 1 的比特位的数量。 |
二、使用bitcount统计浏览数量
如记录网站上的用户的上线频率,例如计算用户A上线了多少天,用户B上线了多少天,以此作为数据,这可以用SETBIT和BITCOUNT来实现。
每当用户在某一天上线的时候,通过SETBIT命令,以用户名作为key,将那天所代表的网站的上线日作为offset (标识偏移数)参数,并将这个offset 上的为设置为1。
举个例子,如果今天是网站上线的第66天,而用户(user=Y)在今天阅览过网站,那么执行命令SETBIT person:Y 66 1;如果88号那天用户(user=Y)也继续阅览网站,那么执行命令SETBIT person:Y 88 1,
使用BITCOUNT命令:计算用户(user=Y)总共上线次数时
执行BITCOUNT person:Y,得出用户(person=Y)上线的总天数。
三、Python-redis-Bitcount 代码
import redis r = redis.Redis(host='127.0.0.1', port=6379, db=0) #模拟A用户 ,一年中 每三天登录一次。
for i in range(3, 365, 3):
r.setbit('ua', i, 1) #模拟B用户,一年中 每60天登录一次。
for i in range(1, 365, 60):
r.setbit('ub', i, 1) userList = r.keys('u*')
#用户列表
print userList #存放活跃用户列表
Au = []
#存放非活跃用户列表
Nau = [] for u in userList :
# 计算登录次数
loginCount = r.bitcount(u)
if loginCount > 100 :
# 列表添加元组 ()对象
Au.append((u, loginCount))
else :
Nau.append((u, loginCount)) for l in Au :
print l[0] + ' 是活跃用户. 登陆' + str(l[1]) + '天' for l in Nau :
print l[0] + ' 是非活跃用户. 登陆' + str(l[1]) + '天' 结果:
['ub', 'ua']
ua 是活跃用户. 登陆121天
ub 是非活跃用户. 登陆7天
Bittop命令

处理不同长度的字符串
当 BITOP 处理不同长度的字符串时,较短的那个字符串所缺少的部分会被看作 0 。
空的 key 也被看作是包含 0 的字符串序列
Redis学习笔记二 (BitMap算法分析与BitCount语法)的更多相关文章
- Redis学习笔记二
学习Redis添加Object时,由于Redis只能存取字符串String,对于其它数据类型形容:Int,long,double,Date等不提供支持,因而需要设计到对象的序列化和反序列化.java序 ...
- redis 学习笔记二 (简单动态字符串)
redis的基本数据结构是动态数组 一.c语言动态数组 先看下一般的动态数组结构 struct MyData { int nLen; char data[0]; }; 这是个广泛使用的常见技巧,常用来 ...
- StackExchange.Redis学习笔记(二) Redis查询 五种数据类型的应用
ConnectionMultiplexer ConnectionMultiplexer 是StackExchange.Redis的核心对象,用这个类的实例来进行Redis的一系列操作,对于一个整个应用 ...
- redis 学习笔记二
redis启动: 直接 redis-server.exe 启动服务,是按照redis默认配置启动的,如果想按照自己的配置文件启动,要加上 redis-server.exe redis.windows ...
- redis学习笔记(二)——java中jedis的简单使用
redis怎么在java中使用,那就是要用到jedis了,jedis是redis的java版本的客户端实现,原本原本想上来就直接学spring整合redis的,但是一口吃个胖子,还是脚踏实地,从基础开 ...
- Redis学习笔记二:单机数据库的实现
1. 数据库 服务器中的数据库 Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中,db数组的每个项都是一个redis.h/redisDb结构,每个r ...
- 2019/1/10 redis学习笔记(二)
本文不涉及集群搭建操作 关于在lua脚本中操作redis的应用场景 大家都知道redis对于单个集合的操作是原子性的;但是有可能有一种场景是这样.比如说抢红包,现在有十个人抢五份红包,抽象到我们jav ...
- redis 学习笔记(二)
1. 在centos下安装g++,如果输入 yum install g++,那么将会提示找不到g++.因为在centos下g++安装包名字叫做:gcc-c++ 所以应该输入 yum install g ...
- Redis学习笔记(二):Redis集群
集群通过分片(sharding)来进行数据共享,并提供复制和故障转移功能. 1.节点 一个节点就是一个运行在集群模式下的Redis服务器.启动Redis服务器时,通过判断cluster-enabl ...
随机推荐
- POJChallengeRound2 Guideposts 【单位根反演】【快速幂】
题目分析: 这题的目标是求$$ \sum_{i \in [0,n),k \mid i} \binom{n}{i}G^i $$ 这个形式很像单位根反演. 单位根反演一般用于求:$ \sum_{i \in ...
- 初识 go 语言:语法
目录 语法 for 循环 if 语句 switch 语句 defer 语句 defer 栈 结束 前言: go语言系列第二篇,主要讲述go语言的语法,如循环,if判断,swich语句,defer语句, ...
- Memcached介绍
Memcached介绍 Memcached是一种免费的.开源的.高性能的.分布式对象缓存系统,通过缓解数据库压力,来提高动态web页面的速度. Memcached是一种内存级别的键值对存储,用来存放数 ...
- go 的包
- IPC$概念及入侵方式研究
catalogue . 什么是IPC$ . IPC$攻击方式 . 漏洞检测与防御措施 1. 什么是IPC$ IPC$(空会话连接)是windows系统内置的一个功能模块,它的作用有很多(包括域帐号枚举 ...
- Web_0001:关于阿里云防盗链Referer,CDN加速,OSS自定义域名的操作
1,防盗链Referer 防止非法域名访问 OSS 数据,设置白名单: 允许为空 : 表示当从浏览器直接打开OSS资源时有效. 示例说明: 我在www.sojson.com里有一个www.baidu. ...
- [物理学与PDEs]第1章习题7 载流线圈的磁场
设一半径为 $R$ 的圆周电路上的电流强度为 $I$. 试计算在通过圆心垂直于圆周所在平面的直线上, 由该圆周电路产生的磁场的磁感强度. 解答: 由对称性知在该直线 $l$ 上, ${\bf B}$ ...
- mysql中使用enum,如何获取所有可能的值
SELECT column_type FROM information_schema. COLUMNS WHERE TABLE_SCHEMA = "数据库名" AND DATA_T ...
- java(7)数组
一.什么是数组及其作用? 定义:具有相同数据类型的一个集合 作用:存储连续的具有相同类型的数据 二.java中如何声明和定义数组 2.1 声明和定义的语法: 数据类型[ ] 数组名:( int[ ] ...
- Linux负载查询定位工具
1 uptime命令,负载查询命令 02:34:03 // 当前时间up 2 days, 20:14 // 系统运行时间1 user // 正在登录用户数 而最后三个数字呢,依次则是过去 1 分钟.5 ...