广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Spring项目中使用Cache Redis实现数据缓存
  • 142
分享到

Spring项目中使用Cache Redis实现数据缓存

2024-04-02 19:04:59 142人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录spring项目中实现数据缓存一、Spring Cache + Redis 介绍二、项目中集成1. 引入依赖2. 添加 redis 配置类3. 配置文件增加 redis 配置4.

Spring项目中实现数据缓存

有时候我们为了提高查询速度,会使用缓存,但是并不是所有数据都适合放到缓存中来。

像一些不经常修改的数据、固定的数据、经常查询的数据等,是适合放到缓存的。

那么现在就把之前实现的字典功能里的数据,放到缓存里去。

一、Spring Cache + Redis 介绍

Spring Cache是一个非常优秀的缓存组件。

自 Spring 3.1起,提供了类似于@Transactional注解事务的注解Cache支持,且提供了Cache抽象,方便切换各种底层Cache(如:redis)。

使用Spring Cache的优点:

  • 提供基本的Cache抽象,方便切换各种底层Cache
  • 通过注解Cache可以实现类似于事务一样,缓存逻辑透明的应用到我们的业务代码上,且只需要更少的代码就可以完成
  • 提供事务回滚时也自动回滚缓存
  • 支持比较复杂的缓存逻辑

二、项目中集成

1. 引入依赖

<dependencies>
        <!-- redis -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!-- spring2.X集成redis所需common-pool2-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
            <version>2.6.0</version>
        </dependency>
    </dependencies>

2. 添加 redis 配置类

配置类是一个比较固定的写法,需要了解下结构。

// 配置类
@Configuration
// 开启缓存处理
@EnableCaching
public class RedisConfig {
    
    @Bean
    public KeyGenerator keyGenerator() {
        return new KeyGenerator() {
            @Override
            public Object generate(Object target, Method method, Object... params) {
                StringBuilder sb = new StringBuilder();
                sb.append(target.getClass().getName());
                sb.append(method.getName());
                for (Object obj : params) {
                    sb.append(obj.toString());
                }
                return sb.toString();
            }
        };
    }
    
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        Jackson2JSONRedisSerializer jackson2jsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        //解决查询缓存转换异常的问题
        ObjectMapper om = new ObjectMapper();
        // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        //序列号key value
        redisTemplate.seTKEySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
    
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        //解决查询缓存转换异常的问题
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        // 配置序列化(解决乱码的问题),过期时间600秒
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofSeconds(600))
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
                .disableCachingNullValues();
        RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
                .cacheDefaults(config)
                .build();
        return cacheManager;
    }
}

主要是 3 个方法:

  • 自定义key规则:可以更具我们自定义规则生成 key。
  • 设置RedisTemplate规则:后续操作redis,往里存取内容,需要用到 RedisTemplate,这里进行相关设置。
  • 设置CacheManager缓存规则:处理缓存相关的一些规则,比如缓存时间、乱码处理等。

3. 配置文件增加 redis 配置

spring.redis.host=XXX.XXX.XXX.XX
spring.redis.port=6379
spring.redis.database= 0
spring.redis.timeout=1800000
spring.redis.lettuce.pool.max-active=20
spring.redis.lettuce.pool.max-wait=-1
#最大阻塞等待时间(负数表示没限制)
spring.redis.lettuce.pool.max-idle=5
spring.redis.lettuce.pool.min-idle=0

4. 启动安装好的 redis

安装相关可以参考我之前的分享:

https://www.jb51.net/do/plus/view.PHP?aid=830685

我换了台云服务器,也重新安装了下,测试正常。

这是单机操作,如果需要其他主机也可以链接到redis,还要改个配置:

三、Spring Cache 常用注解介绍

Spring Cache 提供了相关注解,可以让我们很方便实现缓存操作,先看下最常用的几个。

1. @Cacheable

用的最多的注解,功能也很强大,一般用在查询方法上。

可以根据方法对其返回结果进行缓存,下次请求时,如果缓存存在,则直接读取缓存数据返回;如果缓存不存在,则执行方法,并把返回的结果存入缓存中。

