1|0需求
2|0分析考虑到只是简单的记录用户是否登录,记录数据比较单一,查询需要精确到天。以百万用户量为前提,前期考虑了几个方案 2|1使用文件使用单文件存储:文件占用空间增长速度快,海量数据检索不方便,Map/Reduce操作也麻烦 使用多文件存储:按日期对文件进行分割。每天记录当天日志,文件量过大 2|2使用数据库不太认同直接使用数据库写入/读取
所以只考虑使用数据库做数据备份。 2|3使用Redis位图(BitMap)这也是在网上看到的方法,比较实用。也是我最终考虑使用的方法, 首先优点: 数据量小:一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身。我们知道8个bit可以组成一个Byte,所以bitmap本身会极大的节省储存空间。1亿人每天的登陆情况,用1亿bit,约1200WByte,约10M 的字符就能表示。 计算方便:实用Redis bit 相关命令可以极大的简化一些统计操作。常用命令 SETBIT、GETBIT、BITCOUNT、BITOP 再说弊端: 存储单一:这也算不上什么缺点,位图上存储只是0/1,所以需要存储其他信息就要别的地方单独记录,对于需要存储信息多的记录就需要使用别的方法了 3|0设计3|1Redis BitMapKey结构:前缀_年Y-月m_用户类型_用户ID
每条BitMap记录单个用户一个月的登录情况,一个bit位表示一天登录情况。
关于获取登录信息,就得获取BitMap然后拆开,循环进行判断。特别涉及时间范围,需要注意时间边界的问题,不要查询出多余的数据 获取数据Redis优先级高于数据库,Redis有的记录不要去数据库获取 Redis数据过期:在数据同步中进行判断,过期时间自己定义(我定义的过期时间单位为“天”,必须大于31)。 在不能保证同步与过期一致性的问题,不要给Key设置过期时间,会造成数据丢失。
所以我把Redis过期数据放到同步时进行判断 我自己想的同步策略(定时每周一凌晨同步):
3|2数据库,表结构每周同步一次数据到数据库,表中一条数据对应一个BitMap,记录一个月数据。每次更新已存在的、插入没有的 3|3暂定接口
4|0CodeTP3中实现的代码,在接口服务器内部库中,Application\Lib\
|
|
来自: JhouShuai > 《大数据高并发高性能》