我们有一个布置了多台的服务,服务从 redis 集群中获取数据,一个 key 对应一个 value ,如果没有,则会从三方接口获取并进行计算后先返回给调用方再写入缓存。三方接口的响应时间大概 2s
现在有一个问题是,三方接口是收费的,如果此时多个请求同时到达而且计算出来的 key 都相同,会都发现缓存没有,而都会去调用第三方接口。这很浪费资源,因为只需要调用三方接口一次就够了。在服务本身对请求做合并的方式效果并不好,因为服务布了多台。
如何能 hold 住这些其实在请求一个资源的多个请求链接,只出发一次更新缓存的逻辑,然后在数据返回后,统一还给它们。
1
julyclyde 2016-10-08 20:51:20 +08:00
自旋锁
|
2
master 2016-10-08 20:53:47 +08:00
key 没有值 但是已经有服务器去要值的时候 可以标记个占坑
其他服务器看到坑占了 可以等待一定时间再去取 如果坑被占了超过一定时间 还是没有值 那就当前的机器重新把坑占了(更新占坑的信息) 然后去取值喽 |
3
fwrq41251 2016-10-08 21:15:03 +08:00
一个想法。当服务用 key 去取发现没有的时候,先随便往里面写一个值,然后再调第三方接口,等调用完毕再把真实的内容替换之前随便写的值。
|
4
reus 2016-10-08 21:31:40 +08:00
上锁,刚好有 redis ,可以做分布式锁
|
5
6IbA2bj5ip3tK49j 2016-10-09 09:08:42 +08:00
用 futureTask 占坑
|
6
sun1991 2016-10-09 10:28:27 +08:00
不能由 cache 服务去申请付费 API 吗?
|
8
aiqier OP |
9
6IbA2bj5ip3tK49j 2016-10-09 11:31:39 +08:00
@aiqier get()阻塞住了,也可以加一个超时。
|
10
chenqh 2016-10-09 11:32:27 +08:00
不懂
不是 if not in cache: with lock: if not in cache: get from api 这种逻辑吗? |
11
lrh3321 2016-10-09 14:02:27 +08:00
|