Redis应用-位图

栏目: 数据库 · 发布时间: 6年前

内容简介:我们都知道8bit = 1b = kb,位图并不是一种特殊的数据结构,其实本质上是二进制字符串,也可以看做是 byte 数组。可以使用普通的 get/set 直接获取和设置整个位图的内容,也可以使用位图操作 getbit/setbit 等将 byte 数组看成「位数组」来处理。对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。

我们都知道8bit = 1b = kb, bitmap 就是通过最小的单位 bit 来进行0或者1的设置,表示某个元素对应的值或者状态。 一个bit的值,或者是0,或者是1;也就是说一个bit能存储的最多信息是2。

位图并不是一种特殊的数据结构,其实本质上是二进制字符串,也可以看做是 byte 数组。可以使用普通的 get/set 直接获取和设置整个位图的内容,也可以使用位图操作 getbit/setbit 等将 byte 数组看成「位数组」来处理。

位图的优势:

  1. 基于最小的单位bit进行存储,所以非常省空间。
  2. 设置时候时间复杂度O(1)、读取时候时间复杂度O(n),操作是非常快的
  3. 二进制数据的存储,进行相关计算的时候非常快
  4. 方便扩容

一般可以在如下场景使用:

  1. 用户签到
  2. 用户在线状态
  3. 统计活跃用户
  4. 各种状态值

常用命令

SETBIT

对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。 SETBIT key offset value offset 参数必须大于或等于 0 ,小于 2^32 (bit 映射被限制在 512 MB 之内)。

GETBIT

对 key 所储存的字符串值,获取指定偏移量上的位(bit)。 GETBIT key offset

BITCOUNT

计算给定字符串中,被设置为 1 的比特位的数量。 BITCOUNT key

BITPOS

返回位图中第一个值为 bit 的二进制位的位置。 BITPOS key bit [start] [end]

BITOP

对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上。 BITOP operation destkey key [key …] operation 可以是 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种 BITOP AND destkey key [key ...] ,对一个或多个 key 求逻辑并,并将结果保存到 destkey 。

BITFIELD

bitfield 有三个子指令,分别是 get/set/incrby,它们都可以对指定位片段进行读写,但是最多只能处理 64 个连续的位,如果超过 64 位,就得使用多个子指令,bitfield 可以一次执行多个子指令。

适用于各类统计应用

记录用户的签到,每日在线情况等,可以将当天或者当天的偏移量对应的bit位设置为1即可,使用 BITCOUNT 可以轻松统计签到次数。

还有一种使用比较多的情况,就是设置各类状态值,例如商城的设置:是否可以评价订单,是否展示售罄商品,是否正常营业等状态值可以使用bitmap来存储

在性能方面,如前面提到的签到,即使运行 10 年,占用的空间也只是每个用户 10*365 比特位(bit),也即是每个用户 456 字节。对于这种大小的数据来说, BITCOUNT key [start] [end] 的处理速度就像 GET key 和 INCR key 这种 O(1) 复杂度的操作一样快。

当然如果你的 bitmap 数据非常大,那么可以考虑使用以下两种方法:

  • 将一个大的 bitmap 分散到不同的 key 中,作为小的 bitmap 来处理。使用 Lua 脚本可以很方便地完成这一工作。
  • 使用 BITCOUNT key [start] [end] 的 start 和 end 参数,每次只对所需的部分位进行计算,然后在进行累加。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Web开发权威指南

Web开发权威指南

[美] Chris Aquino,、[美] Todd Gandee / 奇舞团 / 人民邮电出版社 / 2017-9 / 99.00元

本书在知名培训机构Big Nerd Ranch 培训教材的基础上编写而成,囊括了JavaScript、HTML5、CSS3等现代前端开发人员急需的技术关键点,包括响应式UI、访问远程Web 服务、用Ember.js 构建应用,等等。此外,还会介绍如何使用前沿开发工具来调试和测试代码,并且充分利用Node.js 和各种开源的npm 模块的强大功能来进行开发。 全书分四部分,每部分独立完成一个项......一起来看看 《Web开发权威指南》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

随机密码生成器
随机密码生成器

多种字符组合密码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试