SpringBoot缓存抽象:@Cacheable与缓存管理器配置
文章目录
- 引言
- 一、SpringBoot缓存抽象概述
- 二、@Cacheable注解详解
- 2.1 @Cacheable的关键属性
- 三、缓存管理器配置
- 四、自定义键生成策略
- 五、缓存同步与失效策略
- 六、SpringBoot缓存最佳实践
- 总结
引言
缓存是提升应用性能的关键技术,SpringBoot提供了强大的缓存抽象层,使开发者能够以一致的方式操作不同的缓存实现。本文深入探讨SpringBoot的缓存机制,重点阐述@Cacheable注解的使用技巧及缓存管理器的配置方法,帮助开发者构建高效的缓存策略,优化应用性能。
一、SpringBoot缓存抽象概述
SpringBoot的缓存抽象建立在Spring Framework的缓存支持之上,提供了一套统一的缓存操作接口。这种抽象允许开发者在不修改业务代码的情况下,轻松切换底层缓存实现,如从本地缓存迁移到分布式缓存。缓存抽象的核心是CacheManager接口,它管理应用中的缓存,而@Cacheable等注解则提供了声明式缓存的能力。
/*** SpringBoot缓存示例项目启动类*/
@SpringBootApplication
@EnableCaching // 启用SpringBoot的缓存支持
public class CacheDemoApplication {public static void main(String[] args) {SpringApplication.run(CacheDemoApplication.class, args);}/*** 配置日志以显示缓存操作*/@Beanpublic LoggingCacheErrorHandler cacheErrorHandler() {return new LoggingCacheErrorHandler();}
}
二、@Cacheable注解详解
@Cacheable是SpringBoot缓存抽象中最常用的注解,用于标记方法的返回值应被缓存。当标记了@Cacheable的方法被调用时,SpringBoot会检查指定的缓存是否已包含对应键的值,如存在则直接返回缓存值,不执行方法;如不存在,则执行方法并将返回值放入缓存。这种机制显著减少了重复计算,提升了应用响应速度。
/*** 用户服务实现类,演示@Cacheable注解的基本用法*/
@Service
public class UserServiceImpl implements UserService {private final UserRepository userRepository;public UserServiceImpl(UserRepository userRepository) {this.userRepository = userRepository;}@Override@Cacheable(value = "users", key = "#id")public User getUserById(Long id) {// 模拟数据库查询的耗时操作try {Thread.sleep(2000); // 模拟2秒的查询延迟} catch (InterruptedException e) {Thread.currentThread().interrupt();}return userRepository.findById(id).orElseThrow(() -> new RuntimeException("User not found"));}
}
2.1 @Cacheable的关键属性
@Cacheable注解具有多个属性,可精细控制缓存行为。value或cacheNames指定缓存名称;key定义缓存键生成规则,支持SpEL表达式;condition指定缓存条件;unless定义不缓存的条件;cacheManager指定使用的缓存管理器。合理设置这些属性可以实现精确的缓存控制,满足复杂业务场景的需求。
/*** 产品服务,展示@Cacheable的高级属性用法*/
@Service
public class ProductService {private final ProductRepository productRepository;public ProductService(ProductRepository productRepository) {this.productRepository = productRepository;}@Cacheable(cacheNames = "products", // 缓存名称key = "#category.concat('-').concat(#price)", // 组合键condition = "#price > 100", // 仅缓存价格大于100的产品unless = "#result == null", // 不缓存null结果cacheManager = "productCacheManager" // 指定缓存管理器)public List<Product> findProductsByCategoryAndPrice(String category, double price) {// 模拟复杂查询return productRepository.findByCategoryAndPriceGreaterThan(category, price);}
}
三、缓存管理器配置
缓存管理器是SpringBoot缓存抽象的核心组件,负责创建、获取和管理缓存实例。SpringBoot默认使用ConcurrentMapCacheManager作为缓存管理器,它基于ConcurrentHashMap实现,适用于开发环境或小型应用。对于生产环境,通常需要配置更高性能的缓存管理器,如Caffeine、Redis或EhCache等。
/*** 缓存配置类,演示多种缓存管理器的配置*/
@Configuration
public class CacheConfig {/*** 配置基于Caffeine的本地缓存管理器*/@Bean@Primarypublic CacheManager caffeineCacheManager() {CaffeineCacheManager cacheManager = new CaffeineCacheManager();// 全局缓存配置cacheManager.setCaffeine(Caffeine.newBuilder().expireAfterWrite(30, TimeUnit.MINUTES) // 写入后30分钟过期.maximumSize(1000) // 最大缓存条目数.recordStats()); // 记录缓存统计信息// 预设缓存名称cacheManager.setCacheNames(Arrays.asList("users", "products", "orders"));return cacheManager;}/*** 配置Redis缓存管理器,用于分布式缓存*/@Beanpublic CacheManager redisCacheManager(RedisConnectionFactory connectionFactory) {// Redis缓存配置RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(60)) // 设置TTL为60分钟.disableCachingNullValues() // 禁止缓存null值.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())).serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));// 为不同的缓存设置不同的配置Map<String, RedisCacheConfiguration> cacheConfigurations = new HashMap<>();cacheConfigurations.put("users", cacheConfiguration.entryTtl(Duration.ofMinutes(10)));cacheConfigurations.put("products", cacheConfiguration.entryTtl(Duration.ofHours(1)));return RedisCacheManager.builder(connectionFactory).cacheDefaults(cacheConfiguration).withInitialCacheConfigurations(cacheConfigurations).build();}
}
四、自定义键生成策略
缓存键的设计直接影响缓存命中率和性能。SpringBoot默认使用方法参数的哈希值作为缓存键,但在复杂场景下,可能需要自定义键生成策略。通过实现KeyGenerator接口,开发者可以控制缓存键的生成逻辑,例如基于参数特定字段或组合多个参数生成键,从而提高缓存的精确性和有效性。
/*** 自定义缓存键生成器*/
@Component("customKeyGenerator")
public class CustomKeyGenerator implements KeyGenerator {@Overridepublic Object generate(Object target, Method method, Object... params) {StringBuilder key = new StringBuilder();// 添加类名key.append(target.getClass().getSimpleName()).append(":");// 添加方法名key.append(method.getName()).append(":");// 处理参数for (Object param : params) {if (param instanceof User) {// 对于User类型参数,使用其id作为键的一部分key.append(((User) param).getId());} else if (param != null) {// 对于其他参数,使用其toString()方法key.append(param.toString());} else {key.append("null");}key.append(":");}// 移除末尾的冒号if (key.charAt(key.length() - 1) == ':') {key.deleteCharAt(key.length() - 1);}return key.toString();}
}/*** 使用自定义键生成器的服务方法*/
@Service
public class OrderService {@Cacheable(cacheNames = "orders", keyGenerator = "customKeyGenerator")public Order getOrderDetails(Long orderId, String customerCode) {// 业务逻辑...return new Order(orderId, customerCode, /* 其他订单信息 */);}
}
五、缓存同步与失效策略
缓存数据与源数据的同步是缓存系统设计中的关键挑战。SpringBoot提供了@CachePut和@CacheEvict注解分别用于更新缓存和移除缓存项。@CachePut在不影响方法执行的情况下更新缓存,而@CacheEvict则负责清除缓存中的数据。通过合理使用这些注解,可以构建出高效的缓存同步机制,确保缓存数据的一致性。
/*** 演示缓存同步与失效的服务类*/
@Service
public class ProductInventoryService {private final ProductRepository productRepository;public ProductInventoryService(ProductRepository productRepository) {this.productRepository = productRepository;}@Cacheable(cacheNames = "inventory", key = "#productId")public int getProductInventory(Long productId) {// 从数据库查询库存return productRepository.findInventoryByProductId(productId);}@CachePut(cacheNames = "inventory", key = "#productId")public int updateProductInventory(Long productId, int newInventory) {// 更新数据库库存productRepository.updateInventory(productId, newInventory);return newInventory; // 返回值将被缓存}@CacheEvict(cacheNames = "inventory", key = "#productId")public void invalidateInventoryCache(Long productId) {// 仅清除缓存,不执行实际业务逻辑// 方法体可以为空,注解会处理缓存清除}// 批量清除缓存@CacheEvict(cacheNames = "inventory", allEntries = true)public void clearAllInventoryCache() {// 清除inventory缓存中的所有条目// 例如在库存批量更新后调用}
}
六、SpringBoot缓存最佳实践
在实际应用中,缓存的使用需要遵循一些最佳实践。避免过度缓存,只缓存热点数据和计算密集型操作结果;设置合理的过期时间,避免缓存数据长时间不一致;为缓存配置适当的大小限制,防止内存溢出;实现缓存监控和统计,及时发现缓存问题。遵循这些实践可以充分发挥缓存的性能优势,同时避免常见的缓存陷阱。
/*** 缓存监控配置*/
@Configuration
@EnableCaching
public class CacheMonitoringConfig extends CachingConfigurerSupport {private static final Logger logger = LoggerFactory.getLogger(CacheMonitoringConfig.class);/*** 自定义缓存解析器,添加日志记录*/@Overridepublic CacheResolver cacheResolver() {return new LoggingCacheResolver(caffeineCacheManager());}/*** 自定义缓存错误处理器*/@Overridepublic CacheErrorHandler errorHandler() {return new CacheErrorHandler() {@Overridepublic void handleCacheGetError(RuntimeException exception, Cache cache, Object key) {logger.error("Cache get error for cache: {} and key: {}", cache.getName(), key, exception);}@Overridepublic void handleCachePutError(RuntimeException exception, Cache cache, Object key, Object value) {logger.error("Cache put error for cache: {} and key: {}", cache.getName(), key, exception);}@Overridepublic void handleCacheEvictError(RuntimeException exception, Cache cache, Object key) {logger.error("Cache evict error for cache: {} and key: {}", cache.getName(), key, exception);}@Overridepublic void handleCacheClearError(RuntimeException exception, Cache cache) {logger.error("Cache clear error for cache: {}", cache.getName(), exception);}};}/*** 缓存统计信息收集任务*/@Scheduled(fixedRate = 60000) // 每分钟执行一次public void reportCacheStatistics() {CaffeineCacheManager cacheManager = (CaffeineCacheManager) caffeineCacheManager();cacheManager.getCacheNames().forEach(cacheName -> {com.github.benmanes.caffeine.cache.Cache<Object, Object> nativeCache = (com.github.benmanes.caffeine.cache.Cache<Object, Object>) ((CaffeineCache) cacheManager.getCache(cacheName)).getNativeCache();CacheStats stats = nativeCache.stats();logger.info("Cache: {} stats - Hit rate: {}, Eviction count: {}, Load time: {}ms",cacheName,String.format("%.2f", stats.hitRate() * 100) + "%",stats.evictionCount(),stats.totalLoadTime() / 1_000_000);});}
}
总结
SpringBoot的缓存抽象为Java应用提供了强大而灵活的缓存支持。通过@Cacheable注解和多样化的缓存管理器配置,开发者可以轻松实现高效的缓存策略。本文详细阐述了缓存抽象的核心概念、@Cacheable注解的使用技巧、缓存管理器的配置方法、自定义键生成策略以及缓存同步与失效机制。在实际应用中,开发者应根据业务需求选择合适的缓存实现,并遵循缓存最佳实践,如合理设置缓存大小和过期时间、实施缓存监控与统计等。恰当地使用SpringBoot缓存不仅能显著提升应用性能,还能减轻数据库负担,提高系统整体响应能力和用户体验。
相关文章:
SpringBoot缓存抽象:@Cacheable与缓存管理器配置
文章目录 引言一、SpringBoot缓存抽象概述二、Cacheable注解详解2.1 Cacheable的关键属性 三、缓存管理器配置四、自定义键生成策略五、缓存同步与失效策略六、SpringBoot缓存最佳实践总结 引言 缓存是提升应用性能的关键技术,SpringBoot提供了强大的缓存抽象层&am…...
环路广播风暴演示图
以下是环路广播风暴的演示图及其说明: 环路广播风暴演示图 ----------------- ----------------- | Switch A | | Switch B | | | | | | [Port1]--------------------------[Port1] |…...
【webrtc debug tools】 rtc_event_log_to_text
一、rtc_event_log 简介 在学习分析webrtc的过程中,发现其内部提供了一个实时数据捕获接口RtcEventLog。通过该接口可以实时捕获进出webrtc的RTP报文头数据、音视频配置参数、webrtc的探测数据等。其内容实现可参考RtcEventLogImpl类的定义。其文件所在路径 loggin…...
【统计至简】【古典概率模型】联合概率、边缘概率、条件概率、全概率
联合概率、边缘概率、条件概率 联合概率边缘概率条件概率全概率 一副标准扑克牌有 54 张,包括 52 张常规牌(13 个点数,每个点数有 4 种花色)和 2 张王(大、小王)。我们从中随机抽取一张牌,定义以…...
Linux 字符设备驱动实例
编写驱动程序,并将内核模块加载到内核中,等待被用户程序调用。 在控制台中借助第一步申请到的设备号,使用 mknod 命令创建一个设备节点,并拟一个设备名称。 在用户程序中,使用 open 打开第二步中的设备名称ÿ…...
【git】【网络】【项目配置运行】HTTP 协议的微型简易 Web 服务器---tinyEasyMuduoWebServer
【git】【网络】【项目配置运行】HTTP 协议的微型简易 Web 服务器—tinyEasyMuduoWebServer csdn项目: 原文链接:https://blog.csdn.net/weixin_45178775/article/details/122257814 github链接:https://github.com/wyewyewye/tinyEasyMuduo…...
STM32驱动OLED屏幕全解析:从原理到温度显示实战(上) | 零基础入门STM32第五十三步
主题内容教学目的/扩展视频OLED显示屏重点课程电路原理,手册分析,驱动程序。初始化,清屏,ASCII字库,显示分区。调用显示函数。做带有加入图形和汉字显示的RTC时钟界面。讲字库的设计原理。 师从洋桃电子,杜…...
2024年9月中国电子学会青少年软件编程(Python)等级考试试卷(三级)答案 + 解析
更多真题在线练习系统:历年真题在线练习系统 一、单选题 1、以下表达式的值为True的是?( ) A. all( ,1,2,3) B. any([]) C. bool(abc) D. divmod(6,0) 正确答案:C 答案解析:A和B选项,Fal…...
苍穹外卖实战附源码-DAY1
一、打开项目的Nginx 1.通过nginx成功打开包装后的前端网页 二、导入sky的数据库 sky.sql 数据 CREATE DATABASE IF NOT EXISTS sky_take_out ; USE sky_take_out;DROP TABLE IF EXISTS address_book; CREATE TABLE address_book (id bigint NOT NULL AUTO_INCREMENT COMMEN…...
Spring 框架学习
技术体系结构 总体技术体系 单一架构 一个项目,一个工程,导出为一个 war 包,在一个 Tomcat 上运行,也叫 all in one。 单一架构,项目主要应用技术框架为:Spring、SpringMVC 、Mybatis。 分布式架构 一个…...
股票交易所官方api接口有哪些?获取和使用需要满足什么条件
炒股自动化:申请官方API接口,散户也可以 python炒股自动化(0),申请券商API接口 python炒股自动化(1),量化交易接口区别 Python炒股自动化(2):获取…...
NAT NAPT
NAT NAT(Network Address Translation,网络地址转换) 主要用于在不同网络(如私有网络和公共互联网)之间进行 IP 地址转换,解决IP 地址短缺问题,并提供一定的安全性。 IPv4 地址是 32 位…...
调优案例一:堆空间扩容提升吞吐量实战记录
📝 调优案例一:堆空间扩容提升吞吐量实战记录 🔧 调优策略:堆空间扩容三部曲 # 原配置(30MB堆空间) export CATALINA_OPTS"$CATALINA_OPTS -Xms30m -Xmx30m"# 新配置(扩容至120MB&am…...
对比 Vue2 选项式 API 与 Vue3 setup 语法
对比 Vue2 选项式 API 与 Vue3 setup 语法 1. 代码组织方式 Vue2 选项式 API 通过独立的选项(data, methods, computed, watch, 生命周期钩子等)组织代码。 export default {data() {return { count: 0 };},methods: {increment() { this.count; }},mou…...
ragflow-组件可视化工具 es默认用户名elastic
以下是针对各个后台组件的可视化工具及配置指南,基于您提供的环境变量和端口设置: 1. Elasticsearch 可视化工具: Kibana(官方推荐)、Cerebro、ElasticHQ访问方式: Kibana(集成管理): URL: http://<主机…...
MATLAB代码开发实战:从入门到高效应用
一、MATLAB生态系统的核心优势 (扩展原有内容,增加行业数据) MATLAB在全球工程领域的市场占有率已达67%(2024年IEEE统计),其核心优势体现在: 矩阵运算速度比传统编程快3-5倍包含22个专业工具箱…...
GStreamer —— 2.18、Windows下Qt加载GStreamer库后运行 - “播放教程 6:音频可视化“(附:完整源码)
运行效果 介绍 GStreamer 带有一组将音频转换为视频的元素。他们 可用于科学可视化或为您的音乐增添趣味 player 的本教程展示了: • 如何启用音频可视化 • 如何选择可视化元素 启用音频可视化实际上非常简单。设置相应的标志,当纯音频流为 found&#…...
50个经典的python库
本文整理了50个可以迅速掌握的经典Python库,了解它们的用途,无论你是刚踏上编程之路,还是希望在Python的世界里更加深入,这50个库都能帮助你快速起飞。 1. Taipy Taipy是一个开源Python库,用于轻松的端到端应用程序开…...
PostgreSQL学习笔记:PostgreSQL vs MySQL
PostgreSQL 和 MySQL 都是广泛使用的关系型数据库管理系统,它们有以下一些对比: 一、功能特性 1. 数据类型支持 PostgreSQL:支持丰富的数据类型,包括数组、JSON、JSONB、范围类型、几何类型等。对于复杂数据结构的存储和处理非…...
【CentOS】搭建Radius服务器
目录 背景简介:Radius是什么?Radius服务器验证原理搭建Radius服务器环境信息yum在线安装配置FreeRADIUS相关文件clients.conf文件users文件重启服务 验证 参考链接 背景 在项目中需要用到Radius服务器作为数据库代理用户的外部验证服务器,做…...
C#枚举(Enum)详解
在 C# 中,枚举(Enum) 是一种值类型,用于定义一组命名的常量值,提高代码的可读性和可维护性。以下是枚举的核心概念、用法和最佳实践: 1. 枚举的核心特性 类型安全:避免使用魔法数字&…...
DeepSeek进阶应用(一):结合Mermaid绘图(流程图、时序图、类图、状态图、甘特图、饼图)
🌟前言: 在软件开发、项目管理和系统设计等领域,图表是表达复杂信息的有效工具。随着AI助手如DeepSeek的普及,我们现在可以更轻松地创建各种专业图表。 名人说:博观而约取,厚积而薄发。——苏轼《稼说送张琥》 创作者&…...
Golang | Gin(简洁版)
文章目录 安装使用RESTful API响应页面获取请求参数路由讲解中间件 安装使用 Gin 是一个 golang 的微框架,封装比较优雅,API 友好,源代码比较明确。具有快速灵活,容错方便等特点。其实对于 golang 而言,web 框架的依赖…...
【C++ 系列文章 基础 01 -- std::string 与 fmt::format】
文章目录 Overview1. C 中的 std::string 简介2. fmt::format 格式化函数简介3. 示例代码解析4. 应用场景与优势2. std::string 与 fmt::format 简介std::stringfmt::format 3. 代码解析3.1 格式化字符串生成3.2 调用函数 cmd_handler3.3 返回 id_code 4. 代码整体流程与应用场…...
有效封装一个 WebSocket 供全局使用
前言 在现代 Web 应用中,实时通信已经成为越来越重要的一部分。而 WebSocket 技术的出现,使得实时通信变得更加高效和便捷。 WebSocket 协议是一种基于 TCP 协议的双向通信协议,它能够在客户端和服务器之间建立起持久性的连接,从…...
使用expect工具实现远程批量修改服务器密码
使用expect工具实现远程批量修改服务器密码 linux服务器安装Expect工具 1、首先查看系统中是否有安装expect。 # whereis expect 2、Expect工具是依赖tcl的,需要先安装tcl #wget https://sourceforge.net/projects/tcl/files/Tcl/8.4.19/tcl8.4.19-src.tar.gz …...
算法日记39:洛谷P4170涂色(区间DP)
一、题目 二、题解: 1、题目解析: 1)刚刚开始阅读到题目,我们发现并没有什么思路,因此我们可以尝试来模拟一下样例的情况 2)通过观察我们发现 n 2 : n2: n2:可以拆分成 1 1 11 11来解决问题 n 3 : n3:…...
Python学习第十三天
正则表达式 什么是正则表达式:简单来说就是通过特殊符号匹配想要的字符串,正则表达式本身就是基于字符串的一套搜索规则,掌握了正则表达式对于字符串有了更深的把握和理解。 概念 官网概念:正则表达式(Regular Expres…...
python-53-分别使用flask和streamlit进行向量存储和检索的服务开发实战
文章目录 1 flask应用1.1 flask服务程序1.2 调用方式2 streamlit应用2.1 streamlit应用程序2.2 操作应用3 参考附录分别基于flask和streamlit,开发了向量存储和检索的应用程序,给出了主体框架的示例,可以在此基础上结合实际应用进行改写。 1 flask应用 1.1 flask服务程序 …...
Unity热更新方案HybridCLR+YooAsset,从零开始,保姆级教程,纯c#开发热更
文章目录: 一、前言二、创建空工程三、接入HybridCLR四、接入YooAsset五、搭建本地资源服务器Nginx六、实战七、最后八、后记 一、前言 unity热更有很多方案,各种lua热更,ILRuntime等,这里介绍的是YooAssetHybridCLR的热更方案&a…...
蓝桥杯嵌入式组第十二届省赛题目解析+STM32G431RBT6实现源码
文章目录 1.题目解析1.1 分而治之,藕断丝连1.2 模块化思维导图1.3 模块解析1.3.1 KEY模块1.3.2 LED模块1.3.3 LCD模块1.3.4 TIM模块1.3.5 UART模块1.3.5.1 uart数据解析 2.源码3.第十二届题目 前言:STM32G431RBT6实现嵌入式组第十二届题目解析源码&#…...
Pac-Man(吃豆人) 游戏
目录 前言 1. Pygame游戏开发基础 1.1 Pygame简介 1.2 游戏开发基本概念 1.3 Pygame核心模块介绍 2. 游戏设计与规划 2.1 游戏规则设计 2.2 游戏对象规划 2.3 技术方案选择 3. 创建游戏窗口与初始化 3.1 初始化Pygame环境 3.2 设置游戏窗口 3.3 定义颜色和游戏参数…...
Unity Dots从入门到精通 Mono和Dots通讯
文章目录 前言安装 DOTS 包Mono To DotsDots To Mono 前言 DOTS(面向数据的技术堆栈)是一套由 Unity 提供支持的技术,用于提供高性能游戏开发解决方案,特别适合需要处理大量数据的游戏,例如大型开放世界游戏。 本文讲…...
WLAN(无线局域网)安全
WLAN安全涉及到保护无线局域网免受各种威胁和攻击,以确保数据的保密性、完整性和可用性。以下是关于WLAN安全的多方面介绍: 一、主要安全威胁 窃听:攻击者利用特殊设备监听无线信号,获取传输中的数据,如用户的账号密…...
故障诊断——neo4j入门
文章目录 neo4jQuickStartDemo neo4j QuickStart 详情可见博客:https://www.cnblogs.com/nhdlb/p/18703804,使用docker拉取最近的一个版本进行创建 docker run -it -d -p 7474:7474 -p 7687:7687 \ -v /disk5/neo4j_docker/data:/data \ -v /disk5/ne…...
【商城实战(25)】解锁UniApp移动端适配秘籍,打造完美商城体验
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配…...
Qt 数据库操作(Sqlite)
数据库简介 关于数据库的基础知识这里就不做介绍了,相关博客可以查看: SQL基础知识 数据库学霸笔记 上面博客都写的比较详细,本文主要介绍如何使用Qt进行数据库相关操作,数据库分为关系型数据库和非关系型数据,关系…...
LINUX 指令大全
Linux服务器上有许多常用的命令,可以帮助你管理文件、目录、进程、网络和系统配置等。以下是一些常用的Linux命令: 文件和目录管理 ls:列出当前目录中的文件和子目录 bash lspwd:显示当前工作目录的路径 bash pwdcd:切…...
【Synchronized】不同的使用场景和案例
【Synchronized】不同的使用场景和案例 【一】锁的作用范围与锁对象【1】实例方法(对象锁)【2】静态方法(类锁)【3】代码块(显式指定锁对象)【4】类锁(通过Class对象显式锁定) 【二】…...
华为欧拉操作系统安装Docker服务
华为欧拉 20.03 操作系统安装 Docker 服务 一、安装前准备 系统环境检查 确认当前运行的操作系统为华为欧拉 24.03。可通过在终端执行以下命令查看: cat /etc/os - release欧拉系统可以使用以下命令: cat /etc/openEuler-release确保系统已连接互联…...
告别复杂日志解析 用bin2sql轻松实现MySQL数据闪回
mysqlbinlog⼯具使用 use test; CREATE TABLE t1 (id INT(11) NOT NULL AUTO_INCREMENT,name VARCHAR(20) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;INSERT INTO t1(id, name) SELECT 101, tome101; INSERT INTO t1(id, name) SELECT 102, tome1…...
uniapp简单table表
<template><view class"container"><scroll-view scroll-x"true" scroll-y"true" class"table-scroll"><view class"table-header"><view class"table-cell fixed-column">序号<…...
prompt大师高效提示词解析
Prompt大师李继刚高效提示词示例解析 一、「汉语新解」提示词 核心结构 采用Lisp语言框架嵌套中文语义,通过(defun 新汉语老师 ()...)定义角色风格(融合奥斯卡王尔德、鲁迅的批判性语言),用(隐喻 (一针见血...))构建解释逻辑链。…...
uni-app如何发布项目为app_2025
参考大佬的:uni-app项目打包成apk(本地打包篇)_uniapp打包apk-CSDN博客 1、导入前配置 在 HBuilder X 中打开uni-app项目中的 mainifest.json 文件,appid没有的话可以点“重新获取” 2、打包 然后关注控制台,导出成功…...
MySQL与Canal、RabbitMQ集成指南
MySQL 部分 1. 查看是否开启 binlog MySQL 8 默认开启 binlog。可以通过以下命令查看是否开启: SHOW VARIABLES LIKE log_bin;如果返回结果为 ON,则表示 binlog 已开启。 Variable_nameValuelog_binON 2. 若未开启 binlog,则需手动配置 …...
新品发布|启英泰伦联合启明云端推出离在线语音大模型方案
当前,生成式大模型正以颠覆性姿态重塑人机交互的边界,并逐渐向终端场景渗透。然而,云端大模型在落地终端场景时面临两大挑战: 在真实噪声场景下容易听不清、误识别,影响交互准确性;云端处理冗余数据及大规…...
网编高级 day01
网编高级 day01 0. 大纲1. Modbus协议1.1. Modbus起源1.2. 分类1.3. Modbus TCP特点 2. Modbus TCP协议格式2.1. 报文头2.2. 寄存器2.3. 功能码 0. 大纲 协议: modbus协议:modbus TCP、modbus RTUhtml 网页:http协议Webserver 工具&#x…...
2001-2023年上市公司数字化转型年报词频统计(年报词频统计和MDA词频统计两种方式)(吴非、赵宸宇、甄红线300+关键词三种方法)
2001-2023年上市公司数字化转型年报词频统计(年报词频统计和MD&A词频统计两种方式)(吴非、赵宸宇、甄红线300关键词三种方法) 1、时间:2001-2023年 2、来源:上市公司年报 3、参考文献: …...
数据分析与AI丨AI Fabric:数据和人工智能架构的未来
AI Fabric 架构是模块化、可扩展且面向未来的,是现代商业环境中企业实现卓越的关键。 在当今商业环境中,数据分析和人工智能领域发展可谓日新月异。几乎每天都有新兴技术诞生,新的应用场景不断涌现,前沿探索持续拓展。可遗憾的是&…...
MQ消息发送不在MySQL事务中,该如何保证一致性?
在 MQ 消息发送与 MySQL 事务分离的场景下,可通过以下方案保障数据一致性: 一、核心原则 确保 业务操作成功 与 消息发送成功 的最终一致性,避免因网络抖动、服务宕机等异常导致以下问题: 场景1:业务操作成功但消息未…...