Redis中的bitmap详解
程序员文章站
2022-03-04 14:58:33
1、什么是bitmap?bitmap也叫位图,也就是用一个bit位来表示一个东西的状态,我们都知道bit位是二进制,所以只有两种状态,0和1。2、为什么要有bitmap?bitmap的出现就是为了大数...
1、什么是bitmap?
bitmap也叫位图,也就是用一个bit位来表示一个东西的状态,我们都知道bit位是二进制,所以只有两种状态,0和1。
2、为什么要有bitmap?
bitmap的出现就是为了大数据量而来的,但是前提是统计的这个大数据量每个的状态只能有两种,因为每一个bit位只能表示两种状态。
下面我们直接以一个统计亿级用户活动的状态来说明吧。
3、案例说明
3.1、案例描述
如果有一个上亿用户的系统,需要我们去统计每一天的用户登录情况,我们应该如何去解决?
前提条件:设置在9月19号有下标为100、101、102、103四个用户都登录了系统
设置在9月20号有下标为100、101、102三个用户都登录了系统
提出问题:
1、取出9月19号登录系统的有多少人?
答:直接获取即可。
2、取出9月19号和9月20号连续登录系统的有多少人?
答:两天的数据取&运算。
3、取出9月19号与9月20号任意一天登录的有多少人?
答:两天的数据取|运算。
3.2、解决方案
3.2.1、解决方案1—使用传统数据库解决
如果我们需要使用传统的数据库去统计的话,我么需要创建一张表,然后某个用户登录了,我们就去在表里面插上一条记录,登记用户的id,用户登录的时间等等,但是这样出现的问题就是,每一天的数据量都很大,我们在统计日活时,效率就很低,所以这种解决方案是不能被考虑的。
3.2.2、解决方案2—使用bitmap解决
既然用户登录只有两种状态,那么,我们就可以用bitmap
比如0表示未登录,1表示登录
// 设置在9月19号有下标为100、101、102、103四个用户都登录了系统 start 127.0.0.1:6379> setbit login_09_19 100 1 (integer) 0 127.0.0.1:6379> setbit login_09_19 101 1 (integer) 0 127.0.0.1:6379> setbit login_09_19 102 1 (integer) 0 127.0.0.1:6379> setbit login_09_19 103 1 (integer) 0 // 设置在9月19号有下标为100、101、102、103四个用户都登录了系统 end // 设置在9月20号有下标为100、101、102三个用户都登录了系统 start 127.0.0.1:6379> setbit login_09_20 100 1 (integer) 0 127.0.0.1:6379> setbit login_09_20 101 1 (integer) 0 127.0.0.1:6379> setbit login_09_20 102 1 (integer) 0 // 设置在9月20号有下标为100、101、102三个用户都登录了系统 end // 取出9月19号登录系统的有多少人? start 127.0.0.1:6379> bitcount login_09_19 (integer) 4 // 取出9月19号登录系统的有多少人? end // 取出9月19号和9月20号连续登录系统的有多少人?start 127.0.0.1:6379> bitop and login_in_09_19_20:and login_09_19 login_09_20 (integer) 13 127.0.0.1:6379> bitcount login_in_09_19_20:and (integer) 3 // 取出9月19号和9月20号连续登录系统的有多少人?end // 取出9月19号与9月20号任意一天登录的有多少人?start 127.0.0.1:6379> bitop or login_in_09_19_20:or login_09_19 login_09_20 (integer) 13 127.0.0.1:6379> bitcount login_in_09_19_20:or (integer) 4 // 取出9月19号与9月20号任意一天登录的有多少人?end
到此这篇关于redis中的bitmap详解的文章就介绍到这了,更多相关redis中的bitmap内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
推荐阅读
-
MySQL中的行级锁定示例详解
-
详解HTML5中的Communication API基本使用方法
-
详解iOS中UIView的layoutSubviews子视图布局方法使用
-
详解iOS应用中自定义UIBarButtonItem导航按钮的创建方法
-
详解iOS App中UITableView的创建与内容刷新
-
Android中的SpannableString与SpannableStringBuilder详解
-
Android 中RxPermissions 的使用方法详解
-
详解CSS3中nth-child与nth-of-type的区别
-
Linux系统中10个最危险的命令详解
-
linux中head命令使用详解(显示开头数量的文字块)