当前位置: 首页 > wzjs >正文

网站维护收费html免费网站模板下载

网站维护收费,html免费网站模板下载,php网站后台管理系统源码,网站开发合作文章目录 摘要 正文一、缓存设计的痛点与破局二、核心代码拆解:四层防御设计1. 注解驱动(ZywCacheable)2. 缓存击穿防护:双重检查锁3. 缓存穿透防护:空值标记4. 缓存雪崩防护:TTL随机算法 三、生产环境最佳…

文章目录

        • 摘要
      • 正文
        • 一、缓存设计的痛点与破局
        • 二、核心代码拆解:四层防御设计
          • 1. 注解驱动(@ZywCacheable)
          • 2. 缓存击穿防护:双重检查锁
          • 3. 缓存穿透防护:空值标记
          • 4. 缓存雪崩防护:TTL随机算法
        • 三、生产环境最佳实践
          • 案例1:基础数据永久缓存
          • 案例2:动态数据定时更新
        • 四、进阶优化方向
        • 五、布隆过滤器增强穿透防护
          • 1.切面改造
          • 2.修改注解定义
          • 3.使用示例
        • 结语


摘要

在千万级并发的系统架构中,缓存设计是性能优化的核心战场。本文将揭秘一个基于Spring AOP与自定义注解的Redis缓存解决方案,通过20行核心代码实现三防机制(击穿、穿透、雪崩),性能提升300%+。代码级解析缓存锁设计、空值防御策略、TTL随机算法,并给出生产环境验证的代码模板。无论你是初级开发者还是中级开发者,都能从中获得可直接复用的实战经验。


正文

一、缓存设计的痛点与破局

在电商、社交等高频访问场景中,传统缓存方案常面临三大致命问题:

  1. 缓存击穿:热点Key失效瞬间的万级QPS压垮数据库
  2. 缓存穿透:恶意查询不存在的数据导致DB过载
  3. 缓存雪崩:大量Key同时过期引发的系统雪崩

我们的解决方案通过注解驱动+本地锁+智能TTL的组合拳,在Spring生态中实现开箱即用的防御体系。


二、核心代码拆解:四层防御设计
1. 注解驱动(@ZywCacheable)
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ZywCacheable {// 缓存的键,可以根据方法参数生成String key();// 缓存过期时间,默认永不过期long ttl() default 0;
}

通过元编程定义缓存策略,实现声明式配置:

@ZywCacheable(key = "User:ApplicantList", ttl = 60 * 1000) // 1小时缓存
public List<SysUser> getApplicantListData() { // DB查询逻辑
}
  • key:支持SpEL表达式动态生成(示例中为静态键)
  • ttl:支持毫秒级精度,0表示永久缓存(适合基础数据字典)
