基于cache的过载问题解决模式
来源:互联网 发布:2013美国对外贸易数据 编辑:程序博客网 时间:2024/05/04 23:43
假设系统A依赖于系统B,同时为了提高访问效率,A系统在本地设置系统B的cache,其过期时间为t。当cache失效时的策略如下:
1)基于超时的常规模式: 单统程请求,其他线程等待
在t到达后,Cache中的Key和对应Value将被清除,get操作将通过RPC获取B 系统的Key对应的Value,并更新本地Cache。
此时,如果另一个线程发现cache过期,get操作先判断有没有其他线程发起了远程调用, 如果有,那么自己就等待,直到那个线程远程获取操作成功,get操作返回更新后的cache中的值。如果远程获取操作失败,则get操作抛出异常,不会返回任何Value。
2)基于刷新的常规模式:
在t到达后,Cache中的Key和相应Value都不会被清除,而是被标记为旧数据,如果有线程调用get操作,将触发refresh更新操作,根据get和refresh的同步关系,又分为两种模式:
- 同步模式:get操作等待refresh操作结束,refresh结束后,get操作返回当前Cache中Key对应的Value(新值),注意:refresh操作结束并不意味着refresh成功,还可能抛了异常,这时 get操作返回的值可能是旧值。如果其他线程进行get操作,Key已经过期,并且发现有线程触发了refresh操作,则自己不等refresh完成直接返回旧值。
- 异步模式:get操作触发refresh操作,不等refresh完成,直接返回Cache中的旧值。如果其他线程进行get操作,发现Key已经过期,并且发现有线程触发了refresh操作,则自己不等refresh完成直接返回旧值。
3)基于刷新的续费模式
该模式和基于刷新的常规模式唯一的区别在于refresh操作超时或失败的处理上。在基于刷新的常规模式中,refresh操作超时或失败时抛出异常,Cache中的相应Key-Value还是旧值,这样下一个get操作到来时又会触发一次refresh操作。
在基于刷新的续费模式中,如果refresh操作失败,那么refresh将把旧值当成新值返回,这样就相当于旧值又被续费了T时间,后续T时间内get操作将取到这个续费的旧值而不会触发refresh操作。
基于刷新的续费模式也像常规模式那样分为同步模式和异步模式,不再赘述。
1 0
- 基于cache的过载问题解决模式
- Cache应用中的服务过载案例研究
- Cache应用中的服务过载案例研究
- 得到简单的过载
- 过载
- 基于目录的cache一致性
- 基于IA32 的cache学习
- 基于Anocation的Spring Cache
- DMA导致的CACHE一致性问题解决方案
- 基于漏桶(Leaky bucket)与令牌桶(Token bucket)算法的流量控制也叫过载保护
- 基于OSGI的Cache组件的实现
- 基于OSGI的Cache组件的实现
- 基于Cache的Fibonacci数列的计算
- 一个基于Cache+Repository+DAO的实现
- 基于ASIHTTPRequest的图片cache组件
- spring 基于注解的Cache支持
- spring 基于XML配置的Cache支持
- Spring基于XML配置的Cache支持
- 卡尔曼滤波学习指南
- 阿里云下ubuntu 14.04 docker的安装
- 提交注册信息到数据库中
- JSP和Servlet原理剖析
- C/C++练习5
- 基于cache的过载问题解决模式
- 设计师分析需求的时候需要避免的4个误区详解
- leetcode 58. Length of Last Word
- linux结束进程
- JavaScript - RegExp(正则表达式)
- JAVA中Set集合
- PullToRefresh使用详解(一)--构建下拉刷新的listView
- AVL - 自平衡二叉树 - 详解
- Android开发使用的常见第三方框架汇总