【探花交友】SpringCache

目录

通用缓存SpringCache

重要概念

导入依赖

开启缓存支持

编写UserInfoService

缓存@Cacheable

发布视频清空缓存

通用缓存SpringCache

实现缓存逻辑有2种方式:

  1. 每个接口单独控制缓存逻辑

  2. 统一控制缓存逻辑Spring从3.1开始定义了org.springframework.cache.Cache和org.springframework.cache.CacheManager接口来统一不同的缓存技术;并支持使用JCache(JSR-107)注解简化我们开发;

  • Cache接口为缓存的组件规范定义,包含缓存的各种操作集合;

  • Cache接口下Spring提供了各种xxxCache的实现;如RedisCache,EhCacheCache ,ConcurrentMapCache等;

  • 每次调用需要缓存功能的方法时,Spring会检查检查指定参数的指定的目标方法是否已经被调用过;如果有就直接从缓存中获取方法调用后的结果,如果没有就调用方法并缓存结果后返回给用户。下次调用直接从缓存中获取。

  • 使用Spring缓存抽象时我们需要关注以下两点;

    1、确定方法需要被缓存以及他们的缓存策略

    2、从缓存中读取之前缓存存储的数据

内部使用AOP的形式,对redis操作进行简化

重要概念

名称解释
@Cacheable主要针对方法配置,能够根据方法的请求参数对其进行缓存
@CacheEvict清空缓存

入门案例

导入依赖

导入SpringDataRedis的依赖,并在application.yml中配置 (略)

开启缓存支持

然后在启动类注解@EnableCaching开启缓存

