上亿在线用户维护最高效的设计思想,二进制位存储变更的应用场景
2017-08-21 17:10
381 查看
应用场景:在某大型互联网公司,有上亿的用户,要统计当前用户的在线人数和在线用户id,最快的实现方法是什么?
答:一般情况下,我们都使用数据库字段在用户登陆状态发生变更时进行变更,查找在线人数和在线用户id都是用select的方式。但是这种方式在实际中,调取速度非常慢,效率比较低,时效性差。
在redis中,我们知道setbit,bitcount等方法,可以直接对二进制位进行存储和变更,以及计数,根据这些我们讲述一下它的实现思想。
setbit(name,offset,value),对name对应值的二进制表示的位进行操作。参数offset,位的索引(将值变换成二进制后再进行索引,起始位0);value,值只能是1或0。
getbit(name,offset),获取name对应值的二进制表示中的某位的值(0或1)。
bitcount(key,start=None,end=None),获取name对应的值的二进制表示中1的个数。参数key,Redis的name;参数start,位起始位置;参数end,位结束位置。
注意:
通过在redis中实际检查,我们确认了以下的情况:
1.参数offset的索引的起始位为0;
2.getbit中,超出参数name指定的字符串值的索引的对应位的默认值均为0
3.在setbit中我们可以设置超出指定字符串位的索引位的相应的位值。
通过上面的实现,我们了解到我们可以在数据库中通过字段的变更和查看,我们为了维护上亿的用户的信息,提升其调用效率和速度,我们可以使用二进制位的设定。
设置一个key,如state_code,如果用户登陆,就通过“setbit state_code offset 1” 来改变用户的登陆状态(offset用唯一的用户id来指定,字符位为1的代表用户为登陆状态,0为离线状态)。
注:想要获取字符串的二进制位,可以先将其转成ascii码(ord()),再将ascii码转换成二进制位(bin())。如:ord('a'),返回97;bin(97),返回0b1100001。
通过上面的命令,我们可以发现,我们设置了用户id为0,8,10000000和1000000000的登陆状态为登陆状态(位值为1)。
再通过bitcount我们可以清楚地掌握当前的在线用户数。
想要了解当前的在线用户的id,我们可以通过for循环实现,将位值为1的依次打印出来即可。
有点:效率大大提升,10M就能存下10*1024*1024*8=83886080 八千多万的用户的登陆id和在线用户数,相对于数据库字段的调用,无论是存储,写入,修改,读取的速度都大为提升。
答:一般情况下,我们都使用数据库字段在用户登陆状态发生变更时进行变更,查找在线人数和在线用户id都是用select的方式。但是这种方式在实际中,调取速度非常慢,效率比较低,时效性差。
在redis中,我们知道setbit,bitcount等方法,可以直接对二进制位进行存储和变更,以及计数,根据这些我们讲述一下它的实现思想。
setbit(name,offset,value),对name对应值的二进制表示的位进行操作。参数offset,位的索引(将值变换成二进制后再进行索引,起始位0);value,值只能是1或0。
getbit(name,offset),获取name对应值的二进制表示中的某位的值(0或1)。
bitcount(key,start=None,end=None),获取name对应的值的二进制表示中1的个数。参数key,Redis的name;参数start,位起始位置;参数end,位结束位置。
注意:
通过在redis中实际检查,我们确认了以下的情况:
1.参数offset的索引的起始位为0;
2.getbit中,超出参数name指定的字符串值的索引的对应位的默认值均为0
3.在setbit中我们可以设置超出指定字符串位的索引位的相应的位值。
通过上面的实现,我们了解到我们可以在数据库中通过字段的变更和查看,我们为了维护上亿的用户的信息,提升其调用效率和速度,我们可以使用二进制位的设定。
设置一个key,如state_code,如果用户登陆,就通过“setbit state_code offset 1” 来改变用户的登陆状态(offset用唯一的用户id来指定,字符位为1的代表用户为登陆状态,0为离线状态)。
注:想要获取字符串的二进制位,可以先将其转成ascii码(ord()),再将ascii码转换成二进制位(bin())。如:ord('a'),返回97;bin(97),返回0b1100001。
通过上面的命令,我们可以发现,我们设置了用户id为0,8,10000000和1000000000的登陆状态为登陆状态(位值为1)。
再通过bitcount我们可以清楚地掌握当前的在线用户数。
想要了解当前的在线用户的id,我们可以通过for循环实现,将位值为1的依次打印出来即可。
有点:效率大大提升,10M就能存下10*1024*1024*8=83886080 八千多万的用户的登陆id和在线用户数,相对于数据库字段的调用,无论是存储,写入,修改,读取的速度都大为提升。
相关文章推荐
- 单例设计模式 (应用场景,存储一些共享信息,每个对象都能访问修改.某类的创建非常消耗性能,设计成单例,提高性能)
- 前端通信:SSE设计方案(二)--- 服务器推送技术的实践以及一些应用场景的demo(包括在线及时聊天系统以及线上缓存更新,代码热修复案例)
- Activity生命周期交互设计思想和应用场景(附源码)
- 设计模式应用场景举例
- 为应用场景设计移动产品
- web在线打印,打印阅览,打印维护,打印设计
- CSDN专访EnableQ在线调查引擎创作团队—软件是为用户而设计的,不是为程序员使用的
- web在线打印,打印阅览,打印维护,打印设计
- LSM树由来、设计思想以及应用到HBase的索引
- JAVA设计模式的应用场景
- 单表单与多表单应用场景需求\设计\实现\配置\应用
- Java设计模式的应用场景
- 一套海量在线用户的移动端IM架构设计实践分享(含详细图文)
- 设计模式 应用场景
- java设计模式的应用场景
- 用户日志的收集传输存储架构设计讨论
- 06-BCD计数器设计与应用——小梅哥FPGA设计思想与验证方法视频教程配套文档
- 在线用户列表数据结构设计
- 常用设计模式之应用场景/好处在哪儿
- [置顶]游戏引擎开发与应用最佳 实践 【引擎开发篇】 之三 :模块功能描述与设计抽象思想(设计)