Java基于队列和数据库批量维护用户在线离线状态和位置信息
目录 前言介绍 用户数据迁移 用户状态数据批量处理 队列数据批量消费 前言介绍 系统用户实时位置都保存在redis中,我们采用redis过期方式来监听用户位置离线,离线的用户key会放入对应的队列进行消费(这里的队列可以是Java队列也可以是RabbitMQ之类的消息中间件,我们采用的是ConcurrentLinkedQueue)。项目中对用户实时位置有两个要求(特殊行业对人员位置安全规范的要求): a.用户最后一次经纬度实时位置更新到数据库 b.用户离线后更新用户在线状态 为了解决每次用户位置心跳更新导致数据库连接不足问题,我采用了批量更新的方式来解决大批量的用户上线和离线更新。解决了如下问题: a.解决用户状态表统计数据不一致问题 b.解决数据库更新占用数据库连接过多问题(可实现批量更新上线状态位置和离线状态,最后一次位置保存更新降低数据库压力) c.解决redis和database在线状态延迟过大问题 用户数据迁移 针对需要维护最后用户在线位置数据的这类用户,我们有单独用户角色加以限定。这种用户只需要简单将数据做个分表保存起来就可以了。首次初始化这类数据是根据已有用户数据直接采用SQL 支持的SELECT [A,B,....] INTO TABLE_SUB FROM TABLE_MAIN 示例脚本如下: -- 注意:======依赖触发器更新用户信息===== -- 修改目的