中央缓存结合本地缓存-本地缓存数据刷新方案

互联网应用通常都需要应付大并发量,为了提高QPS,通常会使用中央缓存(例如memcache)和本地缓存的方式。请求先经过本地缓存,如果不命中,则请求穿透到中央缓存,如果还是不命中,则会直接查询数据库,并把查询到的数据刷新到中央缓存中。如果采用这种方式的话,必须要解决一个问题,如何刷新本地缓存的数据。

每个应用中都提供一个刷新接口


之前参与过的一个项目,应用的部署图大概如下:
这里写图片描述

当时的解决方案如下:
服务器a、b和c中的应用application-a基于oscache构建了本地缓存,为了能刷新服务器中这些应用中的oscache,可以在application-a这个应用中提供一个刷新oscache的http接口,叫refresh(),每次服务器d 中的后台应用修改了数据后,先刷新中央缓存,然后直接获取服务器a、b、c的ip地址,然后for循环,挨个的调用refresh()接口。

这种做法有很多缺点:

  1. 必须维护application-a应用的所有ip地址,如果新增了一个机器部署了application-a,则必须在后台管理系统中对应的新增一个ip地址,以便数据更新后,可以通知到新应用中的oscache缓存数据;
  2. 使用for循环,是串行的通知,没有做到并行的通知,如果服务器多的话,有一定的延迟;
  3. 假设更新其中一台服务器的缓存数据失败了,没有重试机制。

订阅机制


另一种做法是,是MQ的订阅机制,生产者把消息写到一个队列中,然后通知订阅该队列的所有消费者。

设置本地缓存数据的失效时间


设置本地缓存数据的失效时间,例如10分钟,时间一到,则数据自动失效,让请求**穿透**过去,应用再次将新数据加载到本地缓存中,再次设置10分钟的失效时间。

这种做法非常的简单简洁,但是注意考虑业务场景。

使用时间戳版本号


当请求过来的时候,根据key先从中央缓存中获取对应这个key的一个时间戳,然后再根据这个key去本地缓存中获取时间戳,比较两个时间戳,如果本地缓存未失效,则从本地缓存获取。

这种做法也有个缺点,就是无论如何都必须先去中央缓存读取一次。多了一次开销,不过时间戳的大小也非常小,影响不是很大。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值