如何处理亿级用户的登录状态查询
假如系统需要统计一个上亿级别的的用户在线状态
方案一:
在数据库的基础上增加一个缓存,然后把登录状态存到redis里,在redis中去定义set类型的key,主要用来存储记录登录用户的ID。现在我们假设这个key叫login_user,如果用户登录,就往login_user中增加这个用户的id,如果用户登出就把这个key从set中删去,然后再用scard命令来统计set中的用户id的数量。
(但是这个方法对内存的消耗会有点大)
方案二:
使用redis的bitmap来存储数据,bitmap本身就是为了亿级数据而诞生的,可以使用他的几个命令,如setbit、getbit和bigcount,用户登录可以用setbit命令去设置一个key为login_status的内容,然后将用户id作为一个位移值,将这个值设为1,即状态为1,那么当用户登出的时候,我们可以使用setbit命令将其状态改为0,如果是判断某个用户是否在线,可以使用getbit命令,如果是统计登录用户数量,可以使用bigcount来进行统计
(此方法优点是快,去重查重效率高,缺点是bitmap的位移值只能是数字,用户id也只能是自增的纯数字id,不适合分布式架构)
如果是实现热力地图
则可以使用redis的GEO,使用geoadd、geopos和geohash这些命令
当然,现在使用es的GEO更省事,如果加上ELK组合,则可以直接生成
评论