PHP:最好的前进之路[序列化,对象,Redis]
PHP: Best way forward [serialisation, objects, Redis]
我开发一个PHP应用程序已经有一段时间了。其(基本)思想如下;用户可以使用块构建网页。这些块可以包含图像,文本等。每个模块都有自己的选项。这些块通过PHP在领域驱动设计中定义。
我已经构建了应用程序,使用基于php的控制器来处理来自jQuery/Javascript前端的请求。每次用户编辑一个选项时,它都会发送到这个控制器,该控制器会从Redis和/或php-session中反序列化一组块(php-object),并设置被编辑块的属性或添加/删除一个块。这是为了执行域逻辑。这对我自己来说很好。我从来没有考虑过比赛条件之类的。在使用产品的过程中,我注意到人们丢失了数据。我将解释发生了什么;
- 用户编辑一个块的选项 <
- 保存/gh>
- 向控制器发出请求,
- 反序列化集合和
- 根据block的uid 设置block
- 将块放回集合中,
- 再次序列化集合。
在某些情况下,可能会创建两个并发请求,这将覆盖两个请求中的一个的编辑。
我知道我需要重写应用程序的这一部分。问题是什么是最好的方法。我可以;
- 实现一些javascript库,这将花费我大量的工作,因为它需要我重写整个应用程序的一部分。此外,我没有很多的经验,实现基于javascript的解决方案。但我不希望踏入新的领域。我确实想要javascript测试,以防止未来的问题发生,并启用跨浏览器测试
- 应用Redis/Session锁,只允许控制器处理单个请求,防止并发请求覆盖前一个请求中的数据集。这将降低并发请求和数据丢失的可能性,但不是全部。网速很慢的人可能会在产生大量并发请求时失去连接。
我很好奇我可能还缺少什么其他方法,或者我上面提到的两种方法中的一种是否足够。
据我所知,您可能想要实现的是乐观锁定。
实现它的一个简单方法是对聚合进行版本化。
每当有人编辑你的对象时,增加它的版本。
当您POST
编辑的块时,您将返回您试图应用更改的版本。
然后,当你从持久化存储中取回你的对象时,你比较版本并确保你实际上正在处理一个最新的对象。
如果是,保存它,如果不是,拒绝修改,通知用户,并重新加载对象,并采取适当的操作(这取决于您的需要)。
相关文章:
- 序列化数据属性中对象的最可靠方法
- 是否可以在javascript中反序列化java对象
- 对象序列化,JAVA,Javascript
- 如何使用angularjs序列化对象
- 如何在C#中反序列化json对象
- Typescript,序列化类对象
- JSON.stringify没有序列化对象
- 如何在JavaScript中序列化对象
- 如何:从javascript反序列化C#对象
- Javascript:反序列化对象和混合方法
- 使用具有有效 JavaScript 格式的 Json.NET 序列化对象
- 序列化对象中带有 bashslash 的 Json 分析错误
- 字符串化和解析 JSON(序列化对象结构)和反序列化,将 JSON 字符串转换为对象结构
- 如何将参数添加到序列化对象
- 如何在 Node JS 中反序列化对象(Java 序列化对象)
- 序列化对象数组
- Angular2在后台线程中使用自定义的可序列化对象
- 可序列化对象排除从客户端调用我的公共属性
- 如何创建嵌套在另一个对象中的序列化对象集
- 在 JavaScript 中序列化/反序列化对象的最佳方法