Flink 热存储维表 使用 Guava Cache 减轻访问压力
目录
背景
Guava Cache 简介
实现方案
1. 项目依赖
2. Guava Cache 集成到 Flink
(1) 定义 Cache
(2) 使用 Cache 优化维表查询
3. 应用运行效果
(1) 维表查询逻辑优化
(2) 减少存储压力
Guava Cache 配置优化
总结
背景
在实时计算场景中,Flink 应用中经常需要通过维表进行维度数据的关联。为了保证关联的实时性,常将维表数据存储在 Redis 或数据库中。然而,这种方案可能会因高频访问导致存储压力过大,甚至出现性能瓶颈。
为了解决这个问题,可以在 Flink 中引入本地缓存。本文介绍如何通过 Google 的开源库 Guava Cache,实现对热存储维表访问的优化。
Guava Cache 简介
Guava Cache 是 Google 开发的一个 Java 缓存工具库,具有以下优点:
- 支持本地缓存,提升查询性能。
- 提供缓存淘汰策略(如基于时间或容量)。
- 线程安全,适合高并发场景。
- 提供监听机制,可在缓存失效时触发回调。
实现方案
1. 项目依赖
在 Maven 项目中引入 Guava 依赖:
<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>31.1-jre</version>
</dependency>
2. Guava Cache 集成到 Flink
以下是一个典型的实现步骤:
(1) 定义 Cache
使用 Guava 提供的 CacheBuilder
创建一个本地缓存:
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;import java.util.concurrent.TimeUnit;public class CacheUtil {private static final Cache<String, String> DIM_CACHE = CacheBuilder.newBuilder().maximumSize(10000) // 最大缓存数量.expireAfterWrite(10, TimeUnit.MINUTES) // 缓存过期时间.build();public static String getFromCache(String key) {return DIM_CACHE.getIfPresent(key);}public static void putToCache(String key, String value) {DIM_CACHE.put(key, value);}
}
(2) 使用 Cache 优化维表查询
在自定义的 RichFlatMapFunction
中使用缓存查询维表数据:
import org.apache.flink.api.common.functions.RichFlatMapFunction;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.util.Collector;public class DimensionJoinFunction extends RichFlatMapFunction<String, String> {@Overridepublic void open(Configuration parameters) throws Exception {// 初始化连接到 Redis 或其他外部存储}@Overridepublic void flatMap(String value, Collector<String> out) throws Exception {String dimKey = extractKey(value);// 1. 先查询缓存String dimValue = CacheUtil.getFromCache(dimKey);// 2. 如果缓存未命中,再查询外部存储if (dimValue == null) {dimValue = queryFromExternalStorage(dimKey);if (dimValue != null) {CacheUtil.putToCache(dimKey, dimValue); // 写入缓存}}// 3. 关联维度数据if (dimValue != null) {String result = enrichData(value, dimValue);out.collect(result);}}private String extractKey(String value) {// 从输入数据中提取维表关联键return value.split(",")[0];}private String queryFromExternalStorage(String key) {// 模拟查询 Redis 或数据库return "mock_value_for_" + key;}private String enrichData(String input, String dimValue) {// 组合维度数据return input + "," + dimValue;}
}
3. 应用运行效果
(1) 维表查询逻辑优化
- 缓存命中时:直接返回缓存数据,访问延迟为纳秒级。
- 缓存未命中时:查询外部存储,并将结果写入缓存,后续重复访问相同的 Key 时不再查询外部存储。
(2) 减少存储压力
Guava Cache 本地缓存避免了大量高频查询直接命中外部存储,降低了 Redis、MySQL 等服务的负载。
Guava Cache 配置优化
-
缓存淘汰策略:
expireAfterWrite
:基于写入时间自动过期。expireAfterAccess
:基于访问时间自动过期。maximumSize
:限制最大缓存数量,避免内存占用过高。
-
异步加载机制: 如果需要异步加载数据,可以使用
CacheLoader
,在缓存未命中时自动加载:Cache<String, String> cache = CacheBuilder.newBuilder().maximumSize(10000).build(new CacheLoader<String, String>() {@Overridepublic String load(String key) throws Exception {return queryFromExternalStorage(key);}});
-
监控与统计: 使用
Cache.stats()
查看缓存命中率等统计数据,便于优化缓存策略。
总结
通过在 Flink 中引入 Guava Cache,可以显著降低热存储维表的访问压力,提升系统性能。
这种方案适用于维表数据更新频率较低,且查询热点相对集中的场景
相关文章:
Flink 热存储维表 使用 Guava Cache 减轻访问压力
目录 背景 Guava Cache 简介 实现方案 1. 项目依赖 2. Guava Cache 集成到 Flink (1) 定义 Cache (2) 使用 Cache 优化维表查询 3. 应用运行效果 (1) 维表查询逻辑优化 (2) 减少存储压力 Guava Cache 配置优化 总结 背景 在实时计算场景中,Flink 应用中…...
深入探索SenseVoiceSmall:高效多语言语音识别与处理模型
引言 随着人工智能技术的飞速发展,语音识别技术已经广泛应用于智能助手、客户服务、智能家居等多个领域。然而,现有的语音识别模型往往存在资源消耗大、多语言支持不足等问题。今天,我们要介绍的是来自ModelScope平台的SenseVoiceSmall模型&…...

Flink--API 之Transformation-转换算子的使用解析
目录 一、常用转换算子详解 (一)map 算子 (二)flatMap 算子 (三)filter 算子 (四)keyBy 算子 元组类型 POJO (五)reduce 算子 二、合并与连接操作 …...
每日十题八股-2024年11月27日
1.类型互转会出现什么问题吗? 2.为什么用bigDecimal 不用double ? 3.装箱和拆箱是什么? 4.Java为什么要有Integer? 5.Integer相比int有什么优点? 6.那为什么还要保留int类型? 7.说一下 integer的缓存 8.怎么…...

OpenCV截取指定图片区域
import cv2 img cv2.imread(F:/2024/Python/demo1/test1/man.jpg) cv2.imshow(Image, img) # 显示图片 #cv2.waitKey(0) # 等待按键x, y, w, h 500, 100, 200, 200 # 示例坐标 roi img[y:yh, x:xw] # 截取指定区域 cv2.imshow(ROI, roi) cv2.waitKey(0) cv…...
Java部分新特性
模式匹配 instance of 模式匹配 之前写法 public void print(Object o) {if (o instanceof String){String str (String) obj;System.out.println("This is a String of length " s.length());} else {System.out.println("This is not a String");} …...

【SpringBoot】28 API接口防刷(Redis + 拦截器)
Gitee仓库 https://gitee.com/Lin_DH/system 介绍 常用的 API 安全措施包括:防火墙、验证码、鉴权、IP限制、数据加密、限流、监控、网关等,以确保接口的安全性。 常见措施 1)防火墙 防火墙是网络安全中最基本的安全设备之一,…...
IT运维专家给年轻人一些职业上的建议
运维工作在现代企业中是非常重要的一环,保证系统的稳定性、可用性以及安全性对企业的正常运营至关重要。以下是我给年轻人的一些职业发展建议,希望能够帮助你们在运维领域找到方向并取得成功。 1. 夯实基础,扎实技术功底 精通操作系统与网络:运维工作需要深入理解操作系统…...

Django基础之路由
一.前言 前面我们说了django的安装于基础配置,基础知识点我就细分下来,每天和大家讲一点,今天就要和大家说django的基础知识点了,我们今天先来讲路由,内容不多,希望大家记住 二.传统路由 路由就是前面一个…...
Python实例化中默认值的行为及应用
Python实例化中默认值的行为及应用 适合初学者阅读 本文要点 使用可变对象作为默认参数会导致所有实例共享同一对象,引发意外的数据修改。不可变对象作为默认参数时,每次实例化都会创建新的对象,不会共享数据。推荐使用None作为默认值&…...

【WRF后处理】WRF模拟效果评价及可视化:MB、RMSE、IOA、R
【WRF后处理】模拟效果评价及可视化 准备工作模型评价指标Python实现代码Python处理代码:导入站点及WRF模拟结果可视化图形及评价指标参考在气象和环境建模中(如使用 WRF 模型进行模拟),模型性能评价指标是用于定量评估模拟值与观测值之间偏差和拟合程度的重要工具。 本博客…...
ShenNiusModularity项目源码学习(4:身份认证)
ShenNiusModularity项目有两套启动方式,一种是ShenNius.Admin.Mvc项目启动,该项目为MVC模式,带前台页面,也有后台服务,另一种是ShenNius.Admin.Hosting,该项目启动后仅提供后台服务,供其它前台项…...

python+django自动化部署日志采用WebSocket前端实时展示
一、开发环境搭建和配置 # channels是一个用于在Django中实现WebSocket、HTTP/2和其他异步协议的库。 pip install channels#channels-redis是一个用于在Django Channels中使用Redis作为后台存储的库。它可以用于处理#WebSocket连接的持久化和消息传递。 pip install channels…...
flink学习(6)——自定义source和kafka
概述 SourceFunction:非并行数据源(并行度只能1) --接口 RichSourceFunction:多功能非并行数据源(并行度只能1) --类 ParallelSourceFunction:并行数据源(并行度能够>1) --接口 RichParallelSourceFunction:多功能并行数据源(并行度能够>1) --类 【建议使用的】 ——…...

开发常见问题及解决
1.DBeaver 报Public Key Retrieval is not allowed 在使用DBeaver连接数据库时出现“Public Key Retrieval is not allowed”错误,主要是因为数据库连接配置的安全策略导致的。以下是详细的解释和解决方法: 错误原因 这个错误通常出现在连接MySQL数据…...

python excel接口自动化测试框架!
今天采用Excel继续写一个接口自动化测试框架。 设计流程图 这张图是我的excel接口测试框架的一些设计思路。 首先读取excel文件,得到测试信息,然后通过封装的requests方法,用unittest进行测试。 其中,接口关联的参数通过正则进…...
mybatis:You have an error in your SQL syntax;
完整报错You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near false, false, false, false, false, false, false, false, false, false, false, at line 1 SQL: INSERT INTO user …...
使用 Maven 开发 IntelliJ IDEA 插件
使用 Maven 开发 IntelliJ IDEA 插件的完整流程 1. 创建 Maven 项目 1.1 使用 IntelliJ 创建 Maven 项目 打开 IntelliJ IDEA,点击 File > New > Project。选择 Maven,填写项目名称和 GroupId,例如: GroupId: com.exampl…...

Windows修复SSL/TLS协议信息泄露漏洞(CVE-2016-2183) --亲测
漏洞说明: 打开链接:https://docs.microsoft.com/zh-cn/troubleshoot/windows-server/windows-security/restrict-cryptographic-algorithms-protocols-schannel 可以看到: 找到:应通过配置密码套件顺序来控制 TLS/SSL 密码 我们…...
uniapp生命周期:应用生命周期和页面生命周期
文章目录 1.应用的生命周期2.页面的生命周期 1.应用的生命周期 生命周期的概念:一个对象从创建、运行、销毁的整个过程被称为生命周期 生命周期函数:在生命周期中每个阶段会伴随着每一个函数的出发,这些函数被称为生命周期函数 所有页面都…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...

解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官
。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...