Spring Boot接入Redis的步骤(参考)

        在Spring Boot项目中接入Redis主要分为以下几个步骤,包括依赖引入、配置连接、操作Redis等。下面详细介绍如何整合Redis到Spring Boot项目中。


1. 添加Redis依赖

        在pom.xml中引入Spring Data Redis和Lettuce(或Jedis)客户端依赖:

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

<!-- Lettuce(默认客户端,基于Netty,高性能) -->
<dependency>
    <groupId>io.lettuce</groupId>
    <artifactId>lettuce-core</artifactId>
</dependency>

<!-- 可选:如果需要Jedis客户端(传统阻塞式IO) -->
<!--
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>
-->

2. 配置Redis连接

        在application.ymlapplication.properties中配置Redis服务器地址、端口、密码等:

spring:
  redis:
    host: localhost   # Redis服务器IP
    port: 6379        # Redis端口
    password: 123456  # Redis密码(若无密码可省略)
    database: 0       # 默认DB索引(0-15)
    lettuce:
      pool:           # 连接池配置(可选)
        max-active: 8  # 最大连接数
        max-idle: 4    # 最大空闲连接
        min-idle: 1    # 最小空闲连接

 3. 配置RedisTemplate(可选)

        Spring Boot默认提供RedisTemplateStringRedisTemplate,但默认使用JDK序列化(可读性差)。可以自定义序列化方式:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
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);

        // Key使用String序列化
        template.setKeySerializer(new StringRedisSerializer());
        
        // Value使用JSON序列化
        template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        
        // HashKey/Value同样处理
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());

        template.afterPropertiesSet();
        return template;
    }
}

 4. 使用RedisTemplate操作Redis

        在Service中注入RedisTemplate,进行数据存取:

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.concurrent.TimeUnit;

@Service
public class RedisService {

    private final RedisTemplate<String, Object> redisTemplate;

    public RedisService(RedisTemplate<String, Object> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    // 存储数据
    public void setValue(String key, Object value, long timeout) {
        redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);
    }

    // 获取数据
    public Object getValue(String key) {
        return redisTemplate.opsForValue().get(key);
    }

    // 删除数据
    public void deleteKey(String key) {
        redisTemplate.delete(key);
    }

    // 操作Hash
    public void setHashValue(String key, String field, Object value) {
        redisTemplate.opsForHash().put(key, field, value);
    }

    // 其他操作:List、Set、ZSet等类似
}

 5. 使用StringRedisTemplate(简化版)

如果只需要操作字符串,可以直接使用StringRedisTemplate(默认使用String序列化):

import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

@Service
public class StringRedisService {

    private final StringRedisTemplate stringRedisTemplate;

    public StringRedisService(StringRedisTemplate stringRedisTemplate) {
        this.stringRedisTemplate = stringRedisTemplate;
    }

    public void setString(String key, String value) {
        stringRedisTemplate.opsForValue().set(key, value);
    }

    public String getString(String key) {
        return stringRedisTemplate.opsForValue().get(key);
    }
}

6. 测试Redis连接

        编写单元测试验证Redis是否正常工作:

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class RedisTest {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Test
    public void testRedis() {
        redisTemplate.opsForValue().set("testKey", "Hello Redis!");
        String value = (String) redisTemplate.opsForValue().get("testKey");
        System.out.println(value); // 输出: Hello Redis!
    }
}

7. 高级功能(可选)

        (1) 发布/订阅(Pub/Sub)

// 发布消息
redisTemplate.convertAndSend("channel-name", "Message Content");

// 订阅消息(需配置MessageListener)
@Bean
public MessageListenerAdapter listenerAdapter(Receiver receiver) {
    return new MessageListenerAdapter(receiver, "receiveMessage");
}

@Bean
public RedisMessageListenerContainer container(RedisConnectionFactory factory, MessageListenerAdapter listener) {
    RedisMessageListenerContainer container = new RedisMessageListenerContainer();
    container.setConnectionFactory(factory);
    container.addMessageListener(listener, new ChannelTopic("channel-name"));
    return container;
}

(2) 分布式锁

        使用Redisson或setIfAbsent实现:

// 加锁(SETNX + 过期时间)
Boolean locked = redisTemplate.opsForValue().setIfAbsent("lockKey", "1", 10, TimeUnit.SECONDS);
if (locked) {
    try {
        // 执行业务逻辑
    } finally {
        redisTemplate.delete("lockKey"); // 释放锁
    }
}

 8:常见问题

  1. 连接失败:检查Redis服务是否启动,防火墙是否放行6379端口。

  2. 序列化错误:确保RedisTemplate的Key/Value序列化方式一致。

  3. 性能问题:合理配置连接池参数(如max-active)。


总结

  • 基础步骤:引入依赖 → 配置连接 → 使用RedisTemplate操作数据。

  • 生产建议

    • 使用连接池(Lettuce/Jedis)。

    • 统一序列化方式(推荐JSON)。

    • 对敏感操作(如分布式锁)添加重试机制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值