0

好的,所以我还没有深入了解使用 memcached 的细节,因为我正在集思广益/计划在我开始破解并制造一些可怕的东西之前我可能会如何使用 memcached 解决方案。

环境如下:该网站显示了来自许多不同供应商的交易列表,按交易的受欢迎程度排序(想想一个大网格)。非用户总是看到相同的网格,但用户可以选择最喜欢的供应商,以便他们最喜欢的供应商的交易总是首先出现。

现在的工作方式:如果非用户打开站点,则会发送 SQL 查询以从 table 获取所有交易信息deals,然后用于填充页面所需的 html。如果用户进入该站点,则会发送一个更高级的 SQL 查询(基本上是dealsand的左连接) userfavorites,按上述方式对交易进行排序并填充 html。

我想要做什么:显然,非用户 SQL 查询似乎非常适合 memcached,因为在deals更新表之前它总是相同的(我猜它可以同时更新 memcached 版本)。但是,由于用户的收藏夹会有很多变化,所以我想知道如何为他们提供缓存解决方案。用户看到的所有数据都和非用户完全一样,唯一不同的是顺序。对缓存中已经可用的数据执行查询对我来说似乎很荒谬。是否可以缓存dealsand userfavorites (where userid=?),然后使用 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 将允许我做我上面描述的事情。就目前而言,对网站的每一次点击都会触及数据库。感谢您花时间阅读本文,非常感谢您的任何意见。

4

1 回答 1

0

如果您有足够少的交易集,您绝对可以将它们缓存为数据而不是 HTML,这意味着没有人必须访问您的数据库。然后,您可以为其完成的 HTML 格式为“来宾”版本提供第二个缓存。然后对于成员,在代码中进行排序并每次构建 HTML。

如果您真的很关心负载,并且无论如何您要向用户发送完整的数据列表,请在客户端进行排序。缓存一个包含所有数据的 json 字符串,然后为成员传递包含其首选供应商权重的第二个 json 字符串,然后在客户端混合/排序。有很多用于排序表等的 jquery 库,并且权重可以作为隐藏的元数据包含在列上。

如果您的数据集足够大,以至于您不是一次发送所有数据,而是分页,那么恐怕这些都行不通。如果系统无法处理为成员动态构建页面的负载,那么您可能需要重新考虑您的设计。

于 2013-08-15T12:26:53.203 回答