好的,所以我还没有深入了解使用memcached的细节,因为我正在集思广益/计划如何在开始黑客攻击并制造糟糕的东西之前如何使用memcached解决方案。
以下是环境:该网站显示了许多不同供应商的交易清单,按交易的受欢迎程度排序(想想大网格)。非用户总是看到相同的网格,但用户可以选择喜欢的供应商,这样他们最喜欢的供应商的交易总是首先出现。
现在如何工作:如果非用户打开网站,则会发送一个SQL查询以获取表deals
中的所有交易信息,然后用于填充页面所需的html。如果用户进入该站点,则会发送一个更高级的SQL查询(基本上是deals
和userfavorites
的左连接),如上所述对该交易进行排序并填充html。
我想做什么:显然,非用户SQL查询对于memcached似乎是完美的,因为在更新deals
表之前它总是一样的(它可以同时更新memcached版本,我正在猜测)。但是,由于用户要为他们的收藏夹提供一堆变体,我想知道如何为他们提供缓存解决方案。用户看到的所有数据与非用户完全相同,唯一的区别是订单。对我来说,对缓存中已有的数据执行查询似乎没有意义。是否可以缓存deals
和userfavorites (where userid=?)
,然后执行left-join&使用PHP人为地对它们进行操作?
基本上,这样的事情?
memcached version of deals (desc order by pageviews)
memcached version of favorites (specific to the user)
favoritecount = 0
for i = 0, i < length(deals), i++
if deals.i.vendor is a member of favorites
push deals.i to deals.favoritecount
favoritecount++
else
continue
如果我正确地考虑了这一点,因为deals
已经排序并且正在按顺序处理,这应该会生成favorites (desc order by pageviews)
∪deals (desc order by pageviews)
形式的交易列表,我可以用来吐出html。
当然,我可以进行检查,以便用户添加或删除收藏夹时,会更新缓存版本。
你们觉得怎么样?这可能吗?我希望我的用户尽可能少地触摸我的数据库以获得大致相同的数据,所以我希望memcached允许我做我上面描述的内容。目前,网站的每一次点击都在触及数据库。感谢您花时间阅读本文,非常感谢任何输入。
答案 0 :(得分:0)
如果您有足够小的交易,您绝对可以将它们缓存为数据而不是HTML,这意味着NO ONE必须打到您的数据库。然后,您可以在其完成的HTML格式中为“guest”版本提供第二个缓存。然后对于成员,在代码中进行排序并每次构建HTML。
如果您真的担心加载,并且无论如何都要向用户发送完整的数据列表,请在客户端进行排序。使用所有数据缓存json字符串,然后为成员传递包含其首选供应商权重的第二个json字符串,然后混合/排序客户端。有很多jquery库用于对表等进行排序,权重可以作为隐藏元数据包含在列中。
如果您的数据集足够大,以至于您没有立即发送所有内容,而是分页内容,那么恐怕这些都不会起作用。如果系统无法动态为成员处理构建页面的负载,那么您可能需要重新考虑您的设计。