基于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
原创粉丝点击