Skip to content

bitmap/hyperloglog/GEO应用

1. bitmap应用

1.1 常见需求

  1. 日活统计
  2. 连续签到打卡
  3. 最近一周的活跃用户
  4. 统计指定用户一年之中的登陆天数
  5. 某用户按照一年365天,哪几天登陆过? 哪几天没有登陆?全年中登录的天数共计多少?
  6. 京东签到领取京豆

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. 需求1
    统计单日一个页面的访问量(PV),单次访问就算一次
  2. 需求2
    统计单日一个页面的用户访问量(UV),即按照用户为维度计算,单个用户一天内多次访问也只算一次。
  3. 需求3
    某个门户网站的所有模块的PV聚合统计。

2.3 基数统计应用

基数:是一种数据集,去重复后的真实个数。所谓基数统计,就是用于统计一个集合中不重复的元素个数,就是对集合去重复后剩余元素的计算。
常用的解决办法:

  1. 使用java中的HashSet对象
  2. 使用redis中的bitmap类型
  3. 使用redis中的HyperLoqLog类型

第一种和第二种方案,如果我们统计的样本越大,内存消耗就急剧增大,而且效率低下。
使用HyperLoqLog类型其实使用的是概率算法,在Redis里面,每个HyperLoqLog键只需要花费12KB内存,就可以计算接近2^64个不同元素的基数。原因在于只是进行不重复的基数统计,不是集合也不保存数据,只记录数量而不是具体内容。Hyperloglog提供不精确的去重计数方案,牺牲准确率来换取空间,误差仅仅只是0.81%左右

3. GEO应用

3.1 常见术语

  1. 经度(longitude):东经为正数,西经为负数。 2,纬度(latitude):北纬为正数,南纬为负数。最长的纬线就是赤道。

获得某个地址的经纬度:http://api.map.baidu.com/lbsapi/getpoint/

3.2 常见需求

移动互联网时代LBS应用越来越多,交友软件中附近的小姐姐、外卖软件中附近的美食店铺、打车软件附近的车辆等等。