• 喜欢前端以及PHP的朋友们可以加PHP同好会QQ群 点击加入qq群
  • 最近在写一个项目---"小A微信托管平台",大家可以去帮忙测试一下!功能在不断完善中,敬请关注!点击进入
  • 本站使用了PHP8.1与HTTP2.0协议,速度简直超级快有木有?

Redis应用场景-位操作(bit)

数据库 Mr.Adam 4年前 (2020-12-26) 1884次浏览 已收录 0个评论

Redis 应用场景-位操作(bit)

Redis 应用场景-位操作(bit)

我们都知道,8 bit = 1 Byte = 1/1024 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.各种状态值(1 or 0)

常用命令

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

GETBIT
对 key 所储存的字符串值,获取指定偏移量上的位(bit)。
GETBIT key offset
offset 最大为 2^32, 42 亿 9 千 4 百多万… :!:

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

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

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

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 数据非常大,那么可以考虑使用以下两种方法:

1.将一个大的 bitmap 分散到不同的 key 中,作为小的 bitmap 来处理。

2.使用 BITCOUNT key [start] [end] 的 start 和 end 参数,每次只对所需的部分位进行计算,然后在进行累加。


小 A 空间 , 版权所有丨如未注明转载 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Redis 应用场景-位操作(bit)
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址