关于redis:SpringBoot-DB-系列Redis-高级特性之-HyperLoglog

40次阅读

共计 2240 个字符,预计需要花费 6 分钟才能阅读完成。

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

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

<!– more –>

I. 根本应用

1. 配置

咱们应用 SpringBoot 2.2.1.RELEASE来搭建我的项目环境,间接在 pom.xml 中增加 redis 依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

如果咱们的 redis 是默认配置,则能够不额定增加任何配置;也能够间接在 application.yml 配置中,如下

spring:
  redis:
    host: 127.0.0.1
    port: 6379
    password:

2. 应用姿态

咱们下来看应用姿态,原理放在前面阐明

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

a. add

增加一条记录

public boolean add(String key, String obj) {
    // pfadd key obj
    return stringRedisTemplate.opsForHyperLogLog().add(key, obj) > 0;
}

b. pfcount

非精准的计数统计

public long count(String key) {
    // pfcount 非精准统计 key 的计数
    return stringRedisTemplate.opsForHyperLogLog().size(key);
}

a. merge

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

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. 我的项目

系列博文

  • 【DB 系列】Redis 高级个性之公布订阅
  • 【DB 系列】Redis 高级个性之 Bitmap 应用姿态及利用场景介绍
  • 【DB 系列】Redis 之管道 Pipelined 应用姿态
  • 【DB 系列】Redis 集群环境配置
  • 【DB 系列】借助 Redis 搭建一个简略站点统计服务(利用篇)
  • 【DB 系列】借助 Redis 实现排行榜性能(利用篇)
  • 【DB 系列】Redis 之 ZSet 数据结构应用姿态
  • 【DB 系列】Redis 之 Set 数据结构应用姿态
  • 【DB 系列】Redis 之 Hash 数据结构应用姿态
  • 【DB 系列】Redis 之 List 数据结构应用姿态
  • 【DB 系列】Redis 之 String 数据结构的读写
  • 【DB 系列】Redis 之 Jedis 配置
  • 【DB 系列】Redis 之根本配置

工程源码

  • 工程:https://github.com/liuyueyi/spring-boot-demo
  • 我的项目源码: https://github.com/liuyueyi/spring-boot-demo/tree/master/spring-boot/122-redis-template

1. 一灰灰 Blog

尽信书则不如,以上内容,纯属一家之言,因集体能力无限,不免有疏漏和谬误之处,如发现 bug 或者有更好的倡议,欢送批评指正,不吝感谢

上面一灰灰的集体博客,记录所有学习和工作中的博文,欢送大家前去逛逛

  • 一灰灰 Blog 集体博客 https://blog.hhui.top
  • 一灰灰 Blog-Spring 专题博客 http://spring.hhui.top

正文完
 0