高级Redis之HyperLogLog的用法示例

news/2024/7/8 5:21:05 标签: redis, 数据库

HyperLogLog是 Redis 提供的一种基数估计算法数据结构,主要用于估算不重复元素的数量。它能够在使用非常少的内存空间的情况下,快速和高效地进行去重计数操作。HyperLogLog 的误差率约为 0.81%,在处理大数据量的场景下非常有用。

例如使用 Redis 的 HyperLogLog 数据结构来存储和统计用户的购物足迹是一个很好的应用场景。例如,当你想记录每天有多少不同的用户访问了你的某个商品或页面时,可以使用 HyperLogLog 来实现这一需求,这样可以有效地减少内存的使用。

下面是一个使用 Java 和 Lettuce 客户端库来实现用户购物足迹记录和统计的示例代码。

环境准备

  1. 确保 Redis 服务器已启动。
  2. 在你的 Java 项目中添加 Lettuce 依赖。

pom.xml 文件中添加 Lettuce 依赖:

<dependency>
    <groupId>io.lettuce.core</groupId>
    <artifactId>lettuce-core</artifactId>
    <version>6.1.5</version>
</dependency>

实现示例:记录和统计购物足迹

功能描述
  • 每个用户访问一个商品时,记录该用户的访问行为。
  • 统计每天有多少不同的用户访问了某个商品。

示例代码

import io.lettuce.core.RedisClient;
import io.lettuce.core.api.StatefulRedisConnection;
import io.lettuce.core.api.sync.RedisCommands;

import java.time.LocalDate;
import java.util.UUID;

public class ShoppingFootprintExample {

	//配置信息建议写在yml当中
    private static final String REDIS_URI = "redis://localhost:6379";

    public static void main(String[] args) {
        // 创建Redis客户端
        RedisClient redisClient = RedisClient.create(REDIS_URI);
        try (StatefulRedisConnection<String, String> connection = redisClient.connect()) {
            RedisCommands<String, String> syncCommands = connection.sync();

            String product = "product123"; // 商品ID
            String currentDate = LocalDate.now().toString(); // 当前日期
            String key = "product:footprint:" + product + ":" + currentDate;

            // 模拟用户访问商品
            simulateUserVisits(syncCommands, key);

            // 统计当天访问该商品的独立用户数
            long uniqueVisitors = getUniqueVisitors(syncCommands, key);
            System.out.println("Unique visitors for " + product + " on " + currentDate + ": " + uniqueVisitors);
        }

        // 关闭客户端
        redisClient.shutdown();
    }

    // 模拟用户访问商品
    private static void simulateUserVisits(RedisCommands<String, String> commands, String key) {
        for (int i = 0; i < 100; i++) {
            String userId = "user" + UUID.randomUUID().toString();
            recordUserVisit(commands, key, userId);
        }
    }

    // 记录用户访问
    private static void recordUserVisit(RedisCommands<String, String> commands, String key, String userId) {
        commands.pfadd(key, userId);
        System.out.println("Recorded visit for user " + userId);
    }

    // 统计独立用户数
    private static long getUniqueVisitors(RedisCommands<String, String> commands, String key) {
        return commands.pfcount(key);
    }
}
代码解释
  1. 连接 Redis

    • 创建 RedisClient 并连接到 Redis 服务器。
    • 获取同步命令接口 RedisCommands
  2. 模拟用户访问商品

    • 方法 simulateUserVisits 用于模拟100个用户访问某个商品。每个用户的ID生成方式使用 UUID 确保唯一性。
    • 方法 recordUserVisit 使用 pfadd 命令记录用户访问行为,将用户ID添加到 HyperLogLog。
  3. 统计独立用户数

    • 方法 getUniqueVisitors 使用 pfcount 命令,统计当天访问该商品的独立用户数。

运行结果

运行代码后,你应能看到类似以下的输出:

Recorded visit for user user1d21c597-3c4b-447d-aceb-971499a5e1e4
Recorded visit for user user9f0b3bd0-410d-44a7-b538-6d2f43b75e20
...
Unique visitors for product123 on 2023-07-20: 100

