Cache Aside Pattern,代码怎么组织?

2021-03-26 10:57:44 +08:00
 myd

以下订单流程为例:

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();

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

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

1300 次点击
所在节点    Redis
1 条回复
lewis89
2021-03-26 18:03:03 +08:00
用切面做吧,不知道你用不用 Java,一般推荐非业务代码 都放在切面里面做掉,这样业务只要关心业务就好了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/765324

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX