当前位置: 首页 > news >正文

spring-cache concurrentHashMap 自定义过期时间

1.自定义实现缓存构建工厂

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;import lombok.Getter;
import lombok.Setter;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.cache.concurrent.ConcurrentMapCache;
import org.springframework.lang.Nullable;
import org.springframework.util.StringUtils;public class ExpiringConcurrentMapCacheFactoryBeanimplements FactoryBean<ConcurrentMapCache>, BeanNameAware, InitializingBean {private String name = "";@Nullableprivate ConcurrentMap<Object, Object> store;private boolean allowNullValues = true;@Nullableprivate ConcurrentMapCache cache;@Setter@Getterprivate long expiringMillis = 1000*60*60*24;//默认一天public void setName(String name) {this.name = name;}public void setStore(ConcurrentMap<Object, Object> store) {this.store = store;}public void setAllowNullValues(boolean allowNullValues) {this.allowNullValues = allowNullValues;}@Overridepublic void setBeanName(String beanName) {if (!StringUtils.hasLength(this.name)) {setName(beanName);}}@Overridepublic void afterPropertiesSet() {if (store==null){store = new ConcurrentHashMap<>(256);}ExpiringConcurrentMapCache expiringConcurrentMapCache = new ExpiringConcurrentMapCache(this.name, store, this.allowNullValues);expiringConcurrentMapCache.setExpiringMillis(expiringMillis);this.cache = expiringConcurrentMapCache;}@Override@Nullablepublic ConcurrentMapCache getObject() {return this.cache;}@Overridepublic Class<?> getObjectType() {return ExpiringConcurrentMapCache.class;}@Overridepublic boolean isSingleton() {return true;}}

2.自定义实现缓存

import lombok.Getter;
import lombok.Setter;
import org.springframework.cache.concurrent.ConcurrentMapCache;import java.util.concurrent.ConcurrentMap;public class ExpiringConcurrentMapCache extends ConcurrentMapCache {@Setter@Getterprivate long expiringMillis = 1000*60*60*24;//默认一天public ExpiringConcurrentMapCache(String name, ConcurrentMap<Object, Object> store, boolean allowNullValues) {super(name, store, allowNullValues);}// 自定义缓存值,包含数据和过期时间public static class CacheValue {@Getterprivate final Object value;private final long expirationTime;public CacheValue(Object value, long expirationTime) {this.value = value;this.expirationTime = System.currentTimeMillis() + expirationTime;}public boolean isExpired() {long l = System.currentTimeMillis();return  l > expirationTime;}}@Overridepublic void put(Object key, Object value) {// 设置过期时间,例如 5 分钟CacheValue cacheValue = new CacheValue(value, expiringMillis);super.put(key, cacheValue);}@Overrideprotected Object lookup(Object key) {CacheValue cacheValue = (CacheValue) super.lookup(key);if (cacheValue != null && !cacheValue.isExpired()) {return cacheValue.getValue();}return null;}}

3.自定义缓存配置

import com.cardcharge.share.cache.ExpiringConcurrentMapCacheFactoryBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.CacheManager;
import org.springframework.cache.concurrent.ConcurrentMapCache;
import org.springframework.cache.support.SimpleCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.Collections;@Configuration
public class SpringCacheConfiguration {@Value("${spring.cache.expireTimeMillis}")private Long springCacheExpireTime;@BeanExpiringConcurrentMapCacheFactoryBean defaultCache() {ExpiringConcurrentMapCacheFactoryBean cache = new ExpiringConcurrentMapCacheFactoryBean();if (springCacheExpireTime!=null){cache.setExpiringMillis(springCacheExpireTime);}cache.setName("nbCard");return cache;}@BeanCacheManager cacheManager(ConcurrentMapCache defaultCache) {SimpleCacheManager cacheManager = new SimpleCacheManager();cacheManager.setCaches(Collections.singletonList(defaultCache));return cacheManager;}}

4.在需要缓存的 方法上加 注解

  /*** 查所有* @param tokenInfo* @return* @throws CodeException*/@Override@Cacheable(cacheManager = "cacheManager",cacheNames = "nbCard",key = "#root.target.All_Nb_Card_Vo_Cache_Key",sync = true)public List<NbCardVo> findByRoleAll(TokenInfoDto tokenInfo) throws CodeException {ExecutorService executorService = Executors.newFixedThreadPool(16);//开启固定线程List<NbCardVo> result = new CopyOnWriteArrayList<>();

5.修改的缓存上面加注解

 @Override@Transactional(rollbackFor = Exception.class)@CacheEvict(cacheManager = "cacheManager",cacheNames = "nbCard",key = "#root.target.All_Nb_Card_Vo_Cache_Key")public void purchaseUpdate(PurchaseUpdateNbCardBasicInfo nbCardDto, TokenInfoDto tokenInfo) throws CodeException

相关文章:

spring-cache concurrentHashMap 自定义过期时间

1.自定义实现缓存构建工厂 import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap;import lombok.Getter; import lombok.Setter; import org.springframework.beans.factory.BeanNameAware; import org.springframework.beans.factory.…...

解析传统及深度学习目标检测方法的原理与具体应用之道

深度学习目标检测算法 常用的深度学习的目标检测算法及其原理和具体应用方法&#xff1a; R-CNN&#xff08;Region-based Convolutional Neural Networks&#xff09;系列1&#xff1a; 原理&#xff1a; 候选区域生成&#xff1a;R-CNN 首先使用传统的方法&#xff08;如 Se…...

shell数组

文章目录 &#x1f34a;自我介绍&#x1f34a;shell数组概述&#x1f34a;Shell数组使用方法数组的定义直接定义单元素定义 元素的获取获取单个元素获取全部元素 获取数组长度获取整个数组长度获取单个元素的长度 操作数组增加删除 关联数组 &#x1f34a; 你的点赞评论就是对博…...

高斯混合模型回归(Gaussian Mixture Model Regression,GMM回归)

高斯混合模型&#xff08;GMM&#xff09;是一种概率模型&#xff0c;它假设数据是由多个高斯分布的混合组成的。在高斯混合回归中&#xff0c;聚类与回归被结合成一个联合模型&#xff1a; 聚类部分 — 使用高斯混合模型进行聚类&#xff0c;识别数据的不同簇。回归部分 — 对…...

【3D Slicer】的小白入门使用指南八

3D Slicer DMRI(Diffusion MRI)-扩散磁共振认识和使用 0、简介 大脑解剖 ● 白质约占大脑的 45% ● 有髓神经纤维(大约10微米轴突直径) 白质探索 朱尔斯约瑟夫德杰林(Jules Joseph Dejerine,《神经中心解剖学》(巴黎,1890-1901):基于髓磷脂染色标本的神经解剖图谱)…...

【流量分析】常见webshell流量分析

免责声明&#xff1a;本文仅作分享&#xff01; 对于常见的webshell工具&#xff0c;就要知攻善防&#xff1b;后门脚本的执行导致webshell的连接&#xff0c;对于默认的脚本要了解&#xff0c;才能更清晰&#xff0c;更方便应对。 &#xff08;这里仅针对部分后门代码进行流量…...

基于树莓派的边缘端 AI 目标检测、目标跟踪、姿态估计 视频分析推理 加速方案:Hailo with ultralytics YOLOv8 YOLOv11

文件大纲 加速原理硬件安装软件安装基本设置系统升级docker 方案Demo 测试目标检测姿态估计视频分析参考文献前序树莓派文章hailo加速原理 Hailo 发布的 Raspberry Pi AI kit 加速原理,有几篇文章介绍的不错 https://ubuntu.com/blog/hackers-guide-to-the-raspberry-pi-ai-ki…...

Java在算法竞赛中的常用方法

在算法竞赛中&#xff0c;Java以其强大的标准库和高效的性能成为了众多参赛者的首选语言。本文将详细介绍Java在算法竞赛中的常用集合、字符串处理、进制转换、大数处理以及StringBuilder的使用技巧&#xff0c;帮助你在竞赛中更加得心应手。 常用集合 Java的集合框架提供了多…...

Vulnhub靶场案例渗透[10]- Momentum2

文章目录 一、靶场搭建1. 靶场描述2. 下载靶机环境3. 靶场搭建 二、渗透靶场1. 确定靶机IP2. 探测靶场开放端口及对应服务3. 扫描网络目录结构4. 代码审计5. 反弹shell6. 提权 一、靶场搭建 1. 靶场描述 - Difficulty : medium - Keywords : curl, bash, code reviewThis wor…...

Spark RDD中常用聚合算子源码层面的对比分析

在 Spark RDD 中&#xff0c;groupByKey、reduceByKey、foldByKey 和 aggregateByKey 是常用的聚合算子&#xff0c;适用于按键进行数据分组和聚合。它们的实现方式各不相同&#xff0c;涉及底层调用的函数也有区别。以下是对这些算子在源码层面的分析&#xff0c;以及每个算子…...

计算机网络 (6)物理层的基本概念

前言 计算机网络物理层是OSI模型&#xff08;开放式系统互联模型&#xff09;中的第一层&#xff0c;也是七层中的最底层&#xff0c;它涉及到计算机网络中数据的物理传输。 一、物理层的主要任务和功能 物理层的主要任务是处理物理传输介质上的原始比特流&#xff0c;确保数据…...

快速上手:Docker 安装详细教程(适用于 Windows、macOS、Linux)

### 快速上手&#xff1a;Docker 安装详细教程&#xff08;适用于 Windows、macOS、Linux&#xff09; --- Docker 是一款开源容器化平台&#xff0c;广泛应用于开发、测试和部署。本文将为您提供分步骤的 Docker 安装教程&#xff0c;涵盖 Windows、macOS 和 Linux 系统。 …...

kafka消费者出现频繁Rebalance

kafka消费者在正常使用过程中&#xff0c;突然出现了不消费消息的情况&#xff0c;项目里是使用了多个消费者消费不同数据&#xff0c;按理不会相互影响&#xff0c;看日志&#xff0c;发现消费者出现了频繁的Rebalance。 Rebalance的触发条件 组成员发生变更(新consumer加入组…...

rk3399开发环境使用Android 10初体验蓝牙功能

版本 日期 作者 变更表述 1.0 2024/11/10 于忠军 文档创建 零. 前言 由于Bluedroid的介绍文档有限&#xff0c;以及对Android的一些基本的知识需要了(Android 四大组件/AIDL/Framework/Binder机制/JNI/HIDL等)&#xff0c;加上需要掌握的语言包括Java/C/C等&#xff0…...

ASP.NET 部署到IIS,访问其它服务器的共享文件 密码设定

asp.net 修改上面的 IIS需要在 配置文件 添加如下内容 》》》web.config <system.web><!--<identity impersonate"true"/>--><identity impersonate"true" userName"您的账号" password"您的密码" /><co…...

将自定义函数添加到MATLAB搜索路径的方法

在MATLAB中&#xff0c;将自定义函数添加到搜索路径可以确保你能够方便地调用这些函数&#xff0c;而不必每次都指定完整路径。本文介绍几种将自定义函数添加到MATLAB搜索路径的方法 文章目录 使用 MATLAB 的路径管理工具使用 addpath 命令在启动时自动添加路径使用 genpath 命…...

云原生之运维监控实践-使用Telegraf、Prometheus与Grafana实现对InfluxDB服务的监测

背景 如果你要为应用程序构建规范或用户故事&#xff0c;那么务必先把应用程序每个组件的监控指标考虑进来&#xff0c;千万不要等到项目结束或部署之前再做这件事情。——《Prometheus监控实战》 去年写了一篇在Docker环境下部署若依微服务ruoyi-cloud项目的文章&#xff0c;当…...

什么是MySQL,有什么特点

什么是 MySQL&#xff1f; MySQL 是一个关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;由瑞典公司 MySQL AB 开发&#xff0c;后来被 Sun Microsystems 收购&#xff0c;最终成为 Oracle Corporation 的一部分。MySQL 是最流行的关系型数据库之一&#xff0c…...

初始化mysql5.7

-- 环境变量 MYSQL_HOME %MYSQL_HOME%\bin -- 新增配置文件 my.ini [mysqld] port 3306 basedir D:/develop/MySQL/mysql-5.7.44-winx64 datadir D:/develop/MySQL/mysql-5.7.44-winx64/data max_connections 200character-set-serverutf8 default-storage-engineINNODB …...

C# 字典应用

using System;using System.Collections.Generic;class Program{static void Main(){// 创建一个字典&#xff0c;键是字符串类型&#xff0c;值是整数类型Dictionary<string, int> studentScores new Dictionary<string, int>();// 向字典中添加键值对// 原理&am…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

Leetcode33( 搜索旋转排序数组)

题目表述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...

跨平台商品数据接口的标准化与规范化发展路径:淘宝京东拼多多的最新实践

在电商行业蓬勃发展的当下&#xff0c;多平台运营已成为众多商家的必然选择。然而&#xff0c;不同电商平台在商品数据接口方面存在差异&#xff0c;导致商家在跨平台运营时面临诸多挑战&#xff0c;如数据对接困难、运营效率低下、用户体验不一致等。跨平台商品数据接口的标准…...

鸿蒙Navigation路由导航-基本使用介绍

1. Navigation介绍 Navigation组件是路由导航的根视图容器&#xff0c;一般作为Page页面的根容器使用&#xff0c;其内部默认包含了标题栏、内容区和工具栏&#xff0c;其中内容区默认首页显示导航内容&#xff08;Navigation的子组件&#xff09;或非首页显示&#xff08;Nav…...

6.9本日总结

一、英语 复习默写list11list18&#xff0c;订正07年第3篇阅读 二、数学 学习线代第一讲&#xff0c;写15讲课后题 三、408 学习计组第二章&#xff0c;写计组习题 四、总结 明天结束线代第一章和计组第二章 五、明日计划 英语&#xff1a;复习l默写sit12list17&#…...

OpenGL-什么是软OpenGL/软渲染/软光栅?

‌软OpenGL&#xff08;Software OpenGL&#xff09;‌或者软渲染指完全通过CPU模拟实现的OpenGL渲染方式&#xff08;包括几何处理、光栅化、着色等&#xff09;&#xff0c;不依赖GPU硬件加速。这种模式通常性能较低&#xff0c;但兼容性极强&#xff0c;常用于不支持硬件加速…...

智能体革命:企业如何构建自主决策的AI代理?

OpenAI智能代理构建实用指南详解 随着大型语言模型&#xff08;LLM&#xff09;在推理、多模态理解和工具调用能力上的进步&#xff0c;智能代理&#xff08;Agents&#xff09;成为自动化领域的新突破。与传统软件仅帮助用户自动化流程不同&#xff0c;智能代理能够自主执行工…...

【Vue】scoped+组件通信+props校验

【scoped作用及原理】 【作用】 默认写在组件中style的样式会全局生效, 因此很容易造成多个组件之间的样式冲突问题 故而可以给组件加上scoped 属性&#xff0c; 令样式只作用于当前组件的标签 作用&#xff1a;防止不同vue组件样式污染 【原理】 给组件加上scoped 属性后…...

【向量库】Weaviate概述与架构解析

文章目录 一、什么是weaviate二、High-Level Architecture1. Core Components2. Storage Layer3. 组件交互流程 三、核心组件1. API Layer2. Schema Management3. Vector Indexing3.1. 查询原理3.2. 左侧&#xff1a;Search Process&#xff08;搜索流程&#xff09;3.3. 右侧&…...