实际应用中的注意事项

  • 数据存储管理:在生产环境中,可以将每天的用户访问数据存入不同的 Redis 键中以便统计。可以使用日期作为键的一部分来区分每天的数据,比如 product:footprint:${productId}:${date}
  • 数据清理:定期清理过期的数据以节省内存。如用 EXPIRE 命令设置键的过期时间,自动清除过期数据。
  • 误差控制:HyperLogLog 有一定的误差(约 0.81%),在统计大规模数据时效果很好,但在对误差严格的场景下需谨慎使用。

结论

使用 Redis 的 HyperLogLog 数据结构可以高效地记录和统计用户的购物足迹,有效减少内存占用。通过结合 Lettuce 客户端库,可以方便地在 Java 应用中实现这些功能。希望这个示例对你有所帮助,让你更好地理解和应用 HyperLogLog 数据结构。


http://www.niftyadmin.cn/n/5536610.html

相关文章

大数据面试题之Flume

目录 介绍下Flume Flume架构 Flume有哪些Source 说下Flume事务机制 介绍下Flume采集数据的原理&#xff1f;底层实现&#xff1f; Flume如何保证数据的可靠性 Flume传输数据时如何保证数据一致性&#xff08;可靠性&#xff09; Flume拦截器 如何监控消费型Flu…

EasyBoss ERP移动端上线数据分析模块,随时查Shopee/TikTok本土店数据

前段时间&#xff0c;EasyBoss ERP出了个超酷炫的数字大屏功能&#xff0c;广受好评。 但是也有老板说&#xff0c;电脑端看数据不够方便啊&#xff0c;你们EasyBoss有本事上个手机就能看数据的功能啊&#xff01; 说干就干&#xff0c;直接满足你们的需求&#xff01; 于是在…

mapper.xml 文件对应的 Dao 接口原理

在 Java 框架如 MyBatis 中&#xff0c;Mapper.xml 文件是用于定义 SQL 查询的配置文件&#xff0c;而对应的 Dao 接口&#xff08;Mapper 接口&#xff09;则提供了与 XML 文件中的 SQL 查询相对应的方法。这种设计模式使得 Java 代码与 SQL 语句解耦&#xff0c;提高了代码的…

009、MongoDB的分片策略

目录 MongoDB的分片策略:范围分片vs哈希分片 1. 范围分片(Range Sharding) 1.1 工作原理 1.2 优点 1.3 缺点 1.4 研究支持 2. 哈希分片(Hash Sharding) 2.1 工作原理 2.2 优点 2.3 缺点 2.4 研究支持 3. 选择合适的分片策略 4. 实践案例 4.1 电子商务平台 4.2 社…

vue+openlayers之几何图形交互绘制基础与实践

文章目录 1.实现效果2.实现步骤3.示例页面代码3.基本几何图形绘制的关键代码 1.实现效果 绘制点、线、多边形、圆、正方形、长方形 2.实现步骤 引用openlayers开发库。加载天地图wmts瓦片地图。在页面上添加几何图形绘制的功能按钮&#xff0c;使用下拉列表&#xff08;sel…

Proteus-51单片机-DS18B20多点测温

DS18B20多点测温 一、Proteus仿真演示 每个DS18B20都有一个唯一的64位序列号,这使得在同一总线上可以挂载多个传感器,无需额外的地址分配。主机(通常为单片机)通过特定的时序控制,可以依次读取各个DS18B20的温度数据,实现分布式测温。 主机通过RS485接口可以分别获取从机…

谷粒商城学习-09-配置Docker阿里云镜像加速及各种docker问题记录

文章目录 一&#xff0c;配置Docker阿里云镜像加速二&#xff0c;Docker安装过程中的几个问题1&#xff0c;安装报错&#xff1a;Could not resolve host: mirrorlist.centos.org; Unknown error1.1 检测虚拟机网络1.2 重设yum源 2&#xff0c;报错&#xff1a;Could not fetch…

商用车水箱浮球液位开关

商用车水箱浮球液位开关概览 商用车水箱浮球液位开关是一种用于监测商用车辆水箱液位的设备&#xff0c;它可以有效地控制和监控水箱中的水位&#xff0c;确保车辆的正常运作。这种液位开关通常安装在水箱内部&#xff0c;通过浮球和磁性原理来感知液位的变化&#xff0c;并通…