前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >spring boot redis 缓存_redis本地缓存

spring boot redis 缓存_redis本地缓存

作者头像
全栈程序员站长
发布于 2022-09-30 09:46:52
发布于 2022-09-30 09:46:52
2.2K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

SpringBoot 集成 Redis 缓存

查询操作是应用中最常见的操作,如果每次查询都从 MySQL 中查询则会影响效率,通常需要引入缓存来实现查询性能的优化。缓存可以选择本地缓存,远程缓存或本地缓存结合远程缓存。本地缓存可以使用 Guava 或 Caffeine 提供的解决方案,而远程缓存则可以选择 Redis 这样的内存数据库。本文记录一下 SpringBoot 集成 Redis 做缓存的相关配置。

1 引入依赖

引入相应 Starter。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2 缓存配置

SpringBoot 中缓存由 CacheManager 管理,实现自己的 CacheManager 即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) { 

RedisSerializer<String> redisSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
//解决查询缓存转换异常的问题,为Jackson配置ObjectMapper
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.activateDefaultTyping(
LaissezFaireSubTypeValidator.instance,
ObjectMapper.DefaultTyping.NON_FINAL,
JsonTypeInfo.As.WRAPPER_ARRAY);
om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
jackson2JsonRedisSerializer.setObjectMapper(om);
// 配置序列化(解决乱码的问题)
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
.disableCachingNullValues();
Set<String> cacheNames = new HashSet<>();
cacheNames.add("FlashActivity");
cacheNames.add("FlashItem");
Map<String, RedisCacheConfiguration> configMap = new ConcurrentHashMap<>();
configMap.put("FlashActivity", config.entryTtl(Duration.ofMinutes(60)));
configMap.put("FlashItem", config.entryTtl(Duration.ofSeconds(3)));
return RedisCacheManager.builder(factory)
.cacheDefaults(config)
.initialCacheNames(cacheNames)
.withInitialCacheConfigurations(configMap)
.build();
}

2.1 配置 ObjectMapper

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
// 必要配置,否则反序列化得到的是LinkedHashMap对象
om.activateDefaultTyping(
LaissezFaireSubTypeValidator.instance,
ObjectMapper.DefaultTyping.NON_FINAL,
JsonTypeInfo.As.WRAPPER_ARRAY);
// 出现未知字段不报错
om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

2.2 配置 CacheConfig

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 配置序列化(解决乱码的问题)
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
.disableCachingNullValues();

2.3 不同 Cache 设置不同 TTL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Set<String> cacheNames = new HashSet<>();
cacheNames.add("FlashActivity");
cacheNames.add("FlashItem");
Map<String, RedisCacheConfiguration> configMap = new ConcurrentHashMap<>();
configMap.put("FlashActivity", config.entryTtl(Duration.ofMinutes(60)));
configMap.put("FlashItem", config.entryTtl(Duration.ofSeconds(3)));

3 注解使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 类上指定缓存到哪些 Cache
@CacheConfig(cacheNames = "FlashItem")
@CacheEvict(key = "'FlashItemCache'.concat(#itemId)")
// sync指定为true,缓存失效只会有一个线程取请求数据库,其他线程使用请求回的数据
@Cacheable(key = "'ActivityFlashItemCache'.concat(#activityId)", sync = true)

4 RedisTemplate 配置

