【问题标题】:Using Redis to store basket in project with CQRS + MediatR使用 Redis 通过 CQRS + MediatR 在项目中存储篮子
【发布时间】:2023-01-30 17:20:08
【问题描述】:

我想实现购物篮功能并在我的 WebApi 中使用 Redis 存储购物篮。在整个项目中,我在数据库操作中使用 CQRS 和 MediatR。但是我不知道在 Redis 的情况下应该如何实现。

我是否也应该以同样的方式对我的篮子执行操作,例如:GetBasketByIdRequest、GetBasketByIdResponse、GetBasketByIdHandler、GetBasketByIdCommand、GetBasketByIdQuery 等)?

还是像 IBasketRepository 那样把它分开?

我真的很好奇,如果像通常为数据库做的那样创建 MediaTr 处理程序是否有意义,或者创建一些服务类会更好吗?

我的仓库:https://github.com/Lukash88/FlowerShop/tree/basket/FlowerShop

我指的是回购:https://github.com/TryCatchLearn/skinet7/commit/73ecdb7626a36611686fad16c2c5108afb9c7534

感谢您的帮助和任何建议!

【问题讨论】:

  • 我会说它“只是”一个数据库和存储库的等价物。数据存储恰好是键值对,但它对调用者应该是透明的,就像它在数据库中一样。
  • @Andy 那么你推荐什么?

标签: asp.net-core asp.net-web-api webapi stackexchange.redis clean-architecture


【解决方案1】:

您应该像对待任何数据库访问一样对待 Redis。

Redis 读/写应该“只是”作为一个抽象的工作单元或存储库模式出现。

快速查看您的代码,我发现您的项目有一个 IRepository。 Redis 应该“只是”作为 IRepository 的另一个实现出现在应用程序中。

它在内存中和键值对而不是 rdbms(或与此相关的 nosql)中的事实是无关紧要的。

这是您的数据存储,您应该以一致的方式抽象出对任何数据存储的读/写。大多数情况下,一旦你选择了一个数据库,你就不太可能改变它。这是一个基本的。 Redis 是一种缓存,但也是一个例外。随着花卉帝国的发展,您以后可能会决定转向 mongodb。或者,对于低阶数,redis 可能证明是昂贵的。

尽管在 redis 中保存篮子,但有一个警告。

被遗弃的篮子是一回事。您需要跟踪篮子的使用时间。您还需要将购物篮链接到一个帐户,因此您应该使用帐户 ID 或将购物篮 ID 添加到用户帐户表(如果有的话)。 (我没有足够深入地查看您的代码以进行检查)。

您将需要某种批处理过程来删除一个月左右未访问过的所有篮子。如果你不这样做,废弃的篮子最终会堵塞 redis。无论如何,如果用户在 12 月重新登录,他们很可能会惊讶地发现潜在的情人节礼物仍然挥之不去。

【讨论】:

    猜你喜欢
    • 2015-11-07
    • 2012-08-09
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 2019-05-09
    • 2023-02-25
    • 2020-09-18
    • 1970-01-01
    相关资源
    最近更新 更多