先声明一下:Redis 有5种数据类型,而 BitMap 在 Redis 中并不是一个新的数据类型,其底层是 Redis 实现。
通常情况下,我们在 redis 中存储一个字符串,如:“big”,它的位图如下:
(相关资料图)
0.001kb = 1b = 8bit
所以,字符串“big”占3个字符,也就是24个bit位。
Redis 从 2.2.0 版本开始新增了 setbit,getbit,bitcount 等几个 bitmap 相关命令。虽然是新命令,但是并没有新增新的数据类型,因为 setbit 等命令只不过是在 set 上的扩展。
利用上述命令,Redis 可以操作二进制的位,可以取/改每一个位对应的值,简单写几个:
127.0.0.1:6379 > set hello big "OK" 127.0.0.1:6379 > getbit hello 0 "0" 127.0.0.1:6379 > getbit hello 1 "1" 127.0.0.1:6379 > setbit hello 7 1 "0" 127.0.0.1:6379 > get hello "cig"
通过上面的例子,我们可以发现:
getbit,setbit 可以对字符串进行位操作,可以获取/修改某位上的值;字符串的位修改以后,字符串本身也发生了根本变化,big -> cig。BitMap 原本的含义是用一个 bit 位来进行0或者1的设置,映射某个元素的状态。
由于一个比特位只能表示 0 和 1 两种状态,也就是说一个 bit 能存储的最多信息量是 2,所以 BitMap 能映射的状态有限,但是使用比特位的优势是能大量的节省内存空间。
在 Redis 中,Bitmap 是一串连续的2进制数字(0或1),所以,可以把 Bitmaps 想象成一个以比特位为单位的数组,数组的每一位所在的位置为偏移(offset),数组的下标在 Bitmaps 中叫做偏移量,在 bitmap 上可执行AND,OR,XOR以及其它位操作。
# 设置值,其中value只能是 0 和 1 setbit key offset value # 获取值 getbit key offset # 获取指定范围内值为 1 的个数 # start 和 end 以字节为单位 bitcount key start end # BitMap间的运算 # operations 位移操作符,枚举值 AND 与运算 & OR 或运算 | XOR 异或 ^ NOT 取反 ~ # result 计算的结果,会存储在该key中 # key1 … keyn 参与运算的key,可以有多个,空格分割,not运算只能一个key # 当 BITOP 处理不同长度的字符串时,较短的那个字符串所缺少的部分会被看作 0。返回值是保存到 destkey 的字符串的长度(以字节byte为单位),和输入 key 中最长的字符串长度相等。 bitop [operations] [result] [key1] [keyn…] # 返回指定key中第一次出现指定value(0/1)的位置 bitpos [key] [value]
因为 BitMap 中的 bit 位 是 字符串的映射,字符串在 value 中的存储是有上限的,所以 BitMap 的valu额存储空间可以用相同的方式计算。
Redis 中字符串的最大长度是 512M,所以 BitMap 的 offset (偏移量)最大值为:
512 * 1024 * 1024 * 8 = 2^32
很多网站都提供了签到功能,并且需要展示最近一个月的签到情况,这种情况可以使用 BitMap 来实现。 根据日期 offset = (今天是一年中的第几天) % (今年的天数),key = 年份:用户id。
如果需要将用户的详细签到信息入库的话,可以考虑使用一个一步线程来完成。
# 2021年第一天,用户Id = userId 的用户签到 setbit 2021:userId 1 1
使用日期作为 key,然后用户 id 为 offset,如果当日活跃过就设置为1。具体怎么样才算活跃这个标准大家可以自己指定。
假如:
20220101 活跃用户情况是: [1,0,1,1,0]20220102 活跃用户情况是 :[ 1,1,0,1,0 ]统计连续两天活跃的用户总数:
bitop and dest1 20220101 20220102 # dest1 中值为1的offset,就是连续两天活跃用户的ID bitcount dest1
统计20220101 ~ 20220102 活跃过的用户总数:
bitop or dest2 20220101 20220102 # dest2 中值为1的offset,就是两天都活跃的用户的ID bitcount dest2
如果需要提供一个查询当前用户是否在线的接口,也可以考虑使用 BitMap ,即节约空间效率又高,只需要一个 key,然后用户 id 为 offset,如果在线就设置为 1,不在线就设置为 0。
# userId 登录,设置状态为1 setbit key userId 1 # 获取 userId 的状态:1 - 在线;0 - 不在线 getbit key userId
布隆过滤器解决缓存穿透。
到此这篇关于关于Redis中bitmap的原理和使用详解的文章就介绍到这了,更多相关Redis的bitmap原理和使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
X 关闭
这篇文章主要介绍了关于Redis中bitmap的原理和使用详解,BitMap即位...
甘肃省景点免费 免门票最新消息中国旅游日免门票:景区所属市州免...
昨日,知名经济学家任泽平发文称:“建议推出五年内燃油车禁售时间...
天眼查App显示,5月16日,因有履行能力而拒不履行生效法律文书确定...
拥有零碳排基因生物质能产业发展潜力该如何挖掘?“到2030年,生物...
西大盈港双桥位于连接青浦新城与朱家角的主干道淀山湖大道上,桥分...
1、《武林群英传》是由北京淘梦影业有限公司,成都风际网络科技股份...
随着生活节奏的不断加快,出行的频率也是越来越高,虽然动车已经四...
对于迷你世界彩字怎么打这个问题感兴趣的朋友应该很多,这个也是目...
目前应该是有很多小伙伴对于双面孟汉娜第一季方面的信息比较感兴趣...
Copyright © 2015-2022 西南产业园区网版权所有 备案号:皖ICP备2022009963号-8 联系邮箱:39 60 29 14 2@qq.com