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日

相关文章

  • spring boot项目如何采用war在tomcat容器中运行

    下面是Spring Boot项目如何部署到Tomcat容器中运行的攻略: 一、将项目打成war包 Spring Boot项目通常打成jar包,但是要部署到Tomcat容器中需要将其打成war包。如果使用Maven构建项目,则只需在pom.xml文件中添加以下代码: <packaging>war</packaging> 这样项目就会被打…

    Java 2023年6月2日
    00
  • java 字符串池的深入理解

    Java字符串池的深入理解 Java中的字符串池是Java语言的一个重要特性,它允许字符串对象在池中共享,从而减少内存的使用。在本文中,我们将深入理解Java字符串池的概念、原理和使用。 字符串池的概念 字符串池是一种特殊的内存区域,存储着Java中的字符串常量。在Java中,如果两个字符串常量的值相同,它们将指向同一个地址,从而实现了字符串的共享,避免了许…

    Java 2023年5月26日
    00
  • 分析SpringBoot的启动原理

    下面我会详细地讲解分析Spring Boot启动原理的攻略,内容如下。 什么是Spring Boot Spring Boot 是一个基于Spring Framework构建的用于快速构建Web应用程序和微服务的开源框架。 Spring Boot的主要目的是简化Spring的配置和开发过程。Spring Boot集成了Spring框架,内嵌了Tomcat、Je…

    Java 2023年5月15日
    00
  • java实现支付宝支付接口的调用

    下面是详细的讲解”Java实现支付宝支付接口的调用”的完整攻略。 步骤一:申请支付宝开发者账号 首先,你需要申请一个支付宝开发者账号。如果你已经有一个支付宝账号,可以通过这个账号登录支付宝开发平台https://openhome.alipay.com/platform/home.htm。 步骤二:创建应用并获取应用的app_id、密钥等信息 在开发者中心中,…

    Java 2023年6月16日
    00
  • JavaSE实战之酒店订房系统的实现

    JavaSE实战之酒店订房系统的实现攻略 介绍 本文将介绍如何使用JavaSE实现一个酒店订房系统。酒店订房系统是一个很典型的需求场景,通过本文的学习和实践,你将能够掌握JavaSE的相关知识和技能,并且学习如何使用Java编程实现一个实用的应用系统。 本文将前后分为四部分,首先介绍系统需求和功能规格,然后是系统设计和技术选择,接着是系统功能实现和测试,最后…

    Java 2023年5月24日
    00
  • Java Web实现文件上传和下载接口功能详解

    Java Web实现文件上传和下载接口功能详解 一、文件上传接口 1. HTML表单 文件上传的第一步是需要在前端实现一个HTML表单,用户通过这个表单可以上传文件。表单中必须含有一个type为file的input元素,这个元素用来选择文件。 <form action="/upload" method="POST&quot…

    Java 2023年5月19日
    00
  • 详解如何在Java中加密和解密zip文件

    详解如何在Java中加密和解密zip文件 概述 在Java中,我们可以使用ZipOutputStream和ZipInputStream来压缩和解压缩zip文件,同时,我们可以通过加密和解密zip文件来保护文件的数据安全,确保只有授权用户可以访问zip文件的内容。本文将详细讲解如何在Java中加密和解密zip文件,并提供两个示例代码方便理解。 加密zip文件 …

    Java 2023年5月26日
    00
  • mybatis中的动态sql问题

    以下是关于Mybatis中动态SQL问题的攻略。 什么是动态SQL 动态SQL是指在XML映射文件中,在执行SQL语句前,动态生成SQL语句的技术。使用动态SQL可以大大增强SQL语句的灵活性和可维护性。 Mybatis中的动态SQL Mybatis中的动态SQL提供了一些条件判断和循环操作来生成动态SQL语句。Mybatis中的动态SQL主要由以下标签实现…

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