Redis的核心知识
Redis(Remote Dictionary Server)是一款开源的、高性能的键值对(KV)内存数据库,同时支持数据持久化、多种数据结构、分布式部署等特性,常被用于缓存、会话存储、消息队列、限流削峰等场景。
1. Redis 核心特性
- 内存存储:数据默认存储在内存中,读写速度极快(QPS 可达 10 万 +)。
- 数据持久化:支持 RDB(快照)和 AOF(日志追加)两种方式,避免内存数据丢失。
- 丰富的数据结构:核心支持 String、Hash、List、Set、ZSet(有序集合),还扩展了 Bitmap、HyperLogLog、Geo 等。
- 原子操作:所有单个命令都是原子性的,支持事务(弱事务)、Lua 脚本实现复杂原子逻辑。
- 高可用:支持主从复制、哨兵(Sentinel)、集群(Cluster),保证服务高可用和水平扩展。
2. Redis 典型应用场景
- 缓存:热点数据缓存(如商品信息、用户信息),减轻数据库压力。
- 会话存储:分布式系统中存储用户会话(替代 Session)。
- 计数器:点赞数、阅读量、限流计数(INCR/DECR 原子操作)。
- 排行榜:ZSet 实现实时排名(如游戏积分、商品销量)。
- 消息队列:List 的 LPUSH/RPOP 实现简单队列,结合 BRPOP 实现阻塞队列。
3、Spring boot中体现的高级特性
1. 存储 Java 对象
通过 GenericJackson2JsonRedisSerializer 序列化,可直接存储 / 读取对象:
// 定义实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Long id;
private String name;
private Integer age;
}
// Service 层添加方法
public void setUser(String key, User user) {
redisTemplate.opsForValue().set(key, user, 1, TimeUnit.HOURS);
}
public User getUser(String key) {
return (User) redisTemplate.opsForValue().get(key);
}
// 测试
@Test
public void testObject() {
User user = new User(1002L, "王五", 30);
redisService.setUser("user:1002", user);
User result = redisService.getUser("user:1002");
System.out.println(result); // 输出:User(id=1002, name=王五, age=30)
}
2. 分布式锁(基于 Redis)
Spring Boot 中可通过 Redis 实现分布式锁(主要代码):
/**
* 分布式锁(加锁)
*/
public boolean lock(String lockKey, String requestId, long timeout, TimeUnit unit) {
return Boolean.TRUE.equals(redisTemplate.opsForValue().setIfAbsent(lockKey, requestId, timeout, unit));
}
/**
* 分布式锁(解锁,防止误删)
*/
public boolean unlock(String lockKey, String requestId) {
// 使用 Lua 脚本保证原子性
String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
Long result = (Long) redisTemplate.execute(
new DefaultRedisScript<>(script, Long.class),
Collections.singletonList(lockKey),
requestId
);
return result != null && result > 0;
}
Spring Boot 整合 Redis的相关实现
在 Spring Boot 中使用 Redis 是企业开发的主流方式,核心依赖 spring-boot-starter-data-redis 封装了 Lettuce(默认客户端),提供了极简的配置和易用的 RedisTemplate/StringRedisTemplate 操作 API。
1、引入依赖
在 Spring Boot 项目中配置 Redis 连接是使用 Redis 的基础。首先在pom.xml中添加 Redis 核心依赖和连接池依赖(连接池是性能关键,必须加):
<!-- Spring Data Redis 核心依赖(自动适配Spring Boot版本) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 连接池依赖(Lettuce默认依赖,但需显式引入pool2) -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<!-- 可选:Redisson(分布式锁/高级功能,AI售后高频) -->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.23.3</version>
</dependency>
2、基础连接配置(application.yml/application.properties)
Spring Boot 支持yml和properties两种配置格式,推荐用yml(更简洁),下面以application.yml为例:
1. 单机 Redis 配置(开发 / 测试 / 中小规模生产)
spring:
# Redis核心配置
redis:
# Redis服务地址(默认127.0.0.1,生产填实际IP)
host: 127.0.0.1
# 端口(默认6379,若修改过需对应调整)
port: 6379
# 密码(无密码则注释该行,生产环境必须设置密码)
password: your_redis_password
# 数据库索引(Redis默认16个库,0-15,建议按业务分库)
database: 0
# 超时配置(连接/读取/写入超时,避免无限等待)
timeout: 5000ms
# Lettuce客户端配置(Spring Boot 2.x+默认,替代Jedis)
lettuce:
# 关闭超时时间(默认100ms,避免连接池关闭异常)
shutdown-timeout: 100ms
# 连接池配置(核心,解决连接泄露/性能问题)
pool:
# 最大活跃连接数(默认8,生产建议10-20)
max-active: 16
# 最大空闲连接数(默认8,建议等于max-active)
max-idle: 16
# 最小空闲连接数(默认0,建议2-5,快速响应请求)
min-idle: 4
# 最大等待时间(-1表示无限制,生产建议5000ms,避免阻塞)
max-wait: 5000ms
2. 集群 Redis 配置(大规模生产环境)
一般生产环境采用 Redis Cluster 集群,配置如下:
spring:
redis:
# 集群节点(多个节点用逗号分隔)
cluster:
nodes:
- 192.168.1.10:6379
- 192.168.1.11:6379
- 192.168.1.12:6379
# 最大重定向次数(默认5,避免集群跳转过多)
max-redirects: 3
# 密码(集群所有节点密码需一致)
password: your_redis_password
# 数据库索引(集群模式下仅0库生效)
database: 0
timeout: 5000ms
lettuce:
pool:
max-active: 32
max-idle: 32
min-idle: 8
max-wait: 5000ms
3. 哨兵模式配置(高可用单机集群)
spring:
redis:
# 哨兵配置
sentinel:
# 主节点名称(与Redis哨兵配置的master-name一致)
master: mymaster
# 哨兵节点(多个用逗号分隔)
nodes: 192.168.1.20:26379,192.168.1.21:26379
password: your_redis_password
database: 0
timeout: 5000ms
lettuce:
pool:
max-active: 16
max-idle: 16
min-idle: 4
max-wait: 5000ms
3、序列化配置(解决 Redis Key/Value 乱码)
Spring Boot 默认用 JDK 序列化,会导致 Redis 中 Key 显示为\xAC\xED\x00\x05t\x00\x10 :token这种乱码,必须自定义序列化配置:
核心配置代码
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;
/**
* Redis序列化配置(解决乱码问题)
*/
@Configuration
public class RedisConfig {
/**
* 自定义RedisTemplate(通用型,支持Object类型Value)
*/
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
// 设置连接工厂
redisTemplate.setConnectionFactory(redisConnectionFactory);
// ========== Key序列化(必须为String,避免乱码) ==========
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringRedisSerializer);
redisTemplate.setHashKeySerializer(stringRedisSerializer);
// ========== Value序列化(JSON格式,兼容对象/基本类型) ==========
GenericJackson2JsonRedisSerializer jsonSerializer = new GenericJackson2JsonRedisSerializer();
redisTemplate.setValueSerializer(jsonSerializer);
redisTemplate.setHashValueSerializer(jsonSerializer);
// 初始化配置
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
/**
* 字符串专用RedisTemplate(轻量,无需序列化,AI售后高频用)
*/
@Bean
public RedisTemplate<String, String> stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, String> stringRedisTemplate = new RedisTemplate<>();
stringRedisTemplate.setConnectionFactory(redisConnectionFactory);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
stringRedisTemplate.setKeySerializer(stringRedisSerializer);
stringRedisTemplate.setValueSerializer(stringRedisSerializer);
stringRedisTemplate.setHashKeySerializer(stringRedisSerializer);
stringRedisTemplate.setHashValueSerializer(stringRedisSerializer);
stringRedisTemplate.afterPropertiesSet();
return stringRedisTemplate;
}
}
总结
- 核心配置:Spring Boot 中 Redis 配置分基础连接(host/port/password)、连接池(lettuce.pool)、序列化(解决乱码) 三部分,缺一不可;
- Redis连接如何选择:单机配置用于开发 / 中小规模,集群 / 哨兵用于大规模生产;
- 核心场景:String 用于缓存 / 计数、Hash 用于存储对象、ZSet 用于排行榜、List 用于消息队列,结合过期时间和分布式锁可满足大部分业务需求。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)