redis使用位图法记录在线用户的状态

这几天在工作中,遇到一个case,就是需要自己实现一个IM在线用户状态的记录,当时查了很多中实现方式,今天来分享一下

主要思想

构造一个位图,里面存的是二进制数据,如:1 0 1 0 1 0 1,通过修改userId对应位置上的0和1来修改用户在线状态,由于默认值为0,所以1代表用户处于在线状态,0代表用户处于离线状态,如图:


构造了Mon、Thus、Web三个位图

构造了Mon、Thus、Web三个位图,对于Mon来说,userId=1的用户处于在线状态,userId=2的用户处于离线状态,userId=3的用户处于在线状态,当userId=10的用户上线后,就把第10位上值变成1

空间预估

二进制数据1位为1bit
1千兆字节(gb)=8589934592比特(bit)
理论上1G的内存可以记录85亿多的用户状态,如果userId不连贯,有的userId位数超过85亿位,可以使用一些算法、或者对userId按位分段来解决

使用命令

setbit key offset value 修改key中,第offset位的值为value
Setbit
getbit key offset 获取key中,第offset位上的value
getbit
bitcount key 统计key中,1的个数
bitcount
bitop op destKey key1 key2 ….. 其中op可以为AND(于)、OR(或)、NOT(非)、XOR(异或)

命令的主要作用是,给key1、key2..等,这种二进制数据,按位做逻辑运算,结果付到destkey中,没有setbit的位置默认为0

举个栗子

构造了Mon、Thus、Web三个位图,作为近三天登录状态的位图


构造了Mon、Thus、Web三个位图
第一天

userId=10000,userId=9999,userId=8888的用户登录了

setbit mon 10000 1;     
setbit mon 9999 1;       
setbit mon 8888 1; 
统计第一天在线用户量
bitcount mon
有三个用户登录

第一天有三个用户登录

第二天

userId=9999,userId=7777的用户登录了

setbit thus 9999 1;       
setbit thus 7777 1;
获取userId=7777用户在线状态
getbit thus 7777
7777用户处于登录状态
第三天

userId=9999,userId=6666的用户登录了

setbit web 9999 1;       
setbit web 6666 1;
获取三天都登录的用户数
bitop and resultand mon thus web;
获取三天都登录的用户数
获取三天内登陆过的用户数
bitop or resultor mon thus web;
获取三天内登陆过的用户数

redis使用位图法记录在线用户的状态就为大家说到这里,欢迎大家来交流,指出文中一些说错的地方,让我加深认识。
谢谢大家!

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,281评论 19 139
  • 1、redis是什么: Redis is an open source, BSD licensed, advanc...
    huangxiongbiao阅读 5,592评论 0 2
  • 亲历灵异事件 作者 / 狼烟诗影 我是一个喜欢新事物的人,喜欢故事,喜欢历史,...
    狼烟诗影阅读 4,863评论 2 4
  • 简书新居改旧诗,遥看断桥题咏时。 风骚盛况连波起,法博闲话自成席。 诸友争题题不限,依韵续句句有奇。 接龙互先残荷...
    夜语可书阅读 5,449评论 57 51

友情链接更多精彩内容