高并发下数据库和缓存保持一致的情况策略

  • z
    znm
    不懂java,没用过redis, 硬看代码没看出来怎么保证失败情况,其实就是更新数据库或者缓存失败的处理,QPS 降低不可避免。
    还是CPA 原则自己取舍了

    看到了更改缓存或者数据库貌似后面有延时,这个算是更新成功,正常情况的保证?
  • R
    Romney
    回复2#znm

    呃,sleep是在模拟数据库读写时间
  • z
    znm
    我感觉还是保证不了,虽然你先删除了缓存,但是你更新数据库的时候还是可以从cache 读的(没有就从新从数据库读), 你加的那个lock,不影响读数据库
  • R
    Romney
    更新和读的时候的分布式锁用的是一个key, 也就是一个锁.
    所以读的线程要想从db读, 要等到更新的线程更新完了释放了这把锁, 才能从db读到.
  • z
    znm
    竟然这么用锁,那我觉得可以保证了,但是并发就悲剧了
  • h
    hanfengzxh
    这是分布式锁 iOS fly ~
  • j
    jqustc
    每100ms尝试不是个好的设计 太耗资源了
  • H
    Hisoka-J
    你的get和trylock是原子的吗?
    如果不是那不行,建议用redis配合set ex nx参数来实现,这是最简单最好的,被无数业务验证过的可靠方案 iOS fly ~
  • H
    Hisoka-J
    也可以试试pika iOS fly ~