spring-boot-cache整合redis

引入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

配置

spring:cache:type: redisredis:host: localhostport: 6379username:password:database: 1

配置类

package com.qiangesoft.cache.config;import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.cache.RedisCacheWriter;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;import java.time.Duration;/*** 缓存配置** @author qiangesoft* @date 2024-05-15*/
@EnableCaching
@Configuration
public class RedisCacheConfig extends CachingConfigurerSupport {private static final StringRedisSerializer STRING_SERIALIZER = new StringRedisSerializer();private static final GenericJackson2JsonRedisSerializer JACKSON__SERIALIZER = new GenericJackson2JsonRedisSerializer();@Beanpublic CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()// 三分钟有效期.entryTtl(Duration.ofMinutes(3)).serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(STRING_SERIALIZER)).serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(JACKSON__SERIALIZER));return RedisCacheManager.builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory)).cacheDefaults(cacheConfiguration).build();}@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {// 配置redisTemplateRedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(redisConnectionFactory);// key序列化redisTemplate.setKeySerializer(STRING_SERIALIZER);// value序列化redisTemplate.setValueSerializer(JACKSON__SERIALIZER);// Hash key序列化redisTemplate.setHashKeySerializer(STRING_SERIALIZER);// Hash value序列化redisTemplate.setHashValueSerializer(JACKSON__SERIALIZER);redisTemplate.afterPropertiesSet();return redisTemplate;}}

服务类

package com.qiangesoft.cache.service;import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;/*** 用户服务类** @author qiangesoft* @date 2024-05-15*/
@Slf4j
@Service
public class UserInfoService {/*** 模拟数据库*/private final Map<Long, UserInfo> userInfoMap = new ConcurrentHashMap<>();private final String CACHE_KEY = "user";@CachePut(cacheNames = CACHE_KEY, key = "#userInfo.id")public UserInfo add(UserInfo userInfo) {log.info("UserInfoService.add() execute db !");userInfoMap.put(userInfo.getId(), userInfo);return userInfo;}@CacheEvict(cacheNames = CACHE_KEY, key = "#id")public void removeById(Long id) {log.info("UserInfoService.removeById() execute db !");userInfoMap.remove(id);}@CacheEvict(cacheNames = CACHE_KEY, allEntries = true)public void remove() {log.info("UserInfoService.remove() execute db !");userInfoMap.clear();}@CacheEvict(cacheNames = CACHE_KEY, key = "#userInfo.id")public void updateById(UserInfo userInfo) {log.info("UserInfoService.updateById() execute db !");userInfoMap.put(userInfo.getId(), userInfo);}@Cacheable(cacheNames = CACHE_KEY + ":list")public List<UserInfo> listAll() {log.info("UserInfoService.listAll() execute db !");return new ArrayList<>(userInfoMap.values());}@Cacheable(cacheNames = CACHE_KEY, key = "#id", unless = "#result == null")public UserInfo getById(Long id) {log.info("UserInfoService.getById() execute db !");UserInfo userInfo = userInfoMap.get(id);return userInfo;}}

测试

package com.qiangesoft.cache.controller;import com.qiangesoft.cache.service.UserInfo;
import com.qiangesoft.cache.service.UserInfoService;
import com.qiangesoft.cache.utils.CacheManagerUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;/*** 用户测试** @author qiangesoft* @date 2024-05-15*/
@RequestMapping("/user")
@RestController
public class UserInfoController {@Autowiredprivate UserInfoService userInfoService;@Autowiredprivate CacheManagerUtil cacheManagerUtil;@PostMappingpublic void add(@RequestBody UserInfo userInfo) {userInfoService.add(userInfo);}@DeleteMapping("/{id}")public void removeById(@PathVariable Long id) {userInfoService.removeById(id);}@DeleteMapping("/all")public void remove() {userInfoService.remove();}@PutMappingpublic void updateById(@RequestBody UserInfo userInfo) {userInfoService.updateById(userInfo);}@GetMappingpublic List<UserInfo> listAll() {return userInfoService.listAll();}@GetMapping("/{id}")public UserInfo getById(@PathVariable Long id) {return userInfoService.getById(id);}@GetMapping("/current")public Object current(String id) {Object user = cacheManagerUtil.getCache("user", id);return user;}}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

同为代码签名证书,OV和EV的区别在哪?

代码签名证书是用于为软件开发者提供的数字签名认证服务&#xff0c;它有助于保护软件的安全性和开发者的声誉&#xff0c;OV代码签名和EV代码签名有什么区别呢&#xff0c;如何选择&#xff1f; 代码签名证书查看https://www.joyssl.com/certificate/select/code_signing.htm…

微分阻尼作用的理解

先说阻尼的作用,阻尼能够缩短系统整定时间,减小系统响应的振动幅度。 1、CODESYS位置式PID(完整ST源代码) CODESYS位置式PID(完整ST源代码)_codesys pid功能块-CSDN博客文章浏览阅读1.2k次,点赞2次,收藏2次。CODESYS增量式PID完整源代码请参看下面文章链接:CODESYS增量式…

什么是等保测评?等保测评必须进行吗?

等保测评&#xff0c;全称为信息安全等级保护测评&#xff0c;是指对信息系统安全等级保护状况进行测试评估的活动。它是根据国家信息安全等级保护规范规定&#xff0c;由具有相应资质的测评机构&#xff0c;按照相关管理规范和技术标准进行的&#xff0c;目的是验证信息系统是…

Minecraft 我的世界服务器Java版开服联机教程

本教程使用Paper核心开服 1、进入控制面板 1.2、第一次购买服务器会安装游戏端&#xff0c;大约5分钟左右&#xff0c;如果长时间处于安装状态请联系客服 2、开启服务器 2.1、等待出现同意Minecraft EULA 协议时&#xff0c;点击“我接受” 2.2、等待running出现服务器就打开了…

栈和队列(1)

现在是个激动人心的时刻&#xff0c;因为我们来到了栈和队列的章节。 栈是一种特殊的线性表&#xff0c;只允许在一端进行插入和删除操作。进入数据插入和删除的一端叫作栈顶&#xff0c;另一端称为栈底。具有后进先出的特点。 压栈&#xff1a;数据的插入操作叫作进栈/入栈/…

【GESP】2023年12月图形化三级 -- 小杨做题

小杨做题 【题目描述】 为了准备考试,小杨每天都要做题。第 1 天,小杨做了 a a a 道题,第 2 天,小杨做了 b b b

vue-pure-admin项目内复制文字粘贴到word中之后存在边框问题

vue-pure-admin项目内复制文字粘贴到word中之后存在黑色边框是由于reset.scss文件内设置了通配符的border样式 修改前 代码 *, ::before, ::after {box-sizing: border-box;// 添加这个样式会导致复制的文字粘贴到word中带有边框问题border-color: currentColor;border-styl…

MIRO时,修改页签“采购订单参考”的数量时,金额不自动计算

MIRO 发票校验时&#xff0c;进入到如下界面&#xff0c;系统参考采购订单自动带出已经收货的金额和数量。 此时如果想要修改数量时&#xff0c;有些用户账号下&#xff0c;金额不自动计算&#xff0c;但是有些用户账号下&#xff0c;数量更改时&#xff0c;系统自动计算和建议…

FreeRTOS中断管理

文章目录 前言一、ISR的API函数二、切换任务 前言 在RTOS中&#xff0c;需要应对各类事件。这些事件很多时候是通过硬件中断产生。 假设当前系统正在运行Task1任务&#xff0c;用户按下了按键&#xff0c;触发了按键中断。触发中断后&#xff1a; 硬件负责&#xff1a; CPU跳到…

决策规划仿真平台的搭建

以下内容笔记据来自于b站up主忠厚老实的老王&#xff0c;视频&#xff1b;链接如下&#xff1a; 自动驾驶决策规划算法第二章第一节 决策规划仿真平台搭建_哔哩哔哩_bilibili 使用到的软件有matlab、prescan、carsim以及visual stadio。 我电脑上软件的版本是matlab2022a&am…

Java | 增强for底层工作机制

✍&#x1f3fc;作者&#xff1a;周棋洛&#xff0c;bilidown开发者。 ♉星座&#xff1a;金牛座 &#x1f3e0;主页&#xff1a;我的个人网站 &#x1f310;关键&#xff1a;Java 增强for 工作机制 目录 引言增强for循环语法增强for工作机制探究简单总结1.对于实现了Iterable接…

威纶通触摸屏下载项目文件后,文本都变成了框框的解决办法

威纶通触摸屏下载项目文件后,文本都变成了框框的解决办法 我们在用Easy builder pro编辑某些项目的情况下,编译没问题,为什么下载到触摸屏之后,文本都变成了框框了呢? 分析:: 不能正常显示文本的原因是字体文件缺失。 解决办法: 如下图所示,在Easy builder pro软件中,…

nginx反向代理kafka集群实现内外网隔离访问 —— 筑梦之路

背景说明 我们在使用Kafka客户端连接到Kafka集群时&#xff0c;即使连接的节点只配置了一个集群的Broker地址&#xff0c;该Broker将返回给客户端集群所有节点的信息列表。然后客户端使用该列表信息&#xff08;Topic的分区信息&#xff09;再与集群进行数据交互。这里Kafka列表…

街道治安新利器:EasyCVR智能视频管理方案助力城市安全新高度

一、背景分析 随着城市化进程的加快和社会治安形势的日趋复杂&#xff0c;街道治安管理面临着前所未有的挑战。对于街道治安的管理&#xff0c;面临着街道上机动车、非机动车违停、游商摊贩、垃圾堆积、人员监管等问题&#xff0c;既影响市容市貌&#xff0c;又有安全隐患。传…

SpringBoot(一)之初始化

SpringBoot(一)之初始化 文章目录 SpringBoot(一)之初始化SpringBoot框架 SpringBoot简化配置1. 创建SpringBoot项目关于初始化错误 2. SpringBoot项目结构主类pom.xml1. 关于spring-boot-starter-parent2. 关于spring-boot-starter-web3. 关于spring-boot-starter-test4. 关于…

NFC交友名片源码

NFC交友名片源码 效果图部分源码领取源码下期更新预报 效果图 部分源码 <html lang"en"><head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport"…

解决Word文档中页眉有部分有,有部分没有的问题

问题描述&#xff1a;一个Word文档中&#xff0c;在页眉上添加文档名称和页码&#xff0c;但是有的有&#xff0c;有的没有&#xff0c;选择“链接到前一节”也无法解决该问题。 原因分析&#xff1a;页眉页脚中&#xff0c;勾选了“首页不同”的选项&#xff0c;如下图&#…

AI交互数字人赋能农业数字化、智能化推广营销

2024陵水荔枝文化节上“数字新农人”陵小荔身着黎族服饰、佩戴银器亮相开幕式现场&#xff0c;AI交互数字人生动地以互动式推介和歌舞等形式&#xff0c;带领宾客们了解陵水荔枝的发展历程、产业布局、未来愿景等。如今&#xff0c;越来越多农产品品牌通过3D虚拟数字人定制&…

【Java基础】集合(2) —— List

List 存储的对象是有序的&#xff08;集合中存储对象的顺序和使用add方法添加对象的顺序一致&#xff09;&#xff0c;存储的对象是可重复的。 List的特有的功能: 都是可以操作索引的功能。 增: void add(int index, E element )boolean addAll(int index, Collection<? …