在微服务架构盛行的今天,分布式缓存已成为高并发系统的核心组件。本文深度剖析SpringBoot与Redis的整合实践,从基础配置到高阶应用,覆盖缓存雪崩/穿透防御策略、Redisson分布式锁实战、跨服务Session共享方案等关键场景,助你构建高性能、高可用的分布式系统。文中所有方案均通过生产环境验证,提供可直接落地的代码实现。
Maven依赖:
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-redisartifactId>
dependency>
<dependency>
<groupId>org.redissongroupId>
<artifactId>redisson-spring-boot-starterartifactId>
<version>3.17.7version>
dependency>
application.yml配置:
spring:
redis:
host: 127.0.0.1
port: 6379
password: yourpassword
lettuce:
pool:
max-active: 20 # 连接池最大连接数
max-idle: 10 # 连接池最大空闲连接
min-idle: 3 # 连接池最小空闲连接
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
// 使用Jackson序列化
Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
template.setDefaultSerializer(serializer);
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
return template;
}
}
布隆过滤器实现:
// Redisson布隆过滤器使用
RBloomFilter<String> bloomFilter = redisson.getBloomFilter("userFilter");
bloomFilter.tryInit(100000L, 0.03); // 预期元素10万,误判率3%
// 查询前先校验
public User getUserById(String id) {
if (!bloomFilter.contains(id)) {
return null; // 直接拦截非法请求
}
return redisTemplate.opsForValue().get("user:" + id);
}
多级缓存策略:
// 设置基础过期时间+随机偏移量
int baseExpire = 3600;
int randomExpire = new Random().nextInt(600);
redisTemplate.expire(key, baseExpire + randomExpire, TimeUnit.SECONDS);
Redisson分布式锁方案:
public Product getProduct(String productId) {
String cacheKey = "product:" + productId;
Product product = redisTemplate.opsForValue().get(cacheKey);
if (product == null) {
RLock lock = redisson.getLock("lock:" + productId);
try {
if (lock.tryLock(3, 30, TimeUnit.SECONDS)) {
product = dbQuery(productId); // 数据库查询
redisTemplate.opsForValue().set(cacheKey, product, 1, TimeUnit.HOURS);
}
} finally {
lock.unlock();
}
}
return product;
}
@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800)
public class SessionConfig {
@Bean
public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
return new GenericJackson2JsonRedisSerializer();
}
}
# Nginx配置Session粘滞
upstream backend {
server 192.168.1.101:8080;
server 192.168.1.102:8080;
hash $cookie_JSESSIONID; # 根据SessionID路由
}
锁类型 | 特性 | 适用场景 |
---|---|---|
普通锁 | 互斥访问 | 简单资源控制 |
可重入锁 | 支持重复加锁 | 递归调用场景 |
公平锁 | 按请求顺序获取 | 高竞争环境 |
联锁(MultiLock) | 同时锁定多个资源 | 分布式事务 |
// Redisson自动续期逻辑(简化版)
private void scheduleExpirationRenewal() {
Thread task = new Thread(() -> {
while (true) {
// 每10秒续期一次
redis.eval("if redis.call('hexists', KEYS[1], ARGV[2]) == 1 then " +
"redis.call('pexpire', KEYS[1], ARGV[1]); " +
"return 1; end; return 0;",
Collections.singletonList(lockName),
internalLockLeaseTime, getLockName(threadId));
try {
Thread.sleep(internalLockLeaseTime / 3);
} catch (InterruptedException e) {
break;
}
}
});
task.start();
}
# 连接数监控
redis-cli info clients
# 内存分析
redis-cli --bigkeys
redis-cli --memkeys
Grafana+Prometheus监控指标:
@Bean
public LettuceClientConfigurationBuilderCustomizer customizer() {
return builder -> builder.clientOptions(
ClientOptions.builder().disconnectedBehavior(ClientOptions.DisconnectedBehavior.REJECT_COMMANDS).build());
}
# Lettuce调优参数
spring.redis.lettuce.shutdown-timeout=100ms
spring.redis.lettuce.pool.max-wait=500ms
Redis的深度应用需要平衡性能、一致性与复杂度。建议: