用于存储地理位置信息,它允许用户进行各种基于地理位置的操作,如查询附近的位置、计算两个地点之间的距离等
用法:
- GEOADD key longitude latitude member:向key对应的GEO集合里添加带有经纬度的成员member。其中经纬度是浮点数
- GEOPOS key member [member...] :返回一个或多个成员的地理坐标
- GEODIST key member1 member2 [unit]:计算两个成员之间的距离。unit 是可选的距离单位参数,默认为米(m)
- GEOHASH key member [member ...] - 返回一个或多个成员的Geohash表示
- GEORADIUS key longitude latitude radius unit [WITHCOORD] [WITHDIST] [WITHHASH] - 查询给定位置周围指定半径内的所有成员
GEORADIUS myGeoSet 116.407526 39.904030 500 km WITHCOORD WITHDIST WITHHASH
业务场景
唯一用户访问统计
非常适合用来统计一段时间内访问网站或应用的唯一用户数量
背景:在新闻门户网站,需要统计每天访问的唯一用户数量,以此评估用户基础和内容的吸引力
优点:
- 空间占用小
- 提供近似但是非常准确的基数估计
- 高并发情况下也有高性能
当你使用
<font style="background-color:rgba(255, 255, 255, 0);">PFADD</font>
命令向 HyperLogLog 添加一个元素时,Redis 会内部处理这个元素,并更新 HyperLogLog 的状态。如果该元素是第一次被添加到 HyperLogLog 中,它会改变 HyperLogLog 的计数;如果该元素已经存在于 HyperLogLog 中,Redis 会识别出来,并且不会重复计数。
事件独立性分析
可以用于分析不同事件的独立性,例如不同来源的点击事件是否来自相同的用户群体
具体案例:
在广告平台分析不同广告来源的点击事件是否由相同的用户群体产生
优点:
- 多集合统计:可以独立统计不同事件的基数
- 合并分析
// 记录点击事件
func recordClickEvent(clickID string, sourceID string) {
sourceSetKey := "clicks:" + sourceID
// 向对应来源的HyperLogLog中添加点击ID
rdb.PFAdd(ctx, sourceSetKey, clickID)
}
// 合并点击事件集合并分析用户群体独立性
func analyzeAudienceIndependence(sourceIDs []string) int64 {
destKey := "mergedClicks"
// 合并所有来源的HyperLogLog集合
rdb.PFMerge(ctx, destKey, sourceIDs)
// 计算合并后的基数
count, _ := rdb.PFCount(ctx, destKey).Result()
return count
}
注意事项:
- 提供的是近似值,对于大多数场景来说足够准确
- 不适合于精确计数或小规模数据集的统计
- 可以安全的把多个HyperLogLog集合合并,合并操作不会增加内存使用量,并且结果是一个更准确的基数估计
- 在设计使用HyperLogLog的场景时,应考虑数据的更新频率和集合的数量,以确保性能和准确性。