说白了,比如我第一次查询缓存操作,如果不存在就去查询数据库,查到数据后返回,并且放到缓存里去,当第二次查询的时候就可以查询缓存里的数据。

查看源码,属性值如下:

value:缓存名,必填,它指定了你的缓存存放在哪块命名空间

cacheNames:与 value 差不多,二选一即可

key:可选属性,可以使用 SpEL 标签自定义缓存的key

2. @CachePut

一般用在新增方法上。

使用该注解标志的方法,每次都会执行,并将结果存入指定的缓存中。其他方法可以直接从响应的缓存中读取缓存数据,而不需要再去查询数据库

查看源码,属性值如下:

value:缓存名,必填,它指定了你的缓存存放在哪块命名空间

cacheNames:与 value 差不多,二选一即可

key:可选属性,可以使用 SpEL 标签自定义缓存的key

3. @CacheEvict

一般用在更新或者删除方法上,使用该注解标志的方法,会清空指定的缓存。

查看源码,属性值如下:

value:缓存名,必填,它指定了你的缓存存放在哪块命名空间

cacheNames:与 value 差不多,二选一即可

key:可选属性,可以使用 SpEL 标签自定义缓存的key

allEntries:是否清空所有缓存,默认为 false。如果指定为 true,则方法调用后将立即清空所有的缓存

beforeInvocation:是否在方法执行前就清空,默认为 false。如果指定为 true,则在方法执行前就会清空缓存

四、功能里实现缓存操作

改造之前的字典功能,加入缓存相关操作,在查询和导入(新增)的操作上增加对应注解。

查询操作

在 service 层对应的实现方法上增加注解

@Cacheable(value = "dict", keyGenerator = "keyGenerator")

value = "dict", keyGenerator = "keyGenerator",这里面传入的值就是为了构造key,keyGenerator就是redis配置类里定义的:

接下来到前端刷新一下列表页面,进行一次查询请求,然后查看下redis:

这个 key 就是按照配置类里自定义的规则构建出来的,再来查询一下这个 key:

缓存里有数据了。

导入操作

在 service 层对应的实现方法上增加注解@CacheEvict(value = "dict", allEntries=true)

测试一下,我先del删除掉缓存,然后前端页面做一个导入的操作:

导入成功后,再次查看缓存:

新增成功。

以上就是Spring项目中使用Cache Redis实现数据缓存的详细内容,更多关于Spring Cache Redis数据缓存的资料请关注编程网其它相关文章!

--结束END--

本文标题: Spring项目中使用Cache Redis实现数据缓存

