PHP:最佳前进方式[序列化,对象,Redis]

时间:2016-11-08 15:43:34

标签: javascript php serialization redis domain-driven-design

我一直在开发PHP应用程序。 (基本)想法如下;用户可以使用块构建Web页面。这些块可以包含图像,文本等。这些块中的每一个都有自己的选项。这些块在域驱动设计中通过PHP定义。

我构建应用程序以使用基于php的Controller来处理来自jQuery / Javascript前端的请求。每次用户编辑一个选项时,它都会发送给这个控制器,该控制器从Redis和/或php-session取消序列化一组块(php-objects),并设置编辑或添加/删除其中一个块的块的属性。块。这是为了强制执行域逻辑。

这对我自己来说很好。我从来没有把竞争条件记在心里。在推进产品的同时,我注意到人们会丢失数据。我会解释会发生什么;

  1. 用户编辑块的选项
  2. 按保存
  3. 向控制器发出请求,
  4. 对集合进行反序列化和
  5. 根据uuid
  6. 设置块
  7. 将块放回集合中
  8. 再次序列化该集合。
  9. 有一种情况可能会创建2个并发请求,这将覆盖两个请求中的1个的编辑。

    我知道我需要重写应用程序的这一部分。问题是什么是最好的方法。我可以;

    1. 实现一些javascript库,这将需要我很多工作,因为它需要我重写应用程序的整个部分。此外,我没有很多实施基于JavaScript的解决方案的经验。但我不会踩到新的东西。我确实想进行javascript测试以防止将来出现问题并启用跨浏览器测试
    2. 应用Redis / Session锁定仅启用控制器处理单个请求并防止并发请求覆盖先前请求中的数据集。这将降低并发请求和数据丢失的可能性,但不会完全降低。互联网连接速度很慢的人可能会在他们可能产生大量并发请求时失去联系。
    3. 我很好奇我可能缺少的其他方法,或者我上面提到的两个方法中的一个是否足够。

1 个答案:

答案 0 :(得分:1)

据我了解您的问题,您可能希望实施的是optimistic locking

实现它的一种简单方法是对聚合进行版本化。

每当有人编辑您的对象时,请增加其版本。

当您POST编辑过块时,您会发回您尝试应用更改的版本。

然后,当从持久性存储中恢复对象时,您需要比较版本并确保实际处理最新的对象。

如果是,保存,如果不是,则拒绝修改,通知用户,然后重新加载对象,并采取适当的操作(这取决于您的需要)。