2. 缓存击穿防护:双重检查锁
@Aspect
@Component
public class ZywCacheAspect {@Resourceprivate RedisUtil redisUtil;// 本地锁解决缓存击穿问题private final ReentrantLock lock = new ReentrantLock();// 空值缓存过期时间(防止缓存穿透)private static final long NULL_CACHE_TTL = 5 * 60L; // 5分钟@Around("@annotation(cacheable)")public Object cacheable(ProceedingJoinPoint joinPoint, ZywCacheable cacheable) throws Throwable {String cacheKey = generateCacheKey(joinPoint, RedisKeyUtil.prefix + cacheable.key());Object result = redisUtil.get(cacheKey);// 缓存命中且非空值标记if (result != null && !isNullMarker(result)) {return result;}// 缓存穿透防护:如果是空值标记,直接返回nullif (isNullMarker(result)) {return null;}// 缓存击穿防护:加锁lock.lock();try {// 双重检查,防止多个线程同时等待锁时重复查询数据库result = redisUtil.get(cacheKey);if (result != null) {return isNullMarker(result) ? null : result;}// 执行原方法获取数据result = joinPoint.proceed();// 缓存雪崩防护:随机过期时间long ttl = cacheable.ttl() > 0 ? cacheable.ttl() + (long)(Math.random() * 60 * 1000) : // 增加随机1分钟内的抖动0;if (result == null) {// 缓存空值防止穿透redisUtil.set(cacheKey, new NullMarker(), NULL_CACHE_TTL);} else if (ttl > 0) {redisUtil.set(cacheKey, result, ttl);} else {redisUtil.set(cacheKey, result);}} finally {lock.unlock();}return result;}// 空值标记类private static class NullMarker {}// 判断是否是空值标记private boolean isNullMarker(Object obj) {return obj instanceof NullMarker;}/*** 生成缓存键* @param joinPoint* @param keyExpression* @return*/private String generateCacheKey(ProceedingJoinPoint joinPoint, String keyExpression) {// 根据方法名、参数等生成缓存键,这里简化处理,实际可能需要更复杂的逻辑StringBuilder keyBuilder = new StringBuilder(keyExpression);Object[] args = joinPoint.getArgs();for (Object arg : args) {keyBuilder.append(":").append(arg.toString());}return keyBuilder.toString();}}

该设计保证单JVM内只有一个线程穿透到DB,相比分布式锁性能提升10倍。在高并发场景下,请求等待时间从秒级降至毫秒级。


3. 缓存穿透防护:空值标记
private static class NullMarker {} // 特殊空值对象if (result == null) {redisUtil.set(cacheKey, new NullMarker(), NULL_CACHE_TTL); // 5分钟空缓存
}

通过类型标记而非简单null值,避免恶意构造大量不同Key导致内存耗尽。相比布隆过滤器方案,内存占用减少90%。


4. 缓存雪崩防护:TTL随机算法
long ttl = cacheable.ttl() > 0 ? cacheable.ttl() + (long)(Math.random() * 60 * 1000) : 0;

对预设TTL增加0-60秒随机抖动,使同业务Key的过期时间离散化。实测可降低雪崩概率85%。


三、生产环境最佳实践
案例1:基础数据永久缓存
@ZywCacheable(key = "Organization:AllOrganizationIds") 
public List<Long> getAllOrganizationIds() { // 组织架构ID列表(低频变更)
}
  • 策略:ttl=0永久缓存 + 启动时强制清理(见RedisKeyCleaner)
  • 效果:QPS提升50%
案例2:动态数据定时更新
@ZywCacheable(key = "Menu:MenuList", ttl = 60 * 1000 * 24) 
public List<SysMenu> getTbMenuList() {// 菜单数据(每日变更)
}
  • 策略:24小时缓存+随机TTL抖动
  • 监控:通过RedisUtil监控缓存命中率(建议>95%)

四、进阶优化方向
  1. 分布式锁扩展:结合Redisson实现跨节点锁(适合集群环境)
  2. 热点探测:接入Sentinel对高频Key进行自动续期
  3. 监控埋点:通过Micrometer统计缓存命中率/穿透率
  4. 性能提升:多级缓存架构(Caffeine+Redis)

五、布隆过滤器增强穿透防护

关于布隆过滤器的相关信息可阅读作者的这篇技术博客:布隆过滤器深度实战:详解原理、场景与SpringBoot+Redis高性能实现

1.切面改造

可以将布隆过滤器整合到ZywCacheAspect中,作为缓存穿透的第一层防护。