本文链接: https://www.lsjlt.com/news/150304.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring项目中使用Cache Redis实现数据缓存
    目录Spring项目中实现数据缓存一、Spring Cache + Redis 介绍二、项目中集成1. 引入依赖2. 添加 redis 配置类3. 配置文件增加 redis 配置4....
    99+
    2022-11-13
  • Spring Cache+Redis缓存数据的实现示例
    目录1、为什么使用缓存2、常用的缓存注解2.1 @Cacheable2.2 @CacheEvict2.3、@Cacheput2.4、@Caching2.5、@CacheConfig3...
    99+
    2022-11-12
  • Spring Cache 集成 Caffeine实现项目缓存的示例
    目录一、前言二、缓存注解三、实战操作1、依赖引入2、yaml配置3、开启缓存4、模拟方法5、测试6、改造一、前言 Spring Cache本身是Spring框架中一个缓存体系的抽象实...
    99+
    2022-11-12
  • 使用Spring如何实现注解Cache与Redis缓存
    使用Spring如何实现注解Cache与Redis缓存?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1. redis 和 ehcache的区别:简单了解了下,个人觉得 从部署上...
    99+
    2023-05-31
    spring redis 缓存
  • SpringBoot项目中怎么使用缓存Cache
    本文小编为大家详细介绍“SpringBoot项目中怎么使用缓存Cache”,内容详细,步骤清晰,细节处理妥当,希望这篇“SpringBoot项目中怎么使用缓存Cache”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧...
    99+
    2023-07-06
  • Redis通过在Spring Boot项目中使用实现集中式缓存
    这篇文章将为大家详细讲解有关Redis通过在Spring Boot项目中使用实现集中式缓存,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 利用Spring Initializr来新建一个sp...
    99+
    2023-05-31
    springboot 集中 redis
  • 详解Spring Boot使用redis实现数据缓存
    基于spring Boot 1.5.2.RELEASE版本,一方面验证与Redis的集成方法,另外了解使用方法。集成方法配置依赖修改pom.xml,增加如下内容。 <dependency> <groupId>...
    99+
    2023-05-31
    spring boot redis
  • 在springboot使用spring 如何实现缓存cache
    本篇文章为大家展示了在springboot使用spring 如何实现缓存cache,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。声明式缓存Spring 定义 CacheManager 和 Cache...
    99+
    2023-05-31
    springboot spring cache
  • 利用Redis进行数据缓存的项目实践
    目录1. 引言2. 将信息添加到缓存的业务流程3. 实现代码3.1 代码实现(信息添加到缓存中)3.2 缓存更新策略3.3 实现主动更新4. 缓存穿透4.1 解决缓存穿透(使用空对象...
    99+
    2022-11-13
  • 怎么在ssm项目中使用redis缓存查询数据
    怎么在ssm项目中使用redis缓存查询数据?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。xml配置:<bean id=&qu...
    99+
    2022-10-18
  • 浅谈redis缓存在项目中的使用
    背景 Redis 是一个开源的内存数据结构存储系统。 可以作为数据库、缓存和消息中间件使用。 支持多种类型的数据结构。 Redis 内置了 复制(replication),LUA脚...
    99+
    2022-11-12
  • SpringBoot项目中使用缓存Cache的正确方法分享
    目录前言启用缓存@EnableCaching自定义缓存管理器@Cacheable@CachePut@CacheEvict@Caching@CacheConfigCondition &...
    99+
    2023-05-15
    SpringBoot使用缓存Cache方法 SpringBoot使用缓存Cache SpringBoot 缓存Cache
  • Spring 如何结合Redis数据库实现缓存
    这篇文章将为大家详细讲解有关 Spring 如何结合Redis数据库实现缓存,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1. 依赖包安装pom.xml 加入:<!-- redis c...
    99+
    2023-05-31
    spring redis 缓存
  • 怎么在javaWeb项目中使用Redis进行缓存
    怎么在javaWeb项目中使用Redis进行缓存?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一:serviceImpl定义:@Service  &nb...
    99+
    2023-05-30
  • SpringBoot项目中使用redis缓存的方法步骤
    本文介绍了SpringBoot项目中使用redis缓存的方法步骤,分享给大家,具体如下:Spring Data Redis为我们封装了Redis客户端的各种操作,简化使用。 - 当Redis当做数据库或者消息队列来操作时,我们一般使用Red...
    99+
    2023-05-30
    spring boot redis
  • 在Spring Boot中使用注解如何实现Redis 缓存
    在Spring Boot中使用注解如何实现Redis 缓存?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、创建 Caching 配置类RedisKeys.Javapackag...
    99+
    2023-05-31
    springboot redis 注解
  • 在项目中使用redis做缓存的一些思路
    目录在项目中redis做缓存的一些思路首先,缓存的对象有三种本人走过的一些弯路为什么没用Redis做缓存使用Table作本地缓存使用Redis作缓存让我们来思考一下下面几个问题那么使...
    99+
    2022-11-12
  • Spring Boot人使用Redis数据库的缓存机制
    Spring Boot人使用Redis数据库的缓存机制?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。本文章牵涉到的技术点比较多:spring Data JPA、Redis、Sp...
    99+
    2023-05-31
    springboot 缓存机制 redis
  • 怎样用redis实现数据库缓存
    怎样用redis实现数据库缓存?针对这个问题,这篇文章给出了相对应的分析和解答,希望能帮助更多想解决这个问题的朋友找到更加简单易行的办法。创建并登陆redis数据库,这是使用的是商业版,也可以自建 &nbs...
    99+
    2022-10-18
  • Spring Boot中怎么利用Redis 实现缓存操作
    这期内容当中小编将会给大家带来有关Spring Boot中怎么利用Redis 实现缓存操作,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、缓存的应用场景二、更新缓存的策略三、运行 springboot-...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作