Redis-Bitmap
基础概念
-
“a”ASCll码是97,二进制是0110 0001,每个数“1”,“0”叫做位(bit),每8位叫做一个字节(byte),偏移量从左到右,从1到(二进制总数-1)
-
Bitmap是一串连续的二进制数字(0或1),每一位所在的位置为偏移(offset),在bitmap上可执行AND,OR,XOR以及其它位操作,实现大数据统计日活跃用户、避免重复点赞等
优点
- 效率极高,setbit和getbit的时间复杂度就是O(1),其他位运算也是效率极高的
- 极省空间,官网公式($offset/8/1024/1024)MB,假设有2亿用户,需要花200000000/8/1024/1024 = 24M即可
缺点
- 位计算和位表示数值的局限
举例文章重复点赞
SETBIT key offset value
对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit),位的设置或清除取决于 value 参数,可以是 0 也可以是 1,当 key 不存在时,自动生成一个新的字符串值;offset 参数必须大于或等于 0 ,小于 2^32 (bit 映射被限制在 512 MB 之内),时间复杂度O(1),返回原偏移量的位
BITCOUNT key [start] [end]
计算给定字符串中,被设置为 1 的比特位的数量,指定额外的 start 或 end 参数,可以让计数只在特定的位上进行,可以使用负数值:比如 -1 表示最后一个位,而 -2 表示倒数第二个位,以此类推,时间复杂度O(N),返回被设置为 1 的位的数量
可用于大数据签到、重复点赞、订单重复评论等
实现一:
# 假设某用户id=1,文章id=1,相互拼接为11,则偏移量11设置成1(前提用户id和文章id是唯一的)
127.0.0.1:6379> setbit artcle 11 1
(integer) 0
# 统计全部点赞人数
127.0.0.1:6379> bitcount artcle
(integer) 1
# 模拟重复点赞同一篇文章,返回了1,就可以根据返回值避免重复点赞
127.0.0.1:6379> setbit artcle 11 1
(integer) 1
实现二:
# 假设某用户id=10,有篇文章叫artcleA,则设置artcleA上的位10成1
127.0.0.1:6379> setbit artcleA 10 1
(integer) 0
# 统计文章artcleA的点赞人数
127.0.0.1:6379> bitcount artcle
(integer) 1
# 模拟重复点赞同一篇文章,返回了1,就可以根据返回值避免重复点赞
127.0.0.1:6379> setbit artcleA 10 1
(integer) 1
总结:
俩种方法,角度不同实现不同,都可以实现目标,第一种方法,优点存储内存低,缺点扩展性低,不能查看某篇文章点赞数,第二种方法,扩展性高,可以通过BITOP方法操作多个key,实现一些统计功能,缺点比第一种花费更多存储空间
赞赏码
非学,无以致疑;非问,无以广识