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

Cache Aside Pattern,代码怎么组织?

  •  
  •   myd · 2021-03-26 10:57:44 +08:00 · 1142 次点击
    这是一个创建于 1098 天前的主题,其中的信息可能已经有所发展或是发生改变。

    以下订单流程为例:

    begin;	// 开启事务
    
    Stock.reduce();	// 调用库存模块: 查询库存、SQL 减库存、删除库存相关缓存
    
    User.pay();   // 调用用户模块:查询余额、SQL 扣减余额、清除余额缓存
    
    Order.create();	// 调用订单模块:SQL 插入订单、删除订单相关缓存
    
    commit;	// 提交事务
    

    上面的逻辑实际上是先清除了缓存,再更新数据库(提交事务),不是 Cache Aside Pattern,在并发情况下会导致缓存不一致。把代码改成:

    begin;	// 开启事务
    
    Stock.reduce();	// 调用库存模块: 查询库存、SQL 减库存
    
    User.pay();	  // 调用用户模块:查询余额、SQL 扣减余额
    
    Order.create();	// 调用订单模块:SQL 插入订单
    
    commit;	// 提交事务
    
    Stock.clear();	// 清除缓存
    User.clear();
    Order.clear();
    

    这样才是先更新数据库再清除缓存。但问题是,库存缓存属于库存模块的内部实现,不应该把清缓存的方法暴露出去,用户模块、订单模块也是一样。

    有事务的情况下,怎么组织代码比较合适?

    lewis89
        1
    lewis89  
       2021-03-26 18:03:03 +08:00
    用切面做吧,不知道你用不用 Java,一般推荐非业务代码 都放在切面里面做掉,这样业务只要关心业务就好了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3106 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 12:57 · PVG 20:57 · LAX 05:57 · JFK 08:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.