缓存工具类编写

缓存工具类编写

一般操作

在外面日常开发中,经常会有为了减少数据库压力,而将数据保存到缓存中并设置一个过期时间的操作。日常代码如下:

@Autowired
private RedisTemplate<String, String> redisTemplate;public Object queryDataWithCache(String id) {String cacheKey = "cacheKey:" + id;String value = redisTemplate.opsForValue().get(cacheKey);Object result = null;if (ObjectUtil.isNotEmpty(value)) { // 缓存中存在数据,直接返回result =  JsonUtil.getJsonToList(value, Object.class); // 将字符串转换为对应的类型} else { // 缓存中不存在数据,从数据库中查询result = queryFromDB(id); // 从数据库中查询数据String objectToString = JsonUtil.getObjectToString(result); // 将示例对象转换为json字符串redisTemplate.opsForValue().set(cacheKey, objectToString, 10L, TimeUnit.SECONDS); // 将数据保存到缓存中}return result;
}

通过代码可以发现,从缓存中取数据,和把数据保存缓存中的逻辑都是通用的,只有从数据库查询数据是不同的,我们可以把缓存操作抽取出来作为一个工具类使用,减少重复代码的编写。

缓存工具类编写

import cn.hutool.core.util.ObjectUtil;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import tbea.util.JsonUtil;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;/*** @Description 本地缓存工具类* @Author ZengXi* @Date 2024/11/19*/
@Component
public class CacheUtils<V> @Autowiredprivate RedisTemplate<String, String> redisTemplate;/*** @description: 获取数据* @author ZengXi* @date 2024/11/19* @param cacheKey 缓存的key* @param clazz 返回类型* @param function 查询数据库操作的函数* @param expireTime 缓存过期时间* @return V*/public <V> V getResult(String cacheKey, Class<V> clazz, Supplier<V> function, int expireTime) {V result = null;String value = redisTemplate.opsForValue().get(cacheKey);if (ObjectUtil.isNotEmpty(value)) {result = JsonUtil.getJsonToBean(value, clazz);} else {result = function.get(); // 从数据库查询数据if (ObjectUtil.isNotEmpty(result)) {String objectToString = JsonUtil.getObjectToString(result);redisTemplate.opsForValue().set(cacheKey, objectToString, expireTime, TimeUnit.SECONDS);}}return result;}/*** @description: 获取数据列表* @author ZengXi* @date 2024/11/19* @param cacheKey 缓存的key* @param clazz 返回列表元素的类型* @param function 查询数据库操作的函数* @param expireTime 缓存过期时间* @return java.util.List<V>*/public List<V> getResultList(String cacheKey, Class<V> clazz, Supplier<List<V>> function,int expireTime) {String value = redisTemplate.opsForValue().get(cacheKey);List<V> resultList = new ArrayList<>();if (ObjectUtil.isNotEmpty(value)) {resultList = JsonUtil.getJsonToList(value, clazz);} else {resultList = function.get(); // 从数据库查询数据if (ObjectUtil.isNotEmpty(resultList)) {String objectToString = JsonUtil.getObjectToString(resultList);redisTemplate.opsForValue().set(cacheKey, objectToString, expireTime, TimeUnit.SECONDS);}}return resultList;}
}

工具类的使用

@Autowired
private CacheUtils cacheUtils;public Object queryDataWithCache(String id) {String cacheKey = "cacheKey:" + id;Object result = cacheUtils.getResult(cacheKey, Object.class, () -> queryFromDB(id), 10);return result;
}

总结

通过将查询数据库的函数作为传参,我们将缓存相关操作进行了抽取,减少了代码的编写,且如果后续需要更换缓存(如:将redis更换为把本地缓存),业务代码也不需要进行更改,只需要更改缓存工具类中的代码即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/61604.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32hal库创建+LED控制演示+中断概念

1 如何使用STM32CubeMX创建ZET6项目 引言 大家好&#xff0c;今天我们将一起学习如何使用STM32CubeMX来创建一个基于ZET6的项目。如果你已经有一定的基础&#xff0c;那么这篇文章将帮助你快速回顾和深入理解创建项目的步骤。 准备工作 在开始之前&#xff0c;请确保你已经…

[371]基于springboot的高校实习管理系统

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统高校实习管理系统信息管理难度大&#xff0c;容错率低&am…

基于无线传感器网络的无线温湿度采集系统(附详细使用教程+完整代码+原理图+完整课设报告)

&#x1f38a;项目专栏&#xff1a;【Zigbee课程设计系列文章】&#xff08;附详细使用教程完整代码原理图完整课设报告&#xff09; 前言 &#x1f451;由于无线传感器网络&#xff08;也即是Zigbee&#xff09;作为&#x1f310;物联网工程的一门必修专业课&#xff0c;具有…

Go-RPC关键指标分析与企业实践

1.稳定性-保障策略 熔断&#xff1a;保护调用方 限流&#xff1a;保护被调用方 超时控制&#xff1a;避免浪费 2.稳定性-请求成功率&#xff08;用重复发送 负载均衡&#xff09; 3.稳定性-长尾请求&#xff08;用备份请求&#xff09; 4.稳定性-注册中间件 易用性&#xff1a…

启动前后端分离项目笔记

一、项目 首先可以在各大开源软件拿取一个项目&#xff0c;以下项目是在gitee上获取 二、准备工作 配置JDK环境&#xff0c;node.js环境&#xff0c;安装vue脚手架工具以及maven环境 三、前端项目启动 在前端目录下安装依赖 npm install 如果报错可能是因为权限不够&#…

非线性控制器设计原理

非线性控制器设计原理 非线性控制器设计旨在解决非线性系统的控制问题&#xff0c;克服传统线性控制器在处理非线性现象&#xff08;如饱和、死区、耦合、时变性等&#xff09;时的不足。其核心在于利用非线性数学工具和设计方法&#xff0c;使控制系统在非线性条件下具备良好…

android 使用SQLiteOpenHelper 如何优化数据库的性能

一、数据库设计优化 (Schema Design): 这是性能优化的基础。一个精心设计的数据库结构可以显著提高查询速度和减少存储空间。 范式化 (Normalization): 遵循数据库范式&#xff0c;特别是第一范式、第二范式和第三范式&#xff0c;可以消除数据冗余。冗余数据不仅浪费存储空间…

JDK1.8新增特性

新特性&#xff1a; Lambda表达式: &#xff08;语法三要素&#xff1a;参数、箭头、代码&#xff09; JDK1.8引入的一种新语法Lambda表达式,它简化了匿名内部类的使用和提高代码的可读性。 /**正常写法创建Runable**/ Runnable runnable new Runnable() {Overridepublic voi…

代理池搭建优化-(书接上回,优化改进)

炮台有效炮弹实现 声明 学习视频来自 B 站UP主泷羽sec&#xff0c;如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识&#xff0c;以下网站只涉及学习内容&#xff0c;其他的都与本人无关&#xff0c;切莫逾越法律红线&#xff0c;否则后果自负。 ✍&#x1f3fb;作者…

odoo18中模型的常用字段类型

字段的公共属性: Char 字符类型&#xff0c;对应数据库中varchar类型&#xff0c;除了通用类型外接收另外两个参数&#xff1a; size: 字符长度&#xff0c;超出的长度将被截断 trim: 默认True&#xff0c;是否字段值应该被去空白。 Text 文本类型&#xff0c;对应数据库…

ABAP开发实战——表单打印单位输出问题

在之前的文章中有提到过ABAP开发报表程序时会出现单位显示未转化值&#xff0c;就是说在中文环境下&#xff0c;用户希望看到的单位是“套”&#xff0c;但是报表程序输出的确是“SUI”&#xff0c;这时候需要取数时添加语句进行转化&#xff0c;但是&#xff0c;最近开发表单打…

基于SpringBoot的城镇保障性住房管理系统【附源码】

基于SpringBoot的城镇保障性住房管理系统 效果如下&#xff1a; 系统登录页面 用户管理页面 房源信息管理页面 住房分配管理页面 公示信息页面 系统主页面 用户登陆页面 房源信息页面 研究背景 随着城市化进程的加速&#xff0c;住房问题一直是人们关注的焦点。为了解决低收…

Java文件上传解压

目录结构 工具类 枚举 定义文件类型 public enum FileType {// 未知UNKNOWN,// 压缩文件ZIP, RAR, _7Z, TAR, GZ, TAR_GZ, BZ2, TAR_BZ2,// 位图文件BMP, PNG, JPG, JPEG,// 矢量图文件SVG,// 影音文件AVI, MP4, MP3, AAR, OGG, WAV, WAVE}为了避免文件被修改后缀&#xff0…

IDEA 下载源码很慢,Download Source使用阿里云镜像仓库

参考&#xff1a; IDEA maven本地仓库、中心仓库、远程仓库配置 在观看第三方jar包的api时&#xff0c;有时候需要下载源码看下注释。 这个时候用idea 上的提示的Download Source会发现一直下载不下来。 因此就怀疑用的是apache的maven仓库&#xff0c;不是我们用的 aliyun 镜…

PostgreSQL WITH 子句:提高查询效率和可读性

PostgreSQL WITH 子句:提高查询效率和可读性 PostgreSQL 是一种功能强大的开源关系数据库管理系统,它以其稳定性、可靠性和高级功能而闻名。在 PostgreSQL 中,WITH 子句(也称为公用表表达式,CTE)是一种非常有用的特性,它允许用户在一个大的查询中创建一个临时的结果集,…

计算机网络socket编程(3)_UDP网络编程实现简单聊天室

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 计算机网络socket编程(3)_UDP网络编程实现简单聊天室 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记&#xff0c;欢迎大家在评论区交流…

设计模式-创建型-建造者模式

1.概念 建造者设计模式&#xff08;Builder Design Pattern&#xff09;是一种创建型设计模式&#xff0c;它通过将一个复杂对象的构建过程与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 2.作用 用于简化对复杂对象的创建 3.应用场景 当我们有一个非…

英文版本-带EXCEL函数的数据分析

一、问题&#xff1a; 二、表格内容 三、分析结果 四、具体的操作步骤&#xff1a; 销售工作表公式设计与数据验证 类别&#xff08;Category&#xff09;列公式&#xff1a; 在Category列&#xff08;假设为D列&#xff09;&#xff0c;根据ProductCode在Catalogue工作表中查找…

三层交换机静态路由实验

1、前置知识 2、实验目的 3、实验器材&#xff1a; 3560-23PS交换机2台、主机4台、交叉线1根和直通网线4根。 4、实验规划及拓扑 实验要求&#xff1a; &#xff08;1&#xff09;在交换机A和交换机B上分别划分基于端口的VLAN&#xff1a; 交换机 VLAN 端口成员 交换机…

PLC与PLC跨网段通讯的几种方法:厂区组网实践

PLC通常通过以太网或其他工业网络协议&#xff08;如PROFINET、Modbus TCP等&#xff09;进行通信。当PLC位于不同的网段时&#xff0c;它们不能直接通信&#xff0c;需要特殊的配置或设备来实现通信&#xff0c;不同网段的PLC通讯变得尤为重要。 随着工业网络的发展和工业4.0概…