@SpringBootApplication
@EnableCaching  //开启缓存
public class DemoApplication{public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

编写UserInfoService

package com.tanhua.server.test;import com.tanhua.domain.db.UserInfo;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;@Service
public class UserInfoService {//根据id查询public UserInfo queryById(Long userId) {//从数据库查询UserInfo user = new UserInfo();user.setId(userId);user.setNickname("ceshi");return user;}//根据id修改public void update(Long userId) {UserInfo user = new UserInfo();user.setId(userId);user.setNickname("itcast");}
}

缓存@Cacheable

@Cacheable注解会先查询是否已经有缓存,有会使用缓存,没有则会执行方法并缓存。

@Cacheable(value = "user",key = "#userId")
public UserInfo queryById(Long userId) {//从数据库查询UserInfo user = new UserInfo();user.setId(userId);user.setNickname("ceshi");return user;
}

此处的value是必需的,它指定了你的缓存存放在哪块命名空间。

此处的key是使用的spEL表达式,参考上章。这里有一个小坑,如果你把methodName换成method运行会报错,观察它们的返回类型,原因在于methodNameStringmethohMethod

此处的User实体类一定要实现序列化public class User implements Serializable,否则会报java.io.NotSerializableException异常。

到这里,你已经可以运行程序检验缓存功能是否实现。

清除@CacheEvict

@CachEvict 的作用 主要针对方法配置,能够根据一定的条件对缓存进行清空 。

//根据id修改
@CacheEvict(value = "user",key = "#userId")
public void update(Long userId) {//修改用户UserInfo user = new UserInfo();user.setId(userId);user.setNickname("itcast");
}

视频列表缓存处理

修改VideoService,分页列表存入缓存,发布视频删除缓存

由于使用Reids缓存处理数据时,不能缓存ResponseEntity对象,所以需要修改方法返回值为

PageResult

@Cacheable(value="videoList",key="#page + '_' +  #pagesize")
public PageResult queryVideoList(Integer page, Integer pagesize) {//1、调用API查询 : PageReulst<Video>PageResult result = videoApi.findAll(page,pagesize);//2、获取分页中的list集合  List<Video>List<Video> items = (List<Video>)result.getItems();//3、循环视频列表,一个Video构造一个VoList<VideoVo> list = new ArrayList<>();for (Video item : items) {UserInfo userInfo = userInfoApi.findById(item.getUserId());VideoVo vo = VideoVo.init(userInfo, item);//从redis中获取,当前用户是否已经关注了视频发布作者String key = "followUser_"+UserHolder.getUserId()+"_"+item.getUserId();if (redisTemplate.hasKey(key)) {vo.setHasFocus(1);}list.add(vo);}//4、替换result中的item数据result.setItems(list);//5、构造返回值result;
}

发布视频清空缓存

//发布视频
@CacheEvict(value="videoList",allEntries = true)
public ResponseEntity saveVideo(MultipartFile videoThumbnail, MultipartFile videoFile) throws IOException {//1、图片上传到阿里云oss,获取请求地址String picUrl = ossTemplate.upload(videoThumbnail.getOriginalFilename(), videoThumbnail.getInputStream());//2、视频上传到fdfs上,获取请求地址String filename = videoFile.getOriginalFilename(); //xxxx.avi//获取文件后缀String sufix = filename.substring(filename.lastIndexOf(".")+1);StorePath storePath = client.uploadFile(videoFile.getInputStream(),videoFile.getSize(), sufix, null); //文件输入流,文件长度(大小),文件的后缀名,元数据(null)String videoUrl = webServer.getWebServerUrl() + storePath.getFullPath();//3、构建Video对象,并设置属性Video video = new Video();video.setPicUrl(picUrl);video.setVideoUrl(videoUrl);video.setText("传智播客是一个负责任的教育机构~"); //客户端未传递,手动模拟video.setUserId(UserHolder.getUserId());//4、调用api保存videoApi.save(video);//5、构建返回值return ResponseEntity.ok(null);
}

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

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

相关文章

04.HTTPS的实现原理-HTTPS的混合加密流程

04.HTTPS的实现原理-HTTPS的混合加密流程 简介1. 非对称加密与对称加密2. 非对称加密的工作流程3. 对称加密的工作流程4. HTTPS的加密流程总结 简介 主要讲述了HTTPS的加密流程&#xff0c;包括非对称加密和对称加密两个阶段。首先&#xff0c;客户端向服务器发送请求&#xf…

【WebAR-图像跟踪】在Unity中基于Imagine WebAR实现AR图像识别

写在前面的话 感慨一下&#xff0c; WebXR的发展是真的快&#xff0c;20年的时候&#xff0c;大多都在用AR.js做WebAR。随着WebXR标准发展&#xff0c;现在诸如Threejs、AFrame、Unity等多个平台都支持里WebXR。 本文将介绍在Unity中使用 Image Tracker实现Web端的AR图像识别功…

视频会议是如何实现屏幕标注功能的?

现在主流的视频会议软件都有屏幕标注功能&#xff0c;屏幕标注功能给屏幕分享者讲解分享内容时提供了极大的方便。那我们以傲瑞视频会议&#xff08;OrayMeeting&#xff09;为例&#xff0c;来讲解屏幕标注是如何实现的。 傲瑞会议的PC端&#xff08;Windows、信创Linux、银河…

物料描述的特殊字符

MM03查看某料号&#xff0c;有特殊字符&#xff0c;看上去是# SE16N中并没有显示出来这个特殊字符 DeBug时可以看到#&#xff0c;复制出来也是#&#xff0c;但其实不是 ALV中也看不到这个特殊字符 需要写代码&#xff0c;获取这个编码Unicode 参考&#xff1a;【ABAP系列】SAP…

HEIC 是什么图片格式?如何把 iPhone 中的 HEIC 转为 JPG?

在 iPhone 拍摄照片时&#xff0c;默认的图片格式为 HEIC。虽然 HEIC 格式具有高压缩比、高画质等优点&#xff0c;但在某些设备或软件上可能存在兼容性问题。因此&#xff0c;将 HEIC 格式转换为更为通用的 JPG 格式就显得很有必要。本教程将介绍如何使用简鹿格式工厂&#xf…

多模态论文笔记——LLaVA

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍多模态模型&#xff1a;LLaVA。处理包含图像和文本的多模态数据&#xff0c;并生成合理准确的回答。 文章目录 论文模型架构视觉编码器语言模型多模态融…

【源码 导入教程 文档 讲解】基于springboot校园新闻管理系统源码和论文

可做计算机毕业设计JAVA、PHP、爬虫、APP、小程序、C#、C、python、数据可视化、大数据、文案 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xf…

时序论文34|AdaWaveNet:用于时间序列分析的自适应小波网络

论文标题&#xff1a;AdaWaveNet: Adaptive Wavelet Network for Time Series Analysis 论文链接&#xff1a;https://arxiv.org/abs/2405.11124 论文代码&#xff1a;https://github.com/comp-well-org/AdaWaveNet/ 前言 这篇文章面向非平稳时间序列进行分析与建模&#x…

运行Springboot + Vue 项目

想要源码&#xff0c;请点击的系统获取源码&#xff1a;https://bichuanyuan.online **前言&#xff1a;**很多小白拿到java SpringBoot Vue前后端分离的项目却不知道怎么运行起来&#xff0c;这里博主就带领小白们一起将项目运行起来吧&#xff01; 一、环境准备 java后端…

16、【ubuntu】【gitlab】【补充】服务器断电后,重启服务器,gitlab无法访问

背景 接wiki 【服务器断电后&#xff0c;重启服务器&#xff0c;gitlab无法访问】https://blog.csdn.net/nobigdeal00/article/details/144280761 最近把不小心把服务器重启&#xff0c;每次重启后&#xff0c;都会出现gitlab无法访问 分析 查看系统正在运行的任务 adminpc…

保姆级JavaWeb项目创建、部署、连接数据库(tomcat)

目录 简介&#xff1a; 一、创建项目 二、tomcat部署 1、将tomcat解压在一个自己找得到路径 2、在idea中添加tomacat模板块 3、添加tomcat服务器 ?三、连接数据库 1、创建一个新的数据库 2、为项目添加jdbc驱动包 3、创建jdbc类 简介&#xff1a; 本学期学的javawe…

使用 HTML 和 CSS 实现绚丽的节日烟花效果

文章目录 1. 效果预览2. 核心技术栈3. 核心代码解读3.1 HTML结构3.2 霓虹文字的CSS样式3.2.1 核心样式代码3.2.2 动画效果 3.3 JavaScript 的烟花效果实现3.3.1 烟花上升3.3.2 粒子爆炸 4. 用户交互5. 运行步骤总结 1. 效果预览 打开后输入文本的展示内容 用户点击页面后播放…

读书笔记-《乡下人的悲歌》

前段时间看了一些 J.D. Vance 的采访视频&#xff0c;几乎都是记者带着刁难的问题先手进攻&#xff0c;而 Vance 面带微笑&#xff0c;提及对方的名字&#xff0c;条理清晰地从对方的攻击中切回主题形成后手反制&#xff0c;实在让人看得过瘾。 更不可思议的是&#xff0c;Van…

Llama 3 后训练(三)

目录 4. 后训练 4.1 建模 图表解读 4.1.1 聊天对话格式 4.1.2 奖励建模 4.1.3 监督微调&#xff08;Supervised Finetuning&#xff09; 4.1.4 直接偏好优化&#xff08;Direct Preference Optimization&#xff09; 4.1.5 模型平均&#xff08;Model Averaging&#x…

AI发展新态势:从技术突破到安全隐忧

AI安全的新挑战 近期AI领域出现了令人担忧的新发现。根据最新研究,AI模型已经开始展现出策略性欺骗的倾向。具体表现在以下几个方面: 策略性欺骗行为的出现 在实验中发现,当研究人员试图让AI执行一些"反Anthropic"的操作时(如获取模型权限和外部服务器访问),模…

vue2 elementui if导致的rules判断失效

优化目标 和 目标转化出价必填的 切换的时候还会隐藏掉 这时候的if语句会导致rules判断失效 我的办法是把判断拉到外面 别放在el-form-item里 <section v-if"unitForm.baseTarget OCPM && unitForm.cpaTargetOptions ! undefined && unitForm.cpaTa…

基于顺序表实现队列循环队列的处理

文章目录 1.假溢出的现象2.循环队列3.顺序表实现队列架构4.顺序表模拟实现队列5.设计循环队列&#xff08;校招难度&#xff09; 1.假溢出的现象 下面的这个就是我们的假溢出的这个现象的基本的来源&#xff1a; 我们的这个队列里面是有9个位置的&#xff0c;我们知道这个队列…

NI GPIB设备的GPIB Analyzer功能

GPIB Analyzer支持&#xff1a; 只有名称中带有“”符号的设备或电缆&#xff08;如GPIB或HS&#xff09;支持GPIB Analyzer功能。 示例&#xff1a;GPIB-USB-HS 支持GPIB Analyzer&#xff0c;而 GPIB-USB-HS 和 GPIB-USB-B 不支持。 性能对比&#xff1a; 功能GPIB-USB-B…

微软 CEO 萨提亚・纳德拉:回顾过去十年,展望 AI 时代的战略布局

近日&#xff0c;微软 CEO 萨提亚・纳德拉与著名投资人比尔・格里和布拉德・格斯特纳进行了一场深度对话&#xff0c;回顾了过去十年微软的转型历程&#xff0c;并展望了 AI 时代的战略布局。在这次访谈中&#xff0c;纳德拉分享了他在微软的早期经历&#xff0c;包括他加入微软…

18_HTML5 Web IndexedDB 数据库 --[HTML5 API 学习之旅]

HTML5 Web IndexedDB API 是一种在用户浏览器中存储大量结构化数据的机制&#xff0c;它允许存储和检索键值对&#xff0c;其中键可以是任何有效的JavaScript对象。IndexedDB 主要用于需要复杂查询的数据密集型Web应用。 IndexedDB 的特点&#xff1a; HTML5 Web IndexedDB A…