更新服务器缓存如何合并相同请求? - V2EX
aiqier
V2EX    Java

更新服务器缓存如何合并相同请求?

  •  
  •   aiqier Oct 8, 2016 3382 views
    This topic created in 3504 days ago, the information mentioned may be changed or developed.

    我们有一个布置了多台的服务,服务从 redis 集群中获取数据,一个 key 对应一个 value ,如果没有,则会从三方接口获取并进行计算后先返回给调用方再写入缓存。三方接口的响应时间大概 2s

    现在有一个问题是,三方接口是收费的,如果此时多个请求同时到达而且计算出来的 key 都相同,会都发现缓存没有,而都会去调用第三方接口。这很浪费资源,因为只需要调用三方接口一次就够了。在服务本身对请求做合并的方式效果并不好,因为服务布了多台。

    如何能 hold 住这些其实在请求一个资源的多个请求链接,只出发一次更新缓存的逻辑,然后在数据返回后,统一还给它们。

    11 replies    2016-10-09 14:02:27 +08:00
    julyclyde
        1
    julyclyde  
       Oct 8, 2016
    自旋锁
    master
        2
    master  
       Oct 8, 2016
    key 没有值 但是已经有服务器去要值的时候 可以标记个占坑
    其他服务器看到坑占了 可以等待一定时间再去取 如果坑被占了超过一定时间 还是没有值
    那就当前的机器重新把坑占了(更新占坑的信息) 然后去取值喽
    fwrq41251
        3
    fwrq41251  
       Oct 8, 2016
    一个想法。当服务用 key 去取发现没有的时候,先随便往里面写一个值,然后再调第三方接口,等调用完毕再把真实的内容替换之前随便写的值。
    reus
        4
    reus  
       Oct 8, 2016
    上锁,刚好有 redis ,可以做分布式锁
    6IbA2bj5ip3tK49j
        5
    6IbA2bj5ip3tK49j  
       Oct 9, 2016
    用 futureTask 占坑
    sun1991
        6
    sun1991  
       Oct 9, 2016
    不能由 cache 服务去申请付费 API 吗?
    julyclyde
        7
    julyclyde  
       Oct 9, 2016
    @sun1991 那无非是把合并动作推到 cache 层去了而已,还是得做的
    aiqier
        8
    aiqier  
    OP
       Oct 9, 2016
    @master
    @fwrq41251
    @xgfan
    @reus
    @julyclyde
    合并请求是这个需求的一部分吧,关键是要能够在有数据后唤醒那些 hold 住的链接。
    6IbA2bj5ip3tK49j
        9
    6IbA2bj5ip3tK49j  
       Oct 9, 2016
    @aiqier get()阻塞住了,也可以加一个超时。
    simple2025
        10
    simple2025  
       Oct 9, 2016
    不懂
    不是
    if not in cache:

    with lock:
    if not in cache:
    get from api
    这种逻辑吗?
    lrh3321
        11
    lrh3321  
       Oct 9, 2016
    t/308349
    之前看过这么个帖子,和你的需求貌似很相近。

    利用 redis 的 setnx 设置标记,成功设置了标记的线程去调用第三方接口。
    About     Help     Advertise     Blog     API     FAQ     Solana     5947 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 69ms UTC 02:05 PVG 10:05 LAX 19:05 JFK 22:05
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86