Spring Boot缓存实战之Redis 设置有效时间和自动刷新缓存功能(时间支持在配置文件中配置)

Spring Boot缓存实战之Redis 设置有效时间和自动刷新缓存功能

背景

在开发web应用时,我们往往需要使用缓存来提高应用的性能和响应速度。Spring Boot提供了对缓存的支持,可以与多种缓存器集成。其中,Redis是非常流行的缓存器。

在使用Redis缓存时,我们经常会遇到以下问题:

  1. 设置缓存的有效时间;
  2. 自动刷新缓存。

下面将详细介绍如何在Spring Boot中设置Redis缓存的有效时间和自动刷新缓存的功能。

步骤

步骤一:添加依赖

在项目的 pom.xml 文件中添加以下依赖:

<!-- Redis缓存 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

步骤二:配置Redis

在项目的 application.yml 文件中,添加Redis的配置:

# Redis 缓存配置
spring:
  redis:
    host: 127.0.0.1 # Redis服务器地址
    port: 6379 # Redis服务器端口

步骤三:添加缓存注解

在需要缓存的类或方法上添加 @Cacheable@CachePut 注解。例如:

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Cacheable(value = "user", key = "#username")
    public User getUserByUsername(String username) {
        System.out.println("没有使用缓存,从数据库中获取数据...");
        return userDao.getUserByUsername(username);
    }

   @CachePut(value = "user", key = "#username")
    public User updateUserByUsername(String username, User user) {
        System.out.println("更新用户信息,并将结果写入缓存...");
        userDao.updateUserByUsername(username, user);
        return user;
    }
}

步骤四:设置缓存的有效时间

在需要设置缓存有效时间的方法上添加 @Cacheable@CachePut 注解的 cacheManager 属性。例如:

@Cacheable(value = "user", key = "#username", cacheManager = "cacheManager10")
public User getUserByUsername(String username) {
    System.out.println("没有使用缓存,从数据库中获取数据...");
    return userDao.getUserByUsername(username);
}

在Spring Boot容器中,可以创建多个缓存管理器对象。我们可以为不同的缓存对象设置不同的缓存管理器,从而为缓存对象设置不同的过期时间。例如:

@Configuration
public class CacheConfig {

    @Bean("cacheManager10")
    public CacheManager cacheManager10(RedisConnectionFactory factory) {
        RedisCacheManager cacheManager = RedisCacheManager.create(factory);
        // 设置缓存有效期为10秒
        cacheManager.setDefaultExpiration(10);
        return cacheManager;
    }

    @Bean("cacheManager30")
    public CacheManager cacheManager30(RedisConnectionFactory factory) {
        RedisCacheManager cacheManager = RedisCacheManager.create(factory);
        // 设置缓存有效期为30秒
        cacheManager.setDefaultExpiration(30);
        return cacheManager;
    }
}

以上代码中,我们创建了两个缓存管理器对象 cacheManager10cacheManager30,并分别设置了它们默认的缓存有效期为10秒和30秒。

步骤五:自动刷新缓存

上述方法中,设置的缓存有效期是固定的。如果我们需要当数据更新时自动刷新缓存,就需要使用Redis的 TTL 功能。

以设置缓存有效期为10秒为例,在缓存对象存储到Redis中时,同时设置缓存对象的TTL为10秒。当缓存对象的TTL到期时,Redis会自动删除该对象,并且该对象的@Cacheable注解也会失效,下一次调用会重新执行方法,获取最新的数据。

更新用户信息时,我们可以使用 @CachePut 注解细粒度地控制缓存更新,同时手动设置对象的TTL为10秒。例如:

@CachePut(value = "user", key = "#username", cacheManager = "cacheManager10")
public User updateUserByUsername(String username, User user) {
    System.out.println("更新用户信息,并将结果写入缓存...");
    userDao.updateUserByUsername(username, user);
    // 手动设置缓存对象的TTL为10秒
    RedisCache redisCache = (RedisCache) cacheManager.getCache("user");
    redisCache.put(username, user, Duration.ofSeconds(10));
    return user;
}

当更新用户信息时,缓存对象的TTL也会更新,从而保证了数据的一致性。

示例说明

以下是一个基于Spring Boot和Redis实现的简单商品缓存查询应用:

@RestController
public class ProductController {

    @Autowired
    private ProductService productService;

    @GetMapping("/product/{id}")
    public Product getProduct(@PathVariable("id") Long id) {
        return productService.getProductById(id);
    }
}

@Service
public class ProductServiceImpl implements ProductService {

    @Autowired
    private ProductDao productDao;

    @Cacheable(value = "product", key = "#id")
    public Product getProductById(Long id) {
        System.out.println("没有使用缓存,从数据库中获取数据...");
        return productDao.getProductById(id);
    }

    @CachePut(value = "product", key = "#product.id")
    public Product updateProduct(Product product) {
        System.out.println("更新商品信息,并将结果写入缓存...");
        productDao.updateProduct(product);
        return product;
    }
}

在以上示例中,我们使用 @Cacheable 注解实现了商品的缓存查询,并使用 @CachePut 注解实现了商品信息的更新(同时更新了缓存中的数据)。

