Java本地缓存的使用
在项目开发中,经常会碰到一些数据量小、但使用频率极高的数据。比如,团队到BU的映射表。此类数据通常不会变动,使用频率高且数据量较小,如果每次使用都去数据库查询,代价比较大,可以考虑在项目启动时将此类数据加载到缓存中,并定时进行增量更新。
项目中本身没有用redis,也没必要上,java的本地缓存完全可以满足需求。当然,数据量较大的情况下,还是不推荐这样使用的,可能会造成OOM。
下面是一个缓存的抽象类,子类继承并实现toHandler()
方法后,相关数据就会在项目启动时被加载到缓存中,然后通过getEntityById()
方法获取。
public abstract class BaseCache<T> {// 用于定时执行更新任务ScheduledExecutorService timer = Executors.newSingleThreadScheduledExecutor();// map存储数据Map<Object, T> cacheMap = new HashMap<>();BaseMapper<T> baseDao;// 用于记录上一次缓存更新的时间protected Date currentTime = DateUtil.getDate(2000, 1, 1);public BaseCache() {this.baseDao = baseDao;//定时获取缓存timer.scheduleAtFixedRate(() -> {List<T> results = getList();if (results.size() > 0) {T result = results.get(results.size() - 1);if (result instanceof Map) {currentTime = (Date) ((Map) result).get("DataChange_LastTime");} else {currentTime = (Date) ReflectionUtils.getFieldValue(result, "datachangeLasttime");}toHandler(results);}}, 1000, 1000, TimeUnit.MILLISECONDS); // 时间可以根据业务需要进行变更}// 根据数据变更时间,获取增量数据protected List<T> getList() {QueryWrapper<T> queryWrapper = new QueryWrapper<>();queryWrapper.gt("DataChange_LastTime", currentTime);queryWrapper.orderByAsc("DataChange_LastTime");return baseDao.selectList(queryWrapper);}// 此抽象方法由子类实现,往缓存中(cacheMap)存放所需要的值protected abstract void toHandler(List<T> results);// 从缓存中获取数据public T getEntityById(Object id) {return cacheMap.get(id);}
}
下面是一个BaseCache
的子类,功能是将userid和username放入内存进行映射,并提供【根据id获取name】和【根据name获取id】两个get方法。
ps: 实际业务代码肯定不是这种鸡肋的内容啦,数据脱敏。
UserCache
类被@Repository
和@Lazy
注解修饰,在第一次被用到的时候会被注入到IOC容器中,此时会调用其(父类BaseCache)构造函数,开始执行定时任务,调用toHandler()
方法,将数据存入idCacheMap中。
因为业务的需要,既要通过key获取到value,又要通过value获取到key,因此我在这里没有复用父类中的map,而是添加了一个BiMap
。
@Lazy
@Repository
public class UserCache extends BaseCache<User>{// Map<userid, username>private BiMap<Long, String> idCacheMap = HashBiMap.create();@Autowiredpublic void setDao(UserDao entityDao) {this.baseDao = entityDao;}@Overrideprotected void toHandler(List<User> results) {results.stream().forEach(p -> {this.idCacheMap.put(p.getUserid(), p.getUserName());});}public Long getUsername(Long userid) {return idCacheMap.get(userid);}public Long getUserid(String username) {return idCacheMap.inverse().get(username);}
}
相关文章:
Java本地缓存的使用
在项目开发中,经常会碰到一些数据量小、但使用频率极高的数据。比如,团队到BU的映射表。此类数据通常不会变动,使用频率高且数据量较小,如果每次使用都去数据库查询,代价比较大,可以考虑在项目启动时将此类…...
华为数通方向HCIP-DataCom H12-831题库(单选题:281-300)
第281题 如图所示,某工程师利用4台路由器进行网络互通测试,其中R1、R2、R3部署OSPF (Area0)实现网络互通,R2、R3、R4部署IS-IS(均部署为Level-2路由器)实现网络互通,现在该工程师在R1的OSPF进程中引入直连路由,在R2的IS-IS进程中引入OSPF路由,则以下关于该场景的描述,正…...
【分享Python代码】图片转化为素描画
哈喽,大家好,我是木易巷~ 代码生成效果图 原图: 生成图: 原图: 生成图: 准备工作 Python编程首先需要安装环境,下面是详细步骤: 会的小伙伴可自行跳过,代码在最后 1…...
汇川Easy521PLC与压力传感器485通讯实例
本例是汇川Easy521PLC与支持485通讯的压力传感器进行通讯的实例记录。对于初次使用汇川PLC的朋友,可能有借鉴的意义。 配置: 1、汇川Easy521PLC 2、美控压力变送器 3、汇川Autoshop编程软件 将压力变送器的485线与PLC本体的485端子一一连接: 485+:A+ 485-:B- 一般485的标…...
创意作品管理软件 Bridge 2024 mac中文版 br2024功能特色
Bridge 2024 mac旨在连接不同的Ad obe应用程序,帮助用户更轻松地管理和编辑他们的创意作品。 Bridge 2024 mac软件特色和功能介绍 一致的用户体验:Bridge 2024现在具有增强的用户界面,可提供与其他Creative Cloud应用程序类似的体验。用户还…...
【分享】教你加速访问GitHub,进来学!
哈喽,大家好,木易巷来啦! 众所周知,Github是一款程序猿必备的代码托管平台,上面已经存在了无数前辈的心血!经常需要在上面查看大佬写的一些好用的开源项目,无赖国外网站的速度实在让人难以接受。…...
利用在线培训系统提升员工技能,助力企业发展
近年来,随着互联网技术的发展,在线培训系统逐渐成为企业提升员工技能的利器。这种新型的培训方式打破了时间和空间的限制,为企业提供了更加灵活和高效的培训解决方案。下面,我们将详细介绍如何利用在线培训系统提升员工技能&#…...
深度学习小工具:Linux 环境下的用户命令和脚本顺序执行器
前言 深度学习跑代码的时候,需要跑很多个对比实验,要么开多个窗口并行执行代码,要么就写在一个 .sh 文件里面顺序执行,前面一种并行执行多个任务出结果很慢,而后一种如果想添加任务或者删除某个任务就得全部停止&…...
c# WPF 应用程序在屏幕上居中显示
xaml<Window ... WindowStartupLocation"CenterScreen">...
JVM之class文件结构剖析
文章目录 0.前言1. 引言1.1 Java编译原理基础1.2 Class文件在Java编译过程中的角色 2. Class文件的整体结构2.1 Class 文件组成 3. Class文件的详细解析3.1 魔数与版本号的作用和意义3.2 常量池的结构和作用3.3 访问标志的含义和可能的值3.4 类索引、父类索引和接口索引集合的作…...
TDengine 签约中石化,支撑八大油田 PCS 系统
近日,TDengine 成功签约中国石化 PCS 一级部署时序数据库项目。未来,TDengine 将作为中国石化 PCS 系统的时序数据库,为石化总部、胜利油田、西北油田、中原油田、河南油田、华北油田、江苏油田、华东油田、江汉油田等油田 PCS 系统提供高效、…...
win11 定时计划任务
控制面板 任务计划 添加任务计划 ,选按步骤添加。...
C++入门之引用与内联函数
一、引用 1、初步理解 引用在语法上的理解就是起别名,用法就是在类型后面加&,例子:int a 1; int& b a; 上例所示,执行后,b就是a的别名,它们代表同一块空间,a的改变会影响b࿰…...
浅谈智能照明控制系统应用在城市轨道交通
叶根胜 江苏安科瑞电器制造有限公司 江苏江阴 214405 摘要:在传统的城市轨道交通设计方面,照明设计方案具有一定的弊端。随着计算机技术的发展,智能化技术渐渐步入人们的生活并成为主流,故在城市轨道交通中应用新型的照明控制设…...
macos 中ios系统升级,但是macos还是老系统,在手机上无法安装ios软件
https://github.com/filsv/iOSDeviceSupport 构建项目出现 解决的方法: 就可以了,...
Pytest+Allure生成可添加附件的测试报告
#测试套件层级 allure.feature("测试PecExplorer") #重试次数,粒度为用例,建议用例设计可重复性高 pytest.mark.flaky(reruns3) class TestPecExplorer:#功能模块层级allure.story("登录界面")#测试用例层级allure.title("Test…...
Spacedrive:开源跨平台文件管理 | 开源日报 No.57
denoland/deno Stars: 91.2k License: MIT Deno 是一个简单、现代和安全的 JavaScript 和 TypeScript 运行时,使用 V8 引擎并用 Rust 构建。其主要功能包括: 默认情况下具有高度安全性,除非显式启用,否则无法访问文件、网络或环…...
c# 同步异步锁
在 C# 中,synchronization(同步)和asynchronization(异步)锁都是用来保护共享资源的。在单线程环境中,这些锁不是必要的,但在多线程环境中,由于多个线程可以访问和修改同一资源&…...
【Spring AOP】统⼀数据返回格式
为什么需要统一数据返回格式? ⽅便前端程序员更好的接收和解析后端数据接⼝返回的数据。降低前端程序员和后端程序员的沟通成本,按照某个格式实现就⾏了,因为所有接⼝都是这样返回的。有利于项⽬统⼀数据的维护和修改。有利于后端技术部⻔的…...
python+django高校体育乒乓球场地预约管理系统_s2409
本系统提供给管理员对首页,个人中心,用户管理,乒乓球场管理,场地类型管理,场地预约管理,暂离申请管理,离开申请管理,管理员管理,留言反馈,系统管理等诸多功能进行管理。本系统对于用户输入的任何信息都进行了一定的验证,为管理员操…...
Python Selenium设计模式-POM
前言本文就python selenium自动化测试实践中所需要的POM设计模式进行分享,以便大家在实践中对POM的特点、应用场景和核心思想有一定的理解和掌握。 为什么要用POM 基于python selenium2开始UI级自动化测试并不是多么艰巨的任务。**只需要定位到元素,执…...
【计算机毕设选题推荐】网络在线考试系统SpringBoot+SSM+Vue
前言:我是IT源码社,从事计算机开发行业数年,专注Java领域,专业提供程序设计开发、源码分享、技术指导讲解、定制和毕业设计服务 项目名 网络在线考试系统 技术栈 SpringBootSSMVueMySQLMaven 文章目录 一、网络在线考试系统-环境…...
AUTOSAR汽车电子嵌入式编程精讲300篇-基于FPGA的LIN总线控制器设计与验证(续)
目录 3.2.3波特率发生模块 3.2.4数据采样模块 3.2.5校验和产生模块 3.2.6奇偶校验模块 3.2.7接收模块<...
Qt ModelView显示数据库数据
利用qt的model view来显示数据表userudps里的数据 用了一个label 两个combox和一个tableview,实现如下效果: 我这里用到是mysql数据库,一般配置mysql数据库就两种有驱动或者没驱动,有的话把mysql的bin目录的libmysql.dll复制到q…...
Vue-3.1缓存组件keep-alive
问题:从首页卡片点到详情页,又点返回,数据重新加载了->希望回到原来的位置 原因:路由跳转后,组件被销毁了,返回回来组件又被重建了,所以数据重新被加载了 解决:利用keep-alive将…...
14.8 Socket 一收一发通信
通常情况下我们在编写套接字通信程序时都会实现一收一发的通信模式,当客户端发送数据到服务端后,我们希望服务端处理请求后同样返回给我们一个状态值,并以此判断我们的请求是否被执行成功了,另外增加收发同步有助于避免数据包粘包…...
7天狂揽 1.3w star 的 MetaGPT,他们的目标让软件公司为之一惊
在 AI 产品爆炸的今天,拥有各种本领的 AI 产品层出不穷,但 MetaGPT 的出现仍然显的格外耀眼,其可以实现只输入单一 prompt,就可以输出需求分析、需求文档、技术架构、最终代码等等产物,这相当于一个开发团队的输出成果…...
工控网络协议模糊测试:用peach对modbus协议进行模糊测试
0x00 背景 本人第一次在FB发帖,进入工控安全行业时间不算很长,可能对模糊测试见解出现偏差,请见谅。 在接触工控安全这一段时间内,对于挖掘工控设备的漏洞,必须对工控各种协议有一定的了解,然后对工控协议…...
python+opencv+机器学习车牌识别 计算机竞赛
0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于机器学习的车牌识别系统 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:4分工作量:4分创新点:3分 该项目较为新颖,适…...
魔域服务端数据库说明
Magic.DB MagID: 魔法ID Mag:Magic MagName: 魔法名称 EffectType: 效果类型 Effect: 效果 Spell: 魔力(魔法值) Power: 能力,力量 MaxPower: 最大能力 DefSpell: 变化后的魔力Def:deformation DefPower: 变化后能力 DefMaxPower:…...
国家信用信息系统年报/专业seo优化公司
public function index(){$cate 1; $query M(Cate)->field(id)->where(array(id>$cate,pid>$cate,_logic>OR))->buildSql();//在一个表中获得栏目的id $goods M(Goods)->where(cate_id in . $query)->select(); //在另一个表获得属于这些栏目的文…...
网站的icp 备案信息/湖州seo排名
王勃,杨炯,卢照邻,骆宾王.转载于:https://www.cnblogs.com/zhangzujin/p/4451036.html...
南京浦口做网站点/产品推广计划方案
kubectl 命令格式: 常用查看命令: # 获取节点和服务版本信息 kubectl get nodes # 获取节点和服务版本信息,并查看附加信息 kubectl get nodes -o wide# 获取pod信息,默认是default名称空间 kubectl get pod # 获取pod信息&#…...
一个网站两个域名 seo/企业查询系统
记录下 分为两种 一般的情况和 使用只能指针(shared_ptr)的情况 如下图 传统的模式被注释掉了 传统的模式需要手动销毁占用内存 shared_ptr模式会自动释放内存 只能一种模式 注释:没有加锁 多线程情况下可能有问题 头文件 CPP文件 如何…...
龙口做网站价格/网站营销推广有哪些
汽车手机蓝牙钥匙靠近感应解锁智能吗? 汽车蓝牙无匙进入一键启动,靠近自动感应解锁 。人到开锁,人走车锁,无需掏出手机,靠近车辆时车辆即可自动解锁,远离车辆时车辆则自动落锁。这一解决方案极大地方便了汽车用户。手机控车 手机开…...
怎么用群晖nas做网站/什么网站推广比较好
实现一个函数,将一个字符串中的所有空格替换为"%20",例如输入字符串"How beautiful you are!",输出结果应为"How%20beautiful%20you%20are!"。首先,如果另开辟一块空间并且足够将全部空格都替换成"%20&qu…...