前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【SpringBoot DB 系列】Redis 高级特性之 HyperLoglog

【SpringBoot DB 系列】Redis 高级特性之 HyperLoglog

作者头像
一灰灰blog
发布2020-11-03 11:42:58
7080
发布2020-11-03 11:42:58
举报
文章被收录于专栏:小灰灰

【SpringBoot DB 系列】Redis 高级特性之 HyperLoglog

hyperloglog 算法,利用非常少的空间,实现比较大的数据量级统计;比如我们前面在介绍 bitmap 的过程中,说到了日活的统计,当数据量达到百万时,最佳的存储方式是 hyperloglog,本文将介绍一下 hyperloglog 的基本原理,以及 redis 中的使用姿势

<!-- more -->

I. 基本使用

1. 配置

我们使用 SpringBoot 2.2.1.RELEASE来搭建项目环境,直接在pom.xml中添加 redis 依赖

代码语言:javascript
复制
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

如果我们的 redis 是默认配置,则可以不额外添加任何配置;也可以直接在application.yml配置中,如下

代码语言:javascript
复制
spring:
  redis:
    host: 127.0.0.1
    port: 6379
    password:

2. 使用姿势

我们下来看使用姿势,原理放在后面说明

redis 中,hyperlolog使用非常简单,一般就两个操作命令,添加pfadd + 计数pfcount;另外还有一个不常用的merge

a. add

添加一条记录

代码语言:javascript
复制
public boolean add(String key, String obj) {
    // pfadd key obj
    return stringRedisTemplate.opsForHyperLogLog().add(key, obj) > 0;
}
b. pfcount

非精准的计数统计

代码语言:javascript
复制
public long count(String key) {
    // pfcount 非精准统计 key的计数
    return stringRedisTemplate.opsForHyperLogLog().size(key);
}
a. merge

将多个 hyperloglog 合并成一个新的 hyperloglog;感觉用的场景并不会特别多

代码语言:javascript
复制
public boolean merge(String out, String... key) {
    // pfmerge out key1 key2  ---> 将key1 key2 合并成一个新的hyperloglog out
    return stringRedisTemplate.opsForHyperLogLog().union(out, key) > 0;
}

3. 原理说明

关于 HyperLogLog 的原理我这里也不进行详细赘述,说实话那一套算法以及调和平均公式我自己也没太整明白;下面大致说一下我个人的朴素理解

Redis 中的 HyperLogLog 一共分了2^14=16384个桶,每个桶占 6 个 bit

一个数据,塞入 HyperLogLog 之前,先 hash 一下,得到一个 64 位的二进制数据

  • 取低 14 位,用来定位桶的 index
  • 高 50 位,从低到高数,找到第一个为 1 出现的位置 n
    • 若桶中值 > n,则丢掉
    • 反之,则设置桶中的值为 n

那么怎么进行计数统计呢?

  • 拿所有桶中的值,代入下面的公式进行计算

上面这个公式怎么得出的?

之前看到一篇文章,感觉不错,有兴趣了解原理的,可以移步: https://www.jianshu.com/p/55defda6dcd2

4. 应用场景

hyperloglog通常是用来非精确的计数统计,前面介绍了日活统计的 case,当时使用的是 bitmap 来作为数据统计,然而当 userId 分散不均匀,小的特别小,大的特别大的时候,并不适用

在数据量级很大的情况下,hyperloglog的优势非常大,它所占用的存储空间是固定的2^14 下图引用博文《用户日活月活怎么统计》

使用 HyperLogLog 进行日活统计的设计思路比较简单

  • 每日生成一个 key
  • 某个用户访问之后,执行 pfadd key userId
  • 统计总数: pfcount key

II. 其他

0. 项目

系列博文

工程源码

1. 一灰灰 Blog

尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现 bug 或者有更好的建议,欢迎批评指正,不吝感激

下面一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • I. 基本使用
    • 1. 配置
      • 2. 使用姿势
        • a. add
        • b. pfcount
        • a. merge
      • 3. 原理说明
        • 4. 应用场景
        • II. 其他
          • 0. 项目
            • 1. 一灰灰 Blog
            相关产品与服务
            云数据库 Redis
            腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档