CacheConfig 类中,我们自定义了一个缓存管理器 cacheManager60,并为 product 缓存对象设置了有效期为60秒:

@Configuration
public class CacheConfig {

    @Bean("cacheManager60")
    public CacheManager cacheManager60(RedisConnectionFactory factory) {
        RedisCacheManager cacheManager = RedisCacheManager.create(factory);
        // 设置缓存有效期为60秒
        cacheManager.setDefaultExpiration(60);
        return cacheManager;
    }

    // ...
}

当我们访问商品信息时,如果在60秒内再次访问,即会从Redis缓存中获取缓存结果,而不是从数据库中获取。

参考文献:

  • Spring Boot文档:https://docs.spring.io/spring-boot/docs/2.5.6/reference/htmlsingle/#boot-features-caching
  • Redis官方文档:https://redis.io/documentation

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot缓存实战之Redis 设置有效时间和自动刷新缓存功能(时间支持在配置文件中配置) - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • 详解hibernate双向多对多关联映射XML与注解版

    关于“详解hibernate双向多对多关联映射XML与注解版”的攻略,我将从以下几个方面进行详细讲解: 双向多对多关联映射的概念与要素 Hibernate双向多对多关联映射XML版的实现步骤及示例 Hibernate双向多对多关联映射注解版的实现步骤及示例 接下来我会一一进行详细讲解。 一、双向多对多关联映射的概念与要素 双向多对多关联映射,指的是两个实体类…

    Java 2023年5月19日
    00
  • Springboot项目的搭建教程(分离出common父依赖)

    下面是 Spring Boot 项目搭建教程,包含分离出 common 父依赖的步骤: 1. 环境搭建 首先需要保证本地环境已经安装了 JDK 和 Maven。在命令行输入: java -version mvn -v 上述命令输出正常,则说明环境已经搭建好了。 2. 创建 Maven 工程 在命令行输入以下命令: mvn archetype:generate…

    Java 2023年5月19日
    00
  • 一文详解密码的正则表达式写法

    下面是“一文详解密码的正则表达式写法”的完整攻略。 密码的正则表达式写法 在网站开发中,密码是必不可少的登录认证方式。为了增加用户的账号安全性,通常会限制用户使用具有一定强度的密码。在这种情况下,我们需要使用正则表达式来检查密码的强度。 下面是一个符合标准的密码格式: 长度不少于8个字符 至少包含一个大写字母、一个小写字母、一个数字和一个特殊符号 以下是符合…

    Java 2023年6月15日
    00
  • 从0开始学习大数据之java spark编程入门与项目实践

    从0开始学习大数据之Java Spark编程入门与项目实践攻略 前言 在大数据时代,数据量和数据处理的复杂性不断增加,需要更加高效和灵活的处理方式。Apache Spark作为当前最流行的大数据处理框架之一,优化了Hadoop MapReduce的不足,支持复杂的数据处理,具有高效、可扩展、易用、友好的API等特点,因此成为很多企业和个人的选择。本文将详细介…

    Java 2023年5月19日
    00
  • Java基础之Bean的创建、定位和使用

    Java基础之Bean的创建、定位和使用 在Java开发中,Bean是非常常用的一种Java类。Bean是一种被特殊编写的Java类,通常用于封装和传输数据,它拥有以下几个特点: 具有无参构造器 具有getter/setter方法 实现序列化接口 下面我们将对Bean的创建、定位和使用进行详细讲解。 Bean的创建 JavaBean的创建需要满足上述特点,以…

    Java 2023年5月26日
    00
  • Java线程安全与非线程安全解析

    Java线程安全与非线程安全解析 Java的线程安全问题是非常重要的一个主题,尤其是在多线程程序的开发中。本文将从线程安全和非线程安全的概念入手,深入探讨Java线程安全与非线程安全的区别,并以代码示例详细说明。 线程安全与非线程安全 Java中的线程安全问题可以简单理解为多线程同时访问同一块内存时所出现的问题。如果多个线程并发地访问同一块内存时,程序仍然能…

    Java 2023年5月19日
    00
  • 详解SpringBoot中使用JPA作为数据持久化框架

    下面为您详细讲解SpringBoot中使用JPA作为数据持久化框架的完整攻略。 1. JPA简介 JPA(Java Persistence API)是JavaEE标准的ORM(对象关系映射)规范,它提供了一种简化了的操作数据库的方式,将Java对象映射到关系型数据库,实现Java程序与数据库的隔离。JPA的实现包括Hibernate、EclipseLink等…

    Java 2023年5月20日
    00
  • Java日期操作方法工具类实例【包含日期比较大小,相加减,判断,验证,获取年份等】

    下面是详细讲解Java日期操作方法工具类实例的完整攻略。 一、概述 Java中日期操作是常见的需求,在很多场景中都需要对日期进行操作。Java日期操作方法工具类是为了方便Java开发者对日期进行操作而开发的一个工具类。该工具类提供了丰富的日期操作方法,包括比较大小、相加减、判断、验证、获取年份等。 二、使用方法 1. 引入工具类 首先,我们需要引入该工具类。…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部