缓存工具类编写

缓存工具类编写

一般操作

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

@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.rhkb.cn/news/476769.html

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

相关文章

Redis原理及应用

Redis简介 Redis是开源的&#xff08;BSD许可&#xff09;&#xff0c;数据结构存储于内存中&#xff0c;被用来作为数据库&#xff0c;缓存和消息代理。它支持多种数据结构&#xff0c;例如&#xff1a;字符串&#xff08;string&#xff09;&#xff0c;哈希&#xff08;hash…

Ubuntu ESP32开发环境搭建

文章目录 ESP32开发环境搭建安装ESP-IDF搭建一个最小工程现象 ESP32开发环境搭建 最近有个小项目需要用到能够联网的mcu驱动&#xff0c;准备玩玩esp的芯片&#xff0c;记录下ESP32开发环境搭建的过程。 ESP-IDF 是乐鑫科技为其 ESP32 系列芯片提供的官方开发框架。这个框架主…

【C#设计模式(14)——责任链模式( Chain-of-responsibility Pattern)】

前言 责任链模式通过将请求和处理者解耦&#xff0c;关联多个处理者形成一个链条&#xff0c;使每个处理者都有机会处理请求&#xff0c;避免了将所有处理逻辑集中在一个对象中的复杂性。 代码 //请求者 public class Requestor {private string content;public string Cont…

用python将一个扫描pdf文件改成二值图片组成的pdf文件

使用墨水屏读书现在似乎越来越流行&#xff0c;这确实有一定的好处&#xff0c;例如基本不发热&#xff0c;电池续航时间超长&#xff0c;基本不能游戏所以有利于沉浸式阅读&#xff0c;还有不知道是不是真的有用的所谓防蓝光伤害。但是&#xff0c;如果阅读的书籍是扫描图片组…

vue3封装Element Plus table表格组件

支持绝大部分Element Plus原有设置属性&#xff0c;支持分页&#xff0c;支持动态适配高度 效果展示 组件代码&#xff1a; <template><div class"table-wrap" ref"tableWrap"><el-tableclass"w100 h100":data"tableInfo.…

IText创建加盖公章的pdf文件并生成压缩文件

第一、前言 此前已在文章&#xff1a;Java使用IText根据pdf模板创建pdf文件介绍了Itex的基本使用技巧&#xff0c;本篇以一个案例为基础&#xff0c;主要介绍IText根据pdf模板填充生成pdf文件&#xff0c;并生成压缩文件。 第二、案例 以下面pdf模板为例&#xff0c;生成一个p…

组会 | 大语言模型 + LoRA

目录 1 大语言模型概述1.1 模型的架构1.2 模型的细节&#xff1a;标记化和嵌入化1.3 模型的核心 2 多头注意力机制3 LoRA 概述3.1 冻结部分模型参数3.2 低秩适配&#xff08;LoRA&#xff09;3.2.1 核心工作原理&#xff1a;冻结模型参数3.2.2 核心工作原理&#xff…

对象:是什么,使用,遍历对象,内置对象

对象使用&#xff1a; 对象访问&#xff1a;&#xff08;对象每个属性之间用逗号隔开&#xff09; 补充&#xff1a;也可以通过 对象名[‘属性名’] 对象方法&#xff1a; 方法名:匿名函数 调用方法不需要控制台打印&#xff0c;只要调用就自动输出值 遍历对象&#xff1a; …

小程序24-滚动效果:scroll-view组件详解

在微信小程序中如果想实现内容滚动&#xff0c;需要使用 scroll-view 组件 scroll-view&#xff1a;可滚动视图区域&#xff0c;适用于需要滚动展示内容的场景&#xff0c;用户可以通过手指滑动或者点击滚动条滚动内容。 scroll-x允许横向滚动scroll-y允许纵向滚动 实现横向…

C++设计模式行为模式———中介者模式

文章目录 一、引言二、中介者模式三、总结 一、引言 中介者模式是一种行为设计模式&#xff0c; 能让你减少对象之间混乱无序的依赖关系。 该模式会限制对象之间的直接交互&#xff0c; 迫使它们通过一个中介者对象进行合作。 中介者模式可以减少对象之间混乱无序的依赖关系&…