// ... 原有import保持不变 ...
import com.example.demo.config.filter.BloomFilterUtil;
import org.springframework.util.StringUtils;@Aspect
@Component
public class ZywCacheAspect {@Resourceprivate RedisUtil redisUtil;@Resourceprivate BloomFilterUtil bloomFilterUtil; // 新增布隆过滤器依赖// ... 原有lock和NULL_CACHE_TTL保持不变 ...@Around("@annotation(cacheable)")public Object cacheable(ProceedingJoinPoint joinPoint, ZywCacheable cacheable) throws Throwable {String cacheKey = generateCacheKey(joinPoint, RedisKeyUtil.prefix + cacheable.key());// 新增:布隆过滤器检查(仅当key符合特定模式时启用)if (shouldCheckBloomFilter(cacheable)) {if (!bloomFilterUtil.rBloomFilter.contains(cacheKey)) {log.warn("布隆过滤器拦截:key={} 不存在", cacheKey);return null; // 直接返回避免穿透}}Object result = redisUtil.get(cacheKey);// ... 原有缓存逻辑保持不变 ...}/*** 判断是否需要检查布隆过滤器*/private boolean shouldCheckBloomFilter(ZywCacheable cacheable) {return bloomFilterUtil.isBloomFilterEnabled() && StringUtils.hasText(cacheable.bloomFilterPrefix()) &&cacheable.key().startsWith(cacheable.bloomFilterPrefix());}// ... 原有其他方法保持不变 ...
}
2.修改注解定义
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ZywCacheable {String key();long ttl() default 0;String bloomFilterPrefix() default ""; // 新增布隆过滤器前缀配置
}
3.使用示例
@ZywCacheable(key = "user:${#userId}", ttl = 60000, bloomFilterPrefix = "user:")
public User getUserById(String userId) {// 查询逻辑
}

以下是整合后的防护流程流程图:

开始 → 检查布隆过滤器↓┌───不存在 → 返回null│└───存在 → 检查缓存↓┌───命中 → 返回数据│└───未命中 → 查询数据库↓┌───结果非空 → 加入缓存和布隆过滤器 → 返回数据│└───结果为空 → 返回null

整合后的防护流程

  1. 请求进入时先检查布隆过滤器
  2. 如果布隆过滤器判断key不存在,直接返回null
  3. 如果存在则继续原有缓存逻辑
  4. 查询数据库后,将结果加入布隆过滤器

注意事项

  1. 需要在application.yml中启用布隆过滤器配置
  2. 对于新增数据,需要手动调用bloomFilterUtil.rBloomFilter.add()添加key
  3. 适合用于ID查询类场景,不适合模糊查询

结语

“缓存设计不是银弹,但好的抽象能让子弹飞得更稳。通过这个注解级解决方案,我们不仅获得了开箱即用的缓存防护能力,更重要的是建立了统一的缓存治理标准——这才是应对高并发场景的真正内功。”

注:文中性能数据来自生产环境压力测试,具体数值因硬件配置不同可能有所差异。

http://www.dtcms.com/wzjs/591374.html

相关文章:

  • 网站建设叁金手指花总8体育用品东莞网站建设
  • 本机快速做网站详情页设计说明
  • p2p商城网站建设河南高端网站建设公司
  • 有哪些教做蛋糕的网站企业网站的主要类型有
  • 网站下载软件怎么安装自适应网站建设选哪家
  • 哪个网站做logo设计建筑网格
  • 网站备案ip地址上海社保
  • 网站制作步骤怎样通过网盘做电影网站
  • 有意思的网站网页设计与网站开发pdf
  • 威海医院网站制作购买域名做销售网站可以吗
  • 网站导航菜单代码wordpress去掉index.php
  • wordpress 缩略图 剪裁 位置百度优化点击软件
  • 电商网站设计与开发wordpress做联系页面
  • 服务好的网站建设平台互联网电子商务网站开发技术
  • 义乌微信网站建设费用企业中制度的重要性
  • 奈曼旗华水建设工程公司网站公司怎么建立网站吗
  • 全屏网站设计网站建设是基础服务吗
  • 网站开发付款分几步程序开发过程的四个步骤
  • 有哪些做统计销量的网站广州白云区防疫工作
  • 计算机类十大含金量证书成都高薪seo
  • 社交网站模板mip网站怎么做匹配
  • 百度站长工具后台seo指的是搜索引擎
  • 做好对外门户网站建设杭州网站建设怎么样
  • 旅游网站手机模板深圳公司排名前50
  • 百度网站链接农庄网站
  • 做贵网站多少钱大学网站建设评比考核办法
  • 网站建设技术人员工作总结找人做网站服务器不是自己的怎么办
  • 重庆广告网站推广品牌宣传海报设计制作
  • 网站特色栏目重要性阿里云服务器安装宝塔和wordpress
  • 连云港网站优化方案专业做化学招聘的网站有哪些