高级Redis之HyperLogLog的用法示例

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.mfbz.cn/a/773208.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

企业数据API平台:获取企业多维度信息

数据API平台是指提供一系列预先定义的接口、协议与工具&#xff0c;允许不同应用程序或系统之间进行数据交换和通信的平台。这些接口被称为数据API&#xff08;Data Application Programming Interface&#xff09;&#xff0c;是数据管理系统或应用程序提供的一组开放式接口。…

Linux手动安装JDK1.8

1、下载要安装的jdk安装包文件 官网下载地址&#xff1a;https://www.oracle.com/cn/java/technologies/downloads/ 2、上传jdk安装包至要安装服务器 3、在要安装jdk位置使用命令解压安装包 安装路径: /usr/local/java 解压安装包&#xff0c;解压命令 tar -zxvf /install…

【博客21】缤果Qt5仿小米耳机APP布局_PC端软件(高级篇)

小米耳机 备注&#xff1a;此软件只是简单的实现布局和界面跳转逻辑, 并未加入小米协议相关内容,因需要鉴权方式验证,故无法进行通讯编程. 开发工具: qt-opensource-windows-x86-5.14.2 (编程语言C) Android反编译工具: apktool 小米小爱开放平台 - 语音服务平台 - 文档中…

3-1 激活函数和神经网络思想

3-1 激活函数和神经网络思想 主目录点这里

android应用的持续构建CI(四)-- 依赖环境(兼容多版本的gradle和jdk)

一、背景 android应用的构建前提是&#xff0c;安装好了gradle和jdk。在实际使用的过程中&#xff0c;不同的android应用&#xff0c;对gradle和jdk的版本要求不一。 于是&#xff0c;在jenkins服务器上&#xff0c;我们需要安装多种版本的gradle和jdk。 安装过jdk的小伙伴应…

Jenkins 使用 Publish over SSH进行远程访问

Publish over SSH 是 Jenkins 的一个插件,可以让你通过 SSH 将构建产物分发到远程服务器。以下是如何开启 Publish over SSH 的步骤: 一、安装 Publish over SSH 插件 在 Jenkins 中,进入 "Manage Jenkins" > "Manage Plugins"。选择 "Availab…

【spring MVC的执行流程】

SpringMVC可以说是Servlet的封装&#xff0c;屏蔽了Servlet的很多细节&#xff0c;比如Servlet再获取参数的时候需要不停地getParameter,现在只要在SpringMVC方法定义对应的JavaBean&#xff0c;只要属性和参数名一致&#xff0c;SpringMVC就可以帮我们实现将参数封装到JavaBea…

基础扫盲:js作用域及其优先级,有示例代码。

在 JavaScript 中&#xff0c;作用域指的是变量和函数的可访问性和可见性。 JavaScript 中的作用域有以下几种&#xff1a; 1. 全局作用域&#xff08;Global Scope&#xff09;&#xff1a;全局作用域是指在代码中任何地方都可以访问的作用域。在全局作用域中声明的变量和函数…

DFS之连通性模型——AcWing 1112. 迷宫

DFS之连通性模型 定义 DFS&#xff08;深度优先搜索&#xff0c;Depth-First Search&#xff09;之连通性模型主要用于图论问题中判断图的连通性&#xff0c;即确定图中的所有节点是否可以通过边相互到达。 DFS&#xff08;深度优先搜索&#xff0c;Depth-First Search&…

深度学习——深度学习中感受野的计算

感受野 在卷积神经网络&#xff08;CNN&#xff09;中&#xff0c;感受野&#xff08;Receptive Field&#xff09; 是一个非常重要的概念。它描述了网络中某一层的输出&#xff08;通常是特征图上的一个像素点&#xff09;所对应的输入图像上的空间范围。这个范围代表了该输出…

Jelly Merge | Template + Editor(休闲益智游戏包)

Jelly Merge是Watermelon Games开发的一款完整游戏。 这款完全可定制的益智游戏具有简单但超级有趣的游戏玩法。 您下一次成功的完美起点&#xff01; 我们的优势 &#x1f9d1;&#x1f3fb;‍&#x1f4bb; 不和谐支持 &#x1f5c3;️ 详细文档 &#x1f6e0;️易于使用的工…

C# WPF 3D 数据孪生 系列六

数字孪生应用开发 应用开发中的布局需求 Grid基本使用 WPF 3D绘图 点云 系列五-CSDN博客 WPF UI 3D 多轴 机械臂 stl 模型UI交互-CSDN博客 WPF UI 3D 基本概念 点线三角面 相机对象 材质对象与贴图 3D地球 光源 变形处理 动作交互 辅助交互插件 系列三-CSDN博客 数字孪生 介…

【堆 优先队列】23. 合并 K 个升序链表

本文涉及知识点 堆 优先队列 LeetCode23. 合并 K 个升序链表 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 1&#xff1a; 输入&#xff1a;lists [[1,4,5],[1,3,4],[2,6]] 输出&#…

本地Windows电脑 连接 Windows 服务器

Windows电脑 连接 Windows 服务器 方式1&#xff1a;直接搜索 在电脑的搜索栏&#xff0c;输入“远程桌面连接” 可以选择点击 “打开” 或者直接按 回车键 “Enter”&#xff0c;打开 远程桌面连接 方式2&#xff1a;运行框打开服务器连接 同时按&#xff1a;Windows徽标键…

【BUUCTF-PWN】10-bjdctf_2020_babystack

简单的栈溢出&#xff0c;ret2text 64位&#xff0c;开启了NX保护 执行效果&#xff1a; main函数&#xff1a; 因为读入的字符长度可以由用户输入的第一个参数值决定&#xff0c;因此read函数存在栈溢出 覆盖距离为0x108 存在后门函数&#xff1a; 后门函数地址0x4…

Vulnhub靶场DC-5练习

目录 0x00 准备0x01 主机信息收集0x02 站点信息收集0x03 漏洞查找与利用1. 利用burpsuite爆破文件包含的参数2. 文件包含3. nginx日志挂马4. 反弹shell5.漏洞利用和提权 0x04 总结 0x00 准备 下载链接&#xff1a;https://download.vulnhub.com/dc/DC-5.zip 介绍&#xff1a; …

(十三)MipMap

MipMap概念 滤波 采样 mipmap级别判定 问题&#xff1a;opengl如何判定应该使用下一级的mipmap呢&#xff1f; 通过glsl中的求偏导函数计算变化量决定 手动实现mipmap原理 1、生成mipmap的各个级别 2、修改vertexShader使得三角形随着时间变小 **** 需要更改Filter才能…

《昇思25天学习打卡营第8天|模型训练》

文章目录 今日所学&#xff1a;一、构建数据集二、定义神经网络模型三、了解超参、损失函数和优化器1. 超参2. 损失函数3. 优化器 四、训练与评估总结 今日所学&#xff1a; 在今天这一节我主要学习了模型的训练&#xff0c;知道了模型训练一般分为四个步骤&#xff1a; 构建…

[C++]——同步异步日志系统(2)

同步异步日志系统 一、 不定参函数1.1 不定参宏函数的使用1.2 C 语言中不定参函数的使用1.3 C不定参数使用 二、设计模式2.1 单列模式2.2 工厂模式2.3 建造者模式2.4 代理模式 在我们开发同步异步日志系统之前&#xff0c;需要了解一些相关的技术知识。 一、 不定参函数 在初学…

华为OD机试 - 考古学家 - 递归(Java 2024 D卷 200分)

华为OD机试 2024D卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;D卷C卷A卷B卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测…