AUTOSAR_EXP_ARAComAPI的7章笔记(6)

☞返回总目录 相关总结&#xff1a;ara::com 与 AUTOSAR 元模型的关系总结 7.4 ara::com 与 AUTOSAR 元模型的关系 在本文档中&#xff0c;我们一直在不涉及具体的AP元模型&#xff08;其清单部分&#xff09;的情况下解释 ara::com API的思想和机制&#xff0c;AP元模型是正…

LINUX系统编程之——环境变量

目录 环境变量 1、基本概念 2、查看环境变量的方法 三、查看PATH环境变量的內容 1&#xff09;不带路径也能运行的自己的程序 a、将自己的程序直接添加到PATH指定的路径下 b、将程序所在的路径添加到PATH环境中 四、环境变量与本地变量 1、本地变量创建 2、环境变量创…

MacOS通过X11转发远程运行virt-manager进行虚机分配

今天需要通过本地macbook机器连接远程物理机&#xff0c;执行虚机分配&#xff0c;现有文档仅提供window环境安装&#xff0c;如下整理Mac环境下的安装步骤 操作篇 前提条件 支持x11转发的terminal&#xff0c;我本地使用iTerm2&#xff1b;本地安装XQuartz&#xff0c;作为…

【AI系统】AI 基本理论奠定

虽然 AI 在今年取得了举世瞩目的进展与突破&#xff0c;但是其当前基于的核心理论神经网络等&#xff0c;在这波浪潮开始前已经基本奠定&#xff0c;并经历了多次的起起伏伏。神经网络作为 AI 的前身&#xff0c;经历了以下的发展阶段&#xff1a; 萌芽兴奋期&#xff08;约 19…

网络安全服务人才发展路线图

到2023年&#xff0c;全球网络安全支出规模将达到1512亿美元&#xff08;约合10640.4亿元人民币&#xff09;&#xff0c;并将以9.4%的年复合增长率持续增长。与火爆的产业现状相比&#xff0c;中国的网络安全服务人才面临巨大缺口。相关数据显示&#xff0c;我国网络安全人才缺…

STM32 ADC 读取模拟量

问题 我有一个调速开关&#xff0c;模拟量输入&#xff0c;因此需要使用 STM32 读取模拟量&#xff0c;并通过串口输入来调试。串口相关知识参考 STM32 串口输出调试信息。 硬件信息: CubeMX version 6.12.1Keil uVision V5.41.0.0 参考知识 【STM32】HAL库 STM32CubeMX教…

[每周一更]-(第124期):模拟面试|缓存面试思路解析

文章目录 31 为什么 Redis 不立刻删除已经过期的数据?1. Redis 是怎么删除过期 key 的?2. Redis 为什么不立刻删除已经过期的 key?3. Redis 为什么不每个 key 都启动一个定时器,监控过期时间?4. Redis 是如何执行定期删除的?5. 为什么 Redis 在定期删除的时候不一次性把所…

操作系统——揭开盖子

计算机执行时——取指执行 es:bx等于从0x9000开始&#xff0c;到0x90200结束

uni-app 认识条件编译,了解多端部署

一. 前言 在使用 uni-app 进行跨平台开发的过程中&#xff0c;经常会遇到需要针对不同平台或不同环境进行条件编译的情况。条件编译是一种在编译过程中根据指定条件选择不同代码路径的技术&#xff0c;可以帮助我们在不同平台或环境下编写不同的代码&#xff0c;以适应不同的平…

模糊控制系统的设计(取材bilibili_蓝天的季洁)

模糊控制原理和传统控制原理&#xff0c;在框图上的区别实际上只在控制器方面存在差异&#xff0c;将传统的控制器改为了模糊控制器&#xff08;fuzzy controller&#xff09;。 通过举例说明&#xff0c;将原有的[0,100]的参数通过隶属函数规则&#xff0c;&#xff08;类似于…