使用 RedisTemplate 可以实现手动缓存或其他对 Redis 操作,但之前只是配置缓存相关配置,直接使用RedisTemplate 时不会生效,需要单独配置。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { 

RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key-value结构序列化数据结构
redisTemplate.setKeySerializer(stringRedisSerializer);
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
// hash数据结构序列化方式,必须这样否则存hash 就是基于jdk序列化的
redisTemplate.setHashKeySerializer(stringRedisSerializer);
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/192673.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月17日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
图像分类任务中,Tensorflow 与 Keras 到底哪个更厉害?
转载来源:AI 研习社编译的技术博客 原标题:Tensorflow Vs Keras? — Comparison by building a model for image classificatio
崔庆才
2019/09/04
9350
图像分类任务中,Tensorflow 与 Keras 到底哪个更厉害?
垃圾图像分类流程图yolov4-tiny_用python编写垃圾分类系统
数据下载链接 https://pan.baidu.com/s/1wr3h2Wc720uqUeIroTCIJA百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固,支持教育网加速,支持手机端。注册使用百度网盘即可享受免费存储空间
全栈程序员站长
2022/11/14
6760
垃圾图像分类流程图yolov4-tiny_用python编写垃圾分类系统
我用飞桨做了一个可回收垃圾材料分类机
随着社会生产力的发展,工业化、城镇化的兴起和人口增加,人类社会产生的垃圾与日俱增,加剧了全球范围内的资源短缺和环境污染,对自然环境和人体健康带来了巨大的挑战。
用户1386409
2020/03/24
8440
我用飞桨做了一个可回收垃圾材料分类机
独家 | kaggle季军新手笔记:利用fast.ai对油棕人工林图像进行快速分类(附代码)
WiDS数据马拉松由女性数据科学工作者与她们的伙伴联合发起,她们面临的挑战是需要建立一个模型,来预测一批卫星图像中存在油棕人工林种植园的情况。
数据派THU
2019/05/23
1.1K0
独家 | kaggle季军新手笔记:利用fast.ai对油棕人工林图像进行快速分类(附代码)
fast.ai 深度学习笔记(一)
上面显示的神经网络示例有一个隐藏层。我们在过去几年学到的一些东西是,这种神经网络如果不添加多个隐藏层,就不会快速或可扩展,因此被称为“深度”学习。
ApacheCN_飞龙
2024/02/11
2810
fast.ai 深度学习笔记(一)
CVPR 2022 | 将X光图片用于垃圾分割,港中大(深圳)探索大规模智能垃圾分类
机器之心专栏 作者:李易寒 研究者表示,这一工作有望让大规模的智能垃圾分类检查成为可能,提升垃圾分类回收的效率,减少环境污染。 近些年来,社会的发展带来了生活垃圾的爆发性增长,实行垃圾分类既可以减少对自然环境的破坏,同时对垃圾中的可回收资源进行回收再利用,也带来更大经济效益。垃圾分类的的检查工作是其中的重要一环,只有正确的分类才能提升回收效率和避免环境污染。传统的分类检查方法依赖于人工的翻阅。而现有的图像检查方法也需要打开垃圾袋并且把垃圾摊开。这些检查方法存在两大缺点: 翻开垃圾袋的过程比较繁琐,且对于接触
机器之心
2022/08/25
1960
CVPR 2022 | 将X光图片用于垃圾分割,港中大(深圳)探索大规模智能垃圾分类
Fastai-学习器训练
在Fastai框架下,其实完成了前文所说的数据准备工作,就已经完成了深度网络训练的一半工作。剩下的就是学习器的构建以及训练效果的分析,也就是模型训练的部分。
全栈程序员站长
2022/10/05
8720
Fastai-学习器训练
图像分类比赛中,你可以用如下方案举一反三
雷锋网 AI 研习社按,在本文中,作者将向大家介绍其在 Kaggle 植物幼苗分类大赛(https://www.kaggle.com/c/plant-seedlings-classification)中所使用的解决方案。本文作者曾经位列该项赛事排行榜榜首达数月之久,并最终斩获第五名。作者使用的方法普适性非常强,可以用于其它的图像识别任务。雷锋网(公众号:雷锋网) AI 研习社将原文编译整理如下。
AI研习社
2018/07/26
9520
图像分类比赛中,你可以用如下方案举一反三
如何用 Python 和 fast.ai 做图像深度迁移学习?
说得对!我要感谢你对我专栏的持续关注。我确实讲过深度学习做图像分类,以及迁移学习这两项内容。
王树义
2018/11/29
5810
如何用 Python 和 fast.ai 做图像深度迁移学习?
计算机视觉之ResNet50图像分类
图像分类是计算机视觉应用中最基础的一种,属于有监督学习类别。它的任务是给定一张图像,判断图像所属的类别,比如猫、狗、飞机、汽车等等。本章将介绍使用ResNet50网络对CIFAR-10数据集进行分类。
查拉图斯特拉说
2024/07/11
1.7K0
计算机视觉之ResNet50图像分类
基于python+ResNet50算法实现一个图像识别系统
在本文中将介绍使用Python语言,基于TensorFlow搭建ResNet50卷积神经网络对四种动物图像数据集进行训练,观察其模型训练效果。
子午Python
2023/07/18
1.5K0
测试运行 - 使用 CNTK 的 DNN 图像分类简介
图像分类涉及到决定哪些输入的图像所属的类别,例如识别照片作为一个包含"apples"或"oranges"或"香蕉。" 图像分类的两种最常见方法是使用标准的深度神经网络 (DNN),或使用卷积神经网络 (CNN)。在本文中我将介绍 DNN 方法中,使用 CNTK 库。
AI.NET 极客圈
2020/05/18
1K0
PyTorch +ResNet34实现 图像分类
ResNet在2015年被提出,在ImageNet比赛classification任务上获得第一名,因为它“简单与实用”并存,之后很多方法都建立在ResNet50或者ResNet101的基础上完成的,检测,分割,识别等领域里得到广泛的应用。它使用了一种连接方式叫做“shortcut connection”,顾名思义,shortcut就是“抄近道”的意思,下面是这个resnet的网络结构:
大数据技术与机器学习
2022/03/29
5.3K0
PyTorch +ResNet34实现 图像分类
在 fast.ai 课堂上,我总结的 8 个深度学习最佳实践
翻译 | 付腾 林立宏 整理 | 凡江 在 2017 年我感到最开心的事情就是,我更多地通过实践来参与最新 AI 的发展,学到了很多的数学知识。这很有趣,但是却没有接触什么实践项目。因此,也没有什么东西能体现我付出的努力。 为了弥补这点,在四月份,我在 AI Grant(https://aigrant.org/ )网站上申请了一个 AI 项目,目标是用 FastText(https://fasttext.cc/ ) 的 skip-gram 模型来为肯尼亚语建模。我获得了初选的决赛资格,但是,却没
AI研习社
2018/03/16
1.4K0
在 fast.ai 课堂上,我总结的 8 个深度学习最佳实践
【技术综述】你真的了解图像分类吗?
图像分类是计算机视觉中最基础的任务,基本上深度学习模型的发展史就是图像分类任务提升的发展历史,不过图像分类并不是那么简单,也没有被完全解决。
abs_zero
2018/12/13
6920
【干货】PyTorch实例:用ResNet进行交通标志分类
【导读】本文是机器学习工程师Pavel Surmenok撰写的一篇技术博客,用Pytorch实现ResNet网络,并用德国交通标志识别基准数据集进行实验。文中分别介绍了数据集、实验方法、代码、准备工作
WZEARW
2018/04/08
3.3K0
【干货】PyTorch实例:用ResNet进行交通标志分类
从零开始,半小时学会PyTorch快速图片分类
这是一篇长文教程,建议大家读不完的话一定要收藏,利用闲暇时光将其读完!更加欢迎将本文转发给同学、朋友、同事等。
新智元
2019/07/12
1.5K0
从零开始,半小时学会PyTorch快速图片分类
使用深度学习进行图像分类
解决任何真实问题的重要一步是获取数据。Kaggle提供了大量不同数据科学问题的竞赛。我们将挑选一个2014年提出的问题,然后使用这个问题测试本章的深度学习算法,并在第5章中进行改进,我们将基于卷积神经网络(CNN)和一些可以使用的高级技术来改善图像识别模型的性能。大家可以从https://www.kaggle.com/c/dogs-vs-cats/data下载数据。数据集包含25,000张猫和狗的图片。在实现算法前,预处理数据,并对训练、验证和测试数据集进行划分是需要执行的重要步骤。数据下载完成后,可以看到对应数据文件夹包含了如图3.6所示的图片。
用户9881348
2022/07/07
9590
基于卷积神经网络的垃圾图像分类算法
垃圾分类作为资源回收利用的重要环节之一, 可以有效地提高资源回收利用效率, 进一步减轻环境污染带 来的危害. 随着现代工业逐步智能化, 传统的图像分类算法已经不能满足垃圾分拣设备的要求. 本文提出一种基于 卷积神经网络的垃圾图像分类模型 (Garbage Classification Network, GCNet). 通过构建注意力机制, 模型完成局部 和全局的特征提取, 能够获取到更加完善、有效的特征信息; 同时, 通过特征融合机制, 将不同层级、尺寸的特征进 行融合, 更加有效地利用特征, 避免梯度消失现象. 实验结果证明, GCNet 在相关垃圾分类数据集上取得了优异的 结果, 能够有效地提高垃圾识别精度.
小白学视觉
2022/02/14
1.1K0
基于卷积神经网络的垃圾图像分类算法
精读 AlexNet 并使用 PyTorch 实现图像分类器
在深度学习的历史上,AlexNet 可谓是一座里程碑。2012 年,这款由 Alex Krizhevsky 等人提出的卷积神经网络在 ImageNet 图像识别大赛中以绝对优势震撼了整个计算机视觉界,开启了深度学习的黄金时代。尽管 AlexNet 这篇论文今天被很多大佬拉出来“鞭尸”,但对于我这样的初学者小白来说,还是一篇值得阅读的论文。
繁依Fanyi
2025/03/20
1500
推荐阅读
相关推荐
图像分类任务中,Tensorflow 与 Keras 到底哪个更厉害?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验