我正在考虑使用与Memcached配对的NOSQL(MongoDB)一起存储在我的WebApp中。这个想法是,在每个页面加载时,将用户数据与memcache中的数据进行比较,如果发生了变化,则将数据写入Memcached和MySQL。这样,读取将大大减少和纪念用来做到最好的事情。

但是,我有点担心使用非ACID数据库进行会话存储,尤其是在模拟层的情况下。假设在将会话更新为数据库时出现了问题,我们的用户立即头痛,想知道为什么他们放入购物车的产品不会出现...

什么是适当的方法?我们应该选择MySQL会话存储还是可以保留非酸支持数据库的会话?

谢谢!

有帮助吗?

解决方案

如果您不想丢失数据,请坚持使用酸测试的数据库。

您要寻找的回报是多少?

如果您想要一个安全的系统,则不能信任用户的任何内容,也许可以选择选定的整数,因此让他们存储信息通常是一个非常好的主意。

我看不到在MySQL数据库之外存储会话的回报。如果您关心的话,您可以在桌子上清理清理,但是为什么要打扰呢?一些用户将在网站上购物,然后分心一段时间。然后,他们会在一两天后回来。

如果您使用cookie或真正临时的东西来存储他们的会话信息,那么他们的购物时间很可能被浪费。用户确实重视他们的时间...因此,如果您将他们的会话信息存储在数据库中,则可以编写一些性感的东西来管理该数据。

另外,这样做的好副作用是,您将为您的网站上的人们提供大量残差信息,这些信息可能以后再也无法使用。就像您甚至可以认为其中的一些像民意调查一样,或者人们在购物车中添加的物品可能会影响您管理业务,订购库存或集中营销的方式。

如果您选择真正暂时的事情,那么您将失去获得剩余福利。

其他提示

我目前正在使用MongoDB作为会话存储。可以避免Pilif提到的种族条件。我找到了一个为MongoDB实施会话处理程序的课程(http://www.jqueryin.com/projects/mongo-session/)并在github上分配它以满足我的需求(http://github.com/halfdan/mongosession).

如果没有任何锁定,请真正非常小心您要存储的内容。永远不要存储任何取决于您以前阅读的内容,因为数据可能会在阅读和写作之间发生变化 - 尤其是在Ajax的情况下,可以立即发出多个请求。

一个示例,您不得在非锁定会话中存储的是购物车,因为要添加产品,您必须阅读,不重新陈述,添加产品然后再次序列化。如果其他请求在第一个请求读写之间执行相同的操作,则将丢失第二个请求的数据。

请查看本文以获取详细信息: http://thwartedefters.org/2006/11/race-conditions-with-ajax-and-php-sessions/

在您的文件系统(PHP为您锁定的位置)上,将会话保留在数据库中(您必须在其中进行手动锁定)或永远不会为您的会话写入任何有价值的内容,如果该值是先前的读取的。

在使用memcached作为数据库的缓存时,是用户必须确保数据库和缓存之间的数据一致性。如果您想扩展并添加更多服务器,那么即使一切正常,也有可能与数据库不同步。

相反,您可能会考虑 榛子. 。从1.9开始,它还支持memcache协议。与Memcached Hazelcast相比,希望您实现地图 毅力 并且只有自身为更新的条目更新数据库。这样,您就不必处理“检查缓存,如果数据更改了更新数据库”的类型。

如果您编写应用程序,以便用户存储所有会话信息客户端,那么您只需根据需要验证这些信息,就不必担心服务器端上的会话。这是REST风格体系结构中的原则之一。例如,如果用户要求将项目添加到其购物车中,则只需存储ItemID列表并依靠客户端即可。当您打到购物车页面时,您可以轻松地从他们告诉您在购物车中的项目ID列表中查找项目信息。

在结帐期间,直接使用交易数据库与数据库进行,以确保您没有任何比赛条件,并检查您的实时清单。如果他们去退房时不在那里,只需说:“对不起,我们只是卖光了”。当然,到那时,您应该更新您所拥有的任何缓存,这些缓存告诉人们您的库存。

我会查看用户获取的成本,然后询问实施一个真正好的系统的成本是多少。请记住,用户是一种生物重试方法。 “我很无聊...再次按重新加载……”而这不是最完美的解决方案,有时是可以接受的,而不是“不要失去任何东西 - 永远”的成本肯定。

如果您需要额外的安全性,则可以将会话缓存到另一组Memcache服务器上,因此没有意外冲洗。 :)

还有许多其他系统membase.org,还有其他一些持久的memcache解决方案(Java实现)将持续存储到磁盘。如果您想在某种程度上修改客户端或访问memcache的方式,则可以对Memcache Session对象进行复制。

- 丹尼尔

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top