内容简介:我们都知道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 数组看成「位数组」来处理。
位图的优势:
- 基于最小的单位bit进行存储,所以非常省空间。
- 设置时候时间复杂度O(1)、读取时候时间复杂度O(n),操作是非常快的
- 二进制数据的存储,进行相关计算的时候非常快
- 方便扩容
一般可以在如下场景使用:
- 用户签到
- 用户在线状态
- 统计活跃用户
- 各种状态值
常用命令
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 参数,每次只对所需的部分位进行计算,然后在进行累加。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Coding the Matrix
Philip N. Klein / Newtonian Press / 2013-7-26 / $35.00
An engaging introduction to vectors and matrices and the algorithms that operate on them, intended for the student who knows how to program. Mathematical concepts and computational problems are motiva......一起来看看 《Coding the Matrix》 这本书的介绍吧!