基于SpringBoot的Redis开发实战教程

配置和集成缓存涉及多个步骤,从选择适当的缓存技术到实现缓存的存取操作。以下是具体的步骤和示例,假设我们使用Redis 作为缓存工具,并基于Spring Boot进行开发。

1. 选择和配置缓存技术

a. 选择缓存工具
  • Redis 是一个流行的内存数据结构存储工具,适用于各种缓存需求。
b. 添加依赖

在你的Spring Boot项目中,添加Redis相关的依赖。以下是使用Maven的示例:

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>
c. 配置Redis

application.propertiesapplication.yml 文件中配置Redis连接:

application.properties 示例:

properties 复制代码
spring.redis.host=localhost
spring.redis.port=6379

application.yml 示例:

yaml 复制代码
spring:
  redis:
    host: localhost
    port: 6379

2. 配置Spring Boot集成Redis

a. 创建Redis配置类

创建一个Redis配置类,配置RedisTemplate和相关的序列化设置:

java 复制代码
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(new GenericToStringSerializer<>(Object.class));
        return template;
    }
    
    @Bean
    public LettuceConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory();
    }
}
b. 使用RedisTemplate进行缓存操作

创建服务类来实现缓存操作,包括缓存的存取:

java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

@Service
public class CachedProductService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    private static final String PRODUCT_KEY_PREFIX = "product:";

    public Product getProduct(Long id) {
        String key = PRODUCT_KEY_PREFIX + id;
        Product product = (Product) redisTemplate.opsForValue().get(key);
        if (product == null) {
            // Cache miss: retrieve data from the database
            product = fetchProductFromDatabase(id);
            // Store data in the cache
            redisTemplate.opsForValue().set(key, product, 1, TimeUnit.HOURS);
        }
        return product;
    }

    public void addProduct(Product product) {
        // Save product to the database
        saveProductToDatabase(product);
        // Invalidate cache
        redisTemplate.delete(PRODUCT_KEY_PREFIX + product.getId());
    }

    public void updateProduct(Product product) {
        // Update product in the database
        updateProductInDatabase(product);
        // Update cache
        redisTemplate.opsForValue().set(PRODUCT_KEY_PREFIX + product.getId(), product, 1, TimeUnit.HOURS);
    }

    public void deleteProduct(Long id) {
        // Delete product from the database
        deleteProductFromDatabase(id);
        // Remove from cache
        redisTemplate.delete(PRODUCT_KEY_PREFIX + id);
    }

    private Product fetchProductFromDatabase(Long id) {
        // Implement database fetch logic
        return new Product(); // Placeholder
    }

    private void saveProductToDatabase(Product product) {
        // Implement database save logic
    }

    private void updateProductInDatabase(Product product) {
        // Implement database update logic
    }

    private void deleteProductFromDatabase(Long id) {
        // Implement database delete logic
    }
}

3. 实现缓存操作

a. 存取缓存
  • 存取数据 :使用 redisTemplate.opsForValue().get(key) 从缓存中读取数据,使用 redisTemplate.opsForValue().set(key, value, timeout, unit) 将数据存入缓存。
b. 缓存失效
  • 过期时间:在将数据存入缓存时设置过期时间,以避免缓存数据过期。
c. 缓存更新和删除
  • 更新缓存:在数据更新或删除时,确保缓存中的数据也被相应更新或删除。

4. 测试和优化

a. 测试
  • 单元测试:编写测试用例,验证缓存操作是否正常工作。

    java 复制代码
    @SpringBootTest
    public class CachedProductServiceTests {
    
        @Autowired
        private CachedProductService cachedProductService;
    
        @Test
        public void testGetProduct() {
            Product product = cachedProductService.getProduct(1L);
            assertNotNull(product);
        }
        
        @Test
        public void testAddProduct() {
            Product product = new Product();
            cachedProductService.addProduct(product);
            // Verify product addition logic
        }
        
        @Test
        public void testUpdateProduct() {
            Product product = new Product();
            cachedProductService.updateProduct(product);
            // Verify product update logic
        }
        
        @Test
        public void testDeleteProduct() {
            cachedProductService.deleteProduct(1L);
            // Verify product deletion logic
        }
    }
b. 优化
  • 缓存配置:根据实际使用情况调整缓存大小、过期时间等配置。
  • 监控和分析:监控缓存命中率和性能,进行优化。

通过以上步骤,你可以成功配置和集成缓存,并定义缓存操作。这将显著提升数据服务的性能和响应速度,同时减轻数据库的负担。

相关推荐
java1234_小锋7 小时前
Java高频面试题:Redis的Key和Value的设计原则有哪些?
java·redis·面试
YDS8298 小时前
SpringCloud —— Elasticsearch入门详解
spring·elasticsearch·spring cloud
Javatutouhouduan8 小时前
SpringBoot整合reids:JSON序列化文件夹操作实录
java·数据库·redis·html·springboot·java编程·java程序员
bug攻城狮8 小时前
Spring Boot应用内存占用分析与优化
java·jvm·spring boot·后端
xiaodaidai丶8 小时前
解决Sa-Token在 Spring MVC + WebFlux 混合架构中流式接口报错SaTokenContext 上下文尚未初始化的问题
spring·架构·mvc
迪巴拉15258 小时前
基于Vue与Spring Boot+Open Cv的智慧校园考勤系统
前端·vue.js·spring boot
QWQ___qwq8 小时前
Spring Security + MyBatis-Plus 实现自定义数据库用户认证
数据库·spring·mybatis
de_wizard9 小时前
【mybatis】基本操作:详解Spring通过注解和XML的方式来操作mybatis
xml·spring·mybatis
java1234_小锋9 小时前
Java高频面试题:Redis里什么是缓存击穿、缓存穿透、缓存雪崩?
java·redis·缓存
me8329 小时前
【Java】踩坑实录:Spring Boot + Nginx 本地部署404终极排查:从80端口被占用到配置生效全流程
java·spring boot·nginx