`

处理缓存失效时DB负载突然过高的问题

 
阅读更多

缓存的一个常见使用方式:先查缓存--未命中--查DB--写缓存。

   

if(!cacheUtil.getDataFromCache()){ //(1)
 	Object data = cacheUtil.getDataFromDB();//(2)
	cacheUtil.setDataToCache(data);
 }

 这种方式使用起来简单,但也存在比较大的问题。我们都知道缓存会设置一定的过期时间,一旦缓存过期,如果此时正好有大量的请求进来,会在代码(1)处出现大量并发,代码(2)处会使DB的压力瞬间增大。为了避免这样的情况出现,我们采取了以下措施:

      1.定期主动刷新缓存。使用定时任务来定时更新缓存,定时任务时间比缓存时间短,保证缓存永不过期;这种方案对于key值比较少且固定的数据来说比较适用。

      2.对缓存失效时的请求进行限流;1W个请求只处理先进来的100,后面的直接失败;

 

AtomicInteger cacheLock = new AtomicInteger(0);
 		if(!cacheUtil.getDataFromCache()){
 			if(cacheLock.incrementAndGet()<=100){
 				try{
 					Object data = cacheUtil.getDataFromDB();
 					cacheUtil.setDataToCache(data);
 				}finally{
 					cacheLock.decrementAndGet();
 				}
 			}else{
 				return;
 			}
 		}

 
  

       这个方案虽然控制了穿透到DB的请求数量,但是会导致大量请求失败,所以方案可以改成让一定数量的请求去走DB,而让其他请求等待。

        

分享到:
评论

相关推荐

    高负载系统架构设计概要

    综上所述,设计高负载系统架构时,需兼顾负载均衡、中间层处理、分布式缓存、文件服务器、数据库优化以及监控和容错等多个方面,通过这些技术手段,构建出能够处理大规模用户访问的稳定、高效系统。

    学习笔记:300分钟吃透分布式缓存.docx

    Cache Aside 模式中,业务应用方对缓存的读写操作是异步的,缓存失效时,业务应用方会去数据库中查询最新的数据,并将其写回缓存中,以确保缓存的数据是最新的。 Read/Write Through 模式中,业务应用方对缓存的...

    PHP使用Memcache时模拟命名空间及缓存失效问题的解决

    在PHP开发中,使用缓存系统如Memcache可以显著提高应用程序的性能,但有时需要解决特定问题,例如模拟命名空间和处理缓存失效。本文将深入探讨如何在PHP中使用Memcache来模拟命名空间以及应对缓存失效问题。 首先,...

    【Redis】缓存的三大问题及其解决方案.docx

    这种现象通常发生在恶意用户或黑客试图利用应用程序的漏洞来发送大量不存在的数据请求,从而绕过缓存直接击打数据库,导致数据库压力过大甚至崩溃。 **1. 常见解决方案** 对于缓存穿透问题,有几种常见的解决方案...

    Redis热点Key发现及常见解决方案_2.docx

    但这种方法可能导致缓存失效、缓存丢失和脏读问题。 2. **使用Memcache或Redis方案**:客户端独立部署缓存,减少对Server的压力。虽然能提高速度,但可能浪费内存资源,并存在脏读问题。 3. **本地缓存方案**:在...

    分布式数据库面试专题系列:Memcached+Redis+MongoDB.zip

    面试时,可能涉及的问题包括Memcached如何解决缓存一致性、其内存管理机制(如Slab Allocation)以及如何处理缓存失效策略(如LRU,Least Recently Used)。 接下来是Redis,一个高级的、开源的、支持网络的、数据...

    如何发现Redis热点Key,解决方案有哪些.docx

    3. **数据库击穿与业务雪崩**:一旦缓存失效,所有原本由缓存承担的请求将直接打到后端数据库上,若数据库无法承受这些额外的请求负载,则可能发生“雪崩”效应,导致整个业务系统瘫痪。 #### 三、解决方案 针对...

    PHP商城系统 v2.0.4

    &gt;系统设置-&gt;邮件配置-&gt;邮件队列) 增加 邮件订单提醒 邮件队列提醒 库存提醒等增加 前台 分类 自定义搜索 增加 商品相册功能增加 会员中心 订单处 直接打印订单功能解决 后台内存和CPU占用过高的问题增加 短信接口

    数据库应用与设计-大型数据库系统架构设计方法.pdf

    在本文档中,有关大型数据库系统架构设计方法的知识点涵盖了大型系统设计的核心理念,包括可扩展性、高可用性、负载均衡、容错以及失效转移。此外,还涉及了数据库的基础概念,如ACID特性和关系数据库的基本原理。 ...

    移动应用形态在数据库上所需的适应性改变_敬宓

    - **数据一致性**:强一致性的要求使得RDBMS无法进行批量或推迟计算,导致I/O操作频繁,缓存失效快。 #### NoSQL的选择与局限 以Foursquare为例,其最初选择了MongoDB,看重其Schema-Free特性、减少JOIN操作、GEO-...

    程序效能常规处理方法1

    在IT领域,特别是服务器管理与性能优化中,程序效能常规处理方法是确保系统稳定运行的关键。以下是从标题、描述和标签中提取出的一些关键知识点: 1. **表空间状况和磁盘使用情况**: - 使用`df -h`命令监控磁盘...

    核心交易系统高可用架构设计.pptx

    例如,下单服务和接单服务可以分布部署在多个DB实例上,实现负载均衡,确保任何单一组件的失效不会影响整体服务。 自我保护机制包括流量隔离、业务分流和防刷保护。流量隔离通过智能DNS解析、业务类型划分和内部...

    oracle报错大全(珍藏版)

    这可能是因为操作系统检测到了某种异常情况,如内存不足、系统负载过高等。 #### ORA-00019: Operating System Resource Crashed 当操作系统资源出现故障时触发此错误,如磁盘I/O错误等。 #### ORA-00020: System ...

    关系型数据库性能体系设计和效率提升.zip

    1. NewSQL数据库:如TiDB、CockroachDB等,结合传统RDBMS和NoSQL的特点,提供高并发、分布式事务处理能力。 2. 数据库云服务:如AWS RDS、Azure SQL Database等,简化数据库管理,提供弹性伸缩和自动优化功能。 综...

    SQL查询优化

    6. 查询返回的数据量过大,增加了处理和传输的时间。 7. 锁和死锁,可能导致并发访问冲突。 8. 服务器同时处理OLTP(在线事务处理)和OLAP(在线分析处理)查询,资源分配不当。 9. 返回不必要的列,增加了数据传输...

    Oracle AWR 报告分析实例讲解.docx

    2. **关注异常值**:在分析Load Profile时,注意识别那些异常高的指标,这可能提示性能问题的存在。 3. **对比基线数据**:通过与历史数据进行对比,可以更准确地评估当前数据库的状态。 4. **综合考虑多个指标**:...

    单KEY业务,数据库水平切分架构实践

    此外,还需要考虑缓存失效后的数据同步机制。 综上所述,对于单KEY业务来说,合理选择和实施数据库水平切分策略至关重要。在实际应用中,我们需要根据具体的业务场景和技术要求,灵活运用上述各种方法和技术手段,...

    NOSql数据库笔记

    NOSQL数据库设计的核心原则包括假设失效是必然发生的,对数据进行分区,保存多个副本,动态伸缩以适应负载变化,使用Map/Reduce处理聚合,以及可以选择基于磁盘或内存的实现。NOSQL并非炒作,而是应对大数据和高并发...

    ORACLE调优文档总结

    - **表空间和数据文件管理**:合理分配数据文件大小,避免单个文件过大或过小导致的性能问题。 - **并发控制**:理解并应用乐观锁、悲观锁、行级锁定,减少锁冲突。 - **数据库维护**:定期执行统计信息更新、...

Global site tag (gtag.js) - Google Analytics