前言

简单介绍一下bitmaps这个东西。

正文

我们都知道bitmaps 翻译过来就是二进制。

那么二进制可以存一些什么呢? 图片、视频,还可也存些什么呢?

现代计算机用二进制(位)作为信息的基础单位,1个字节等于8位,例 如“big”字符串是由3个字节组成,但实际在计算机存储时将其用二进制表 示,“big”分别对应的ASCII码分别是98、105、103,对应的二进制分别是 01100010、01101001和01100111。

许多开发语言都提供了操作位的功能,合理地使用位能够有效地提高内 存使用率和开发效率。Redis提供了Bitmaps这个“数据结构”可以实现对位的操作。

把数据结构加上引号主要因为:

·Bitmaps本身不是一种数据结构,实际上它就是字符串(如图3-10所 示),但是它可以对字符串的位进行操作。

·Bitmaps单独提供了一套命令,所以在Redis中使用Bitmaps和使用字符 串的方法不太相同。

可以把Bitmaps想象成一个以位为单位的数组,数组的 每个单元只能存储0和1,数组的下标在Bitmaps中叫做偏移量。

那么来看一下其命令吧。

本节将每个独立用户是否访问过网站存放在Bitmaps中,将访问的用户 记做1,没有访问的用户记做0,用偏移量作为用户的id。

  1. setbit key offset value

设置键的第offset个位的值(从0算起),假设现在有20个用户, userid=0,5,11,15,19的用户对网站进行了访问.

具体操作过程如下,unique:users:2016-04-05代表2016-04-05这天的 独立访问用户的Bitmaps:

如果此时有一个userid=50的用户访问了网站,那么Bitmaps的结构变成:

很多应用的用户id以一个指定数字(例如10000)开头,直接将用户id 和Bitmaps的偏移量对应势必会造成一定的浪费,通常的做法是每次做setbit 操作时将用户id减去这个指定数字。

在第一次初始化Bitmaps时,假如偏移 量非常大,那么整个初始化过程执行会比较慢,可能会造成Redis的阻塞。

gitbit key offset

  1. bitcount [start][end]
bitcount unique:users:2016-04-05

[start]和[end]代表起始和结束字节数,下面操作计算用户id在第1个字节 到第3个字节之间的独立访问用户数

一个字节是8位。

4.Bitmaps间的运算

bitop op destkey key[key....]

bitop是一个复合操作,它可以做多个Bitmaps的and(交集)、or(并 集)、not(非)、xor(异或)操作并将结果保存在destkey中。

bitop and unique:users:and:2016-04-04_03 unique: users:2016-04-03 unique:users:2016-04-03

这个就表示unique:users:and:2016-04-04_03 表示的就是users:2016-04-03 和 unique:users:2016-04-03 都访问过的集合.

  1. 计算Bitmaps中第一个值为targetBit的偏移量
 bitpos unique:users:2016-04-04 1

除此之外,bitops有两个选项[start]和[end],分别代表起始字节和结束字 节,例如计算第0个字节到第1个字节之间,第一个值为0的偏移量.

bitmaps 例子

假设网站有1亿用户,每天独立访问的用户有5千万,如果每天用集合类 型和Bitmaps分别存储活跃用.

如果使用集合那么消耗是500m存储,这是比较恐怖的。

但Bitmaps并不是万金油,假如该网站每天的独立访问用户很少,例如 只有10万(大量的僵尸用户),那么两者的对比如表3-5所示,很显然,这 时候使用Bitmaps就不太合适了,因为基本上大部分位都是0。

下一节是HyperLogLog。

