bitmap/hyperloglog/GEO应用
1. bitmap应用
1.1 常见需求
- 日活统计
- 连续签到打卡
- 最近一周的活跃用户
- 统计指定用户一年之中的登陆天数
- 某用户按照一年365天,哪几天登陆过? 哪几天没有登陆?全年中登录的天数共计多少?
- 京东签到领取京豆
1.2 功能实现
sh
## 存入数据, offset从0开始 value只能是0或者1
setbit key offset value
bicount key
offset没有最大多少的概念,如果你一周那就是0~6,如果你想作为下一章的布隆过滤器,那就可以0~2^32那么大。
2. hyperloglog应用
2.1 常见术语
UV: Unique Visitor,独立访客,一般理解为客户端IP。
PV: Page View,页面浏览量。
DAU: Daily Active User, 日活跃用户量。登录或者使用了某个产品的用户数(去重复登录的用户)。
MAU: Monthly Active User, 月活跃用户量。
2.2 常见需求
- 需求1
统计单日一个页面的访问量(PV),单次访问就算一次 - 需求2
统计单日一个页面的用户访问量(UV),即按照用户为维度计算,单个用户一天内多次访问也只算一次。 - 需求3
某个门户网站的所有模块的PV聚合统计。
2.3 基数统计应用
基数:是一种数据集,去重复后的真实个数。所谓基数统计,就是用于统计一个集合中不重复的元素个数,就是对集合去重复后剩余元素的计算。
常用的解决办法:
- 使用java中的HashSet对象
- 使用redis中的bitmap类型
- 使用redis中的HyperLoqLog类型
第一种和第二种方案,如果我们统计的样本越大,内存消耗就急剧增大,而且效率低下。
使用HyperLoqLog类型其实使用的是概率算法,在Redis里面,每个HyperLoqLog键只需要花费12KB内存,就可以计算接近2^64个不同元素的基数。原因在于只是进行不重复的基数统计,不是集合也不保存数据,只记录数量而不是具体内容。Hyperloglog提供不精确的去重计数方案,牺牲准确率来换取空间,误差仅仅只是0.81%左右
3. GEO应用
3.1 常见术语
- 经度(longitude):东经为正数,西经为负数。 2,纬度(latitude):北纬为正数,南纬为负数。最长的纬线就是赤道。
获得某个地址的经纬度:http://api.map.baidu.com/lbsapi/getpoint/
3.2 常见需求
移动互联网时代LBS应用越来越多,交友软件中附近的小姐姐、外卖软件中附近的美食店铺、打车软件附近的车辆等等。