Java 整合 Redis:从配置到实战的完整指南
在 Java 开发中,Redis 作为高性能的键值数据库,常用于缓存、分布式锁、会话存储等场景。但很多开发者在配置 Redis 时,常会遇到连接池优化、集群适配、序列化异常等问题。本文基于 Spring Boot 2.x 生态,从环境搭建到进阶实战,带你一站式搞定 Redis 配置。
一、环境准备:基础依赖与版本选择
首先要明确技术栈版本搭配,避免因版本冲突导致的隐藏问题。推荐使用 Spring Data Redis(封装性好)或原生 Jedis(灵活性高),以下是两种方案的 Maven 依赖配置。
1. 核心依赖引入
方案 1:Spring Data Redis(推荐,默认集成 Lettuce 客户端)
xml
<!-- Spring Data Redis核心包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 连接池依赖(Lettuce需此包优化性能) -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<!-- 用于JSON序列化(解决默认JDK序列化可读性差问题) -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
方案 2:原生 Jedis 客户端(适合需自定义连接逻辑场景)
xml
<!-- Jedis核心依赖 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.10.0</version> <!-- 建议使用3.x及以上稳定版 -->
</dependency>
<!-- 连接池依赖 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
2. 版本兼容性说明
- Spring Boot 2.x 建议搭配 Redis 5.x/6.x(支持集群新特性)。
- Lettuce 客户端默认支持异步操作,Jedis 需手动配置异步池。
- 若使用 Redis 7.x,需确保 Spring Data Redis 版本≥2.7.0。
二、核心配置:单机 Redis 实战
单机 Redis 是开发环境和小型项目的常用方案,重点关注连接池参数、序列化方式、超时时间这三个核心配置。
1. 配置文件(application.yml)"www.nxbest.cn", "m.nxbest.cn", "wap.nxbest.cn", "gov.nxbest.cn", "web.nxbest.cn",
yaml
spring:
redis:
# 基础连接信息
host: 127.0.0.1 # Redis服务器IP
port: 6379 # 端口(默认6379)
password: 123456 # 若未设置密码可省略
database: 0 # 数据库索引(0-15,默认0)
timeout: 3000 # 连接超时时间(毫秒)
# Lettuce连接池配置(若用Jedis则替换为jedis:)
lettuce:
pool:
max-active: 8 # 最大连接数(默认8)
max-idle: 8 # 最大空闲连接数(默认8)
min-idle: 2 # 最小空闲连接数(默认2)
max-wait: -1 # 最大等待时间(-1表示无限制,单位毫秒)
2. 序列化配置类(关键!避免乱码)
Spring Data Redis 默认使用 JDK 序列化,会导致 Redis 中存储的内容是乱码且占用空间大。下面配置 Jackson2JsonRedisSerializer,实现 JSON 格式序列化。
"watch.quanzhou9999.com", "watch.dongshengyx.com", "watch.xjm888.com",
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.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
// 1. 配置Key的序列化方式(String)
StringRedisSerializer stringSerializer = new StringRedisSerializer();
template.setKeySerializer(stringSerializer);
template.setHashKeySerializer(stringSerializer);
// 2. 配置Value的序列化方式(JSON)
Jackson2JsonRedisSerializer<Object> jsonSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
// 解决Java 8日期(LocalDateTime等)序列化问题
objectMapper.registerModule(new JavaTimeModule());
jsonSerializer.setObjectMapper(objectMapper);
template.setValueSerializer(jsonSerializer);
template.setHashValueSerializer(jsonSerializer);
// 初始化模板
template.afterPropertiesSet();
return template;
}
}
3. 简单使用示例
通过 RedisTemplate 操作 Redis,支持 String、Hash、List 等常见数据结构:
"watch.Lbjxx.cn", "mzjinshen.cn", "www.mzjinshen.cn", "m.mzjinshen.cn", "wap.mzjinshen.cn",
java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDateTime;
@RestController
public class RedisDemoController {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@GetMapping("/setCache")
public String setCache() {
// 1. 存储String类型(key: user:1,value: 用户对象,过期时间5分钟)
User user = new User(1L, "张三", LocalDateTime.now());
redisTemplate.opsForValue().set("user:1", user, 5, java.util.concurrent.TimeUnit.MINUTES);
// 2. 存储Hash类型(key: user:info,hashKey: name/age)
redisTemplate.opsForHash().put("user:info", "name", "李四");
redisTemplate.opsForHash().put("user:info", "age", 25);
return "缓存设置成功";
}
@GetMapping("/getCache")
public User getCache() {
// 获取String类型缓存
return (User) redisTemplate.opsForValue().get("user:1");
}
}
三、进阶配置:Redis 集群(哨兵 / 分片)
生产环境中,单机 Redis 存在单点故障风险,通常会部署集群(哨兵模式或分片集群)。以下是两种集群的配置方案。
1. 哨兵模式配置(高可用,解决单点故障)
哨兵模式通过监控主从节点,实现故障自动切换,适合数据量不大但需高可用的场景。
配置文件(application.yml)"gov.mzjinshen.cn", "web.mzjinshen.cn", "www.stats.gov.cn.mzjinshen.cn",
yaml
spring:
redis:
password: 123456
timeout: 3000
lettuce:
pool:
max-active: 16
max-idle: 8
min-idle: 4
# 哨兵配置
sentinel:
master: mymaster # 主节点名称(需与Redis哨兵配置一致)
nodes: # 哨兵节点列表(IP:端口)
- 192.168.1.100:26379
- 192.168.1.101:26379
- 192.168.1.102:26379
2. 分片集群配置(水平扩容,支持海量数据)
分片集群将数据分散到多个节点,每个节点存储部分数据,适合数据量超过单机容量的场景。
配置文件(application.yml)"www.cq.gov.cn.mzjinshen.cn", "gov.zb.mzjinshen.cn", "gov.wap.mzjinshen.cn", "nxbest.cn",
yaml
spring:
redis:
password: 123456
timeout: 3000
lettuce:
pool:
max-active: 16
max-idle: 8
min-idle: 4
# 分片集群节点配置
cluster:
nodes: # 所有集群节点(主从节点都需配置)
- 192.168.1.100:6379
- 192.168.1.101:6379
- 192.168.1.102:6379
- 192.168.1.103:6379
max-redirects: 3 # 最大重定向次数(默认3)
四、常见问题与优化技巧
1. 连接池参数优化
- max-active:根据并发量调整,建议设为
CPU核心数 * 2 + 1(如 8 核 CPU 设为 17)。 - max-wait:非 - 1 时,避免线程无限等待(建议设为 1000 毫秒)。
- min-idle:根据业务低谷期的连接需求设置,避免频繁创建 / 销毁连接。
2. 避免 RedisTemplate 线程安全问题
- RedisTemplate 是线程安全的,无需每次使用时新建,直接注入即可。
- 若自定义 RedisTemplate,需用
@Bean注解交由 Spring 管理,避免重复创建。
3. 解决 LocalDateTime 序列化异常
- 需在 ObjectMapper 中注册
JavaTimeModule(如上文配置类所示),否则会报JsonProcessingException。 - 若使用 FastJSON 序列化,需添加
@JSONField(format = "yyyy-MM-dd HH:mm:ss")注解。
五、总结
本文从基础到进阶,覆盖了 Java 整合 Redis 的核心场景:单机配置解决开发需求,集群配置应对生产环境,序列化配置避免乱码问题。实际开发中,需根据业务规模(数据量、并发量)选择合适的方案,同时关注连接池优化和异常处理,才能让 Redis 真正发挥高性能优势。
查看23道真题和解析
