V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
seekjobs
V2EX  ›  随想

写更新缓存数据代码时,先删除缓存,然后再更新数据库感觉可行

  •  
  •   seekjobs · 2020-10-29 00:48:07 +08:00 · 2314 次点击
    这是一个创建于 1483 天前的主题,其中的信息可能已经有所发展或是发生改变。

    写更新缓存数据代码时,先删除缓存,然后再更新数据库的方法,如果改变下删除缓存的方式,是可以简单地解决问题地

    先删除缓存,可以不是真的删除:可以改为软删除,记录缓存的 version 和过期时间(比数据库过期时间长一秒就可以)——当查询操作操作发现软件删除时,会直接从数据库取数据,数据库数据的 vesion 小于等于缓存 version 时就不更新缓存,大于缓存 version 时就更新。

    如果数据库操作失败,就真删除缓存,如果删除缓存失败,因为有过期时间兜底,问题不会太大。

    如果数据库操作成功,有查询操作就会更新缓存。

    4 条回复    2020-10-31 21:57:48 +08:00
    geebos
        1
    geebos  
       2020-10-29 00:52:49 +08:00
    没必要弄个 version,更新缓存的代价可以忽略不计,你这还加个 version 字段反而把问题搞复杂了
    Leigg
        2
    Leigg  
       2020-10-30 08:39:45 +08:00 via Android
    血崩考虑过不
    seekjobs
        3
    seekjobs  
    OP
       2020-10-31 21:53:20 +08:00
    @Leigg 这样做缓存会命中,所以缓存不会雪崩,但仍然取数据库,但只要操作数据库后删除缓存顺利,这个时间很短,取的数据又是存在的数据,数据库不会被穿透。也许可以加一个计数,计数太多可以理解为有意的攻击,不取数据库直接返回错误就好
    seekjobs
        4
    seekjobs  
    OP
       2020-10-31 21:57:48 +08:00
    @geebos 谢谢,version 确实可以不要的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1086 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 19:16 · PVG 03:16 · LAX 11:16 · JFK 14:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.