您的位置:首页 > 科技 > 能源 > 阿里云怎么创建网站_赶集招聘网_服务器租用_成都网站制作关键词推广排名

阿里云怎么创建网站_赶集招聘网_服务器租用_成都网站制作关键词推广排名

2025/2/24 14:23:08 来源:https://blog.csdn.net/ldz_wolf/article/details/145744780  浏览:    关键词:阿里云怎么创建网站_赶集招聘网_服务器租用_成都网站制作关键词推广排名
阿里云怎么创建网站_赶集招聘网_服务器租用_成都网站制作关键词推广排名

SpringBoot+Redis整合、分布式缓存与Session共享方案

一、开篇:当SpringBoot遇见Redis

在微服务架构盛行的今天,分布式缓存已成为高并发系统的核心组件。本文深度剖析SpringBoot与Redis的整合实践,从基础配置到高阶应用,覆盖缓存雪崩/穿透防御策略Redisson分布式锁实战跨服务Session共享方案等关键场景,助你构建高性能、高可用的分布式系统。文中所有方案均通过生产环境验证,提供可直接落地的代码实现。


二、SpringBoot集成Redis核心配置

2.1 基础环境搭建

Maven依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.17.7</version>
</dependency>

application.yml配置

spring:redis:host: 127.0.0.1port: 6379password: yourpasswordlettuce:pool:max-active: 20   # 连接池最大连接数max-idle: 10    # 连接池最大空闲连接min-idle: 3      # 连接池最小空闲连接

2.2 RedisTemplate深度定制

@Configuration
public class RedisConfig {@Beanpublic 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;}
}

三、缓存三大问题解决方案

3.1 缓存穿透防御

布隆过滤器实现

// 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);
}

3.2 缓存雪崩应对

多级缓存策略

  1. 本地Caffeine缓存:应对Redis不可用
  2. Redis集群部署:多节点分散风险
  3. 差异化过期时间:
// 设置基础过期时间+随机偏移量
int baseExpire = 3600;
int randomExpire = new Random().nextInt(600);
redisTemplate.expire(key, baseExpire + randomExpire, TimeUnit.SECONDS);

3.3 缓存击穿处理

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;
}

四、分布式Session共享方案

4.1 Spring Session配置

@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800)
public class SessionConfig {@Beanpublic RedisSerializer<Object> springSessionDefaultRedisSerializer() {return new GenericJackson2JsonRedisSerializer();}
}

4.2 跨服务会话保持

# Nginx配置Session粘滞
upstream backend {server 192.168.1.101:8080;server 192.168.1.102:8080;hash $cookie_JSESSIONID;  # 根据SessionID路由
}

五、Redisson高阶实战

5.1 分布式锁类型对比

锁类型特性适用场景
普通锁互斥访问简单资源控制
可重入锁支持重复加锁递归调用场景
公平锁按请求顺序获取高竞争环境
联锁(MultiLock)同时锁定多个资源分布式事务

5.2 看门狗机制源码解析

// 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();
}

六、运维监控体系

6.1 Redis健康检查

# 连接数监控
redis-cli info clients# 内存分析
redis-cli --bigkeys
redis-cli --memkeys

6.2 可视化监控

Grafana+Prometheus监控指标:

  • 内存碎片率(mem_fragmentation_ratio)
  • 每秒操作数(instantaneous_ops_per_sec)
  • 键空间命中率(keyspace_hits/keyspace_misses)

七、避坑指南

7.1 典型问题排查

  1. 序列化异常:确保所有服务使用相同序列化协议
  2. 连接泄露:检查连接池配置与finally代码块
  3. 集群切换故障:配置合理的重试策略
@Bean
public LettuceClientConfigurationBuilderCustomizer customizer() {return builder -> builder.clientOptions(ClientOptions.builder().disconnectedBehavior(ClientOptions.DisconnectedBehavior.REJECT_COMMANDS).build());
}

7.2 性能调优参数

# Lettuce调优参数
spring.redis.lettuce.shutdown-timeout=100ms
spring.redis.lettuce.pool.max-wait=500ms

八、结语:缓存的艺术

Redis的深度应用需要平衡性能、一致性与复杂度。建议:

  1. 定期进行缓存容量规划
  2. 重要数据设置降级策略
  3. 使用Pipeline提升批量操作性能
  4. 监控慢日志(slowlog get 128)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com