redis 简单整理——bitmaps[十二]的更多相关文章

  1. Redis进阶实践之十二 Redis的Cluster集群动态扩容

    一.引言     上一篇文章我们一步一步的教大家搭建了Redis的Cluster集群环境,形成了3个主节点和3个从节点的Cluster的环境.当然,大家可以使用 Cluster info 命令查看Cl ...

  2. Redis详解(十二)------ 缓存穿透、缓存击穿、缓存雪崩

    本篇博客我们来介绍Redis使用过程中需要注意的三种问题:缓存穿透.缓存击穿.缓存雪崩. 1.缓存穿透 一.概念 缓存穿透:缓存和数据库中都没有的数据,可用户还是源源不断的发起请求,导致每次请求都会到 ...

  3. Redis 学习笔记(十二)Redis 复制功能详解 ----- (error) READONLY You can't write against a read only slave

    Redis 复制(Replication)1. 复制介绍分布式数据库为了获取更大的存储容量和更高的并发访问量,会将原来集中式数据库中的数据分散存储到多个通过网络连接的数据存储节点上.Redis为了解决 ...

  4. 【面试 redis】【第十二篇】redis的相关面试问题

    redis的相关面试问题 redis教程:http://www.redis.net.cn/tutorial/3501.html ==================================== ...

  5. 【测试笔记】Redis学习笔记(十二)性能测试

    http://blog.csdn.net/yangcs2009/article/details/50781530 Redis测试服务器一 redis_version:2.8.4 www@iZ23s8a ...

  6. Redis学习笔记(十二) 复制(上)

    偷个懒,晚上工作忙的太晚,整个复制功能的内容还没有写完,这里先说一下复制功能的简单应用. 在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制另一个服务器, ...

  7. 【leetcode 简单】第十二题 报数

    报数序列是指一个整数序列,按照其中的整数的顺序进行报数,得到下一个数.其前五项如下: 1. 1 2. 11 3. 21 4. 1211 5. 111221 1 被读作  "one 1&quo ...

  8. Redis学习篇(十二)之管道技术

    通过管道技术降低往返时延 当后一条命令不依赖于前一条命令的返回结果时,可以使用管道技术将多条命令一起 发送给redis服务器,服务器执行结束之后,一起返回结果,降低了通信频度.

  9. Redis学习笔记(十二) 高级命令:服务器管理命令

    原文链接:http://doc.redisfans.com/server/index.html save 执行一个同步操作,将redis实例的所有数据以rdb的形式保存到硬盘,一般来说,生产环境很少执 ...

  10. redis: 持久化(十二)

    RDB配置 RDB 是 Redis 默认的持久化方案.在指定的时间间隔内,执行指定次数的写操作,则会将内存中的数据写入到磁盘中.即在指定目录下生成一个dump.rdb文件.Redis 重启会通过加载d ...

随机推荐

  1. Android 安装手机程序有问题/点击runAPP 程序安装不了手机

    可以在 gradle.properties 里添加   android.injected.testOnly=false   点击同步  就可以运行了 如下:

  2. Java 封装性的小练习

    1 package com.bytezero.test2; 2 3 public class Person 4 { 5 private int age; 6 7 public void setAge( ...

  3. 5、zookeeper应用场景-配置中心原理

    配置中心 使用 zookeeper的特性watcher监听器 工作中有这样的一个场景:数据库用户名和密码信息放在一个配置文件中,应用读取该配置文件,配置文件信息放入缓存 若数据库的用户名和密码改变时候 ...

  4. 速存,详细罗列香橙派AIpro外设接口样例大全(附源码)

    本文分享自华为云社区<香橙派AIpro外设接口样例大全(附源码)>,作者:昇腾CANN. Orange Pi AI Pro 开发板是香橙派联合华为精心打造的高性能 AI 开发板,其搭载了昇 ...

  5. elementPlus配合vue-router搭建后台系统菜单模块

    设置menuType来区分菜单类型 /** * @params menuType * -1 一般为首页 / -> /home 只显示第一个子项 * -2 为无子菜单的菜单项 /config -& ...

  6. python getOpenFileNames 获取文件实例解析

    一 概念 选取文件夹 QFileDialog.getExistingDirectory() 选择文件 QFileDialog.getOpenFileName() 选择多个文件 QFileDialog. ...

  7. SQL注入详细讲解概括-GET注入、POST注入、HEAD注入

    SQL注入详细讲解概括-GET注入.POST注入.HEAD注入 1.SQL注入流程 2.GET注入 3.POST注入 4.HEAD注入 一.SQL注入流程 1.SQL注入流程 · 寻找注入点-与数据库 ...

  8. Linux快速入门(六)Linux网络管理

    ping ping命令用于测试两台主机之间是否可以通信,一般情况下会使用ping www.baidu.com来测试网络连通性,如果不指定发送包的个数默认是一直发送数据包,可以使用Ctrl+C停止.网络 ...

  9. 记录--一道js笔试题, 刷新了我对map方法函数的认知

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 背景 昨天在看一道笔试题的时候本以为很简单,但是结果不是我想象的那样,直接上笔试题. const array = new Array(5) ...

  10. 全网首套完整containerd容器工具教程

    1.Containerd的由来 [Docker名噪一时,捐出runC]2013年docker公司在推出docker产品后,由于其对全球技术产生了一定的影响力,Google公司明显感觉到自己公司内部所使 ...