这是Memcached中列表的可行解决方案吗?

时间:2011-07-27 21:00:21

标签: php mysql memcached innodb

基本上我们有销售人员请求通话。现在它尝试了一个“新鲜的领导”查询来获取这些。

如果没有任何新的线索,它会转到“相对较新”的查询。我们将这些“来源”称为“来源”,并且基本上更接近将通过消息来源,直到他们找到可行的领导。

这些查询都查询同一个表,只查询不同的数据组。但是,每个查询都有很多复杂的排序,在它们和表的插入/更新之间(表是InnoDB)我们经历了很多等待(没有死锁我很确定,因为它们没有在InnoDB中显示状态)所以我的猜测是我们选择缓慢,加上大量的插入/更新。

现在,最终的问题是:

我们应该查询每个源的数据库并获取大约100ish(显然根据系统而变化)并将它们缓存在memcached中。然后,当关闭器请求引导时,从缓存发送它们但更新缓存以反映“is_acccepted”标志。这样我们只会在我们用完缓存的潜在客户时调用每个来源,所以我们用完了一次,而不是每次更近请求一个潜在客户吗?

然后我们可以使用memcached模拟锁定 - http://code.google.com/p/memcached/wiki/FAQ#Emulating_locking_with_the_add_command

这看起来像是一个可行的解决方案吗?有什么建议?我们需要尽量减少锁定等待的速度。

2 个答案:

答案 0 :(得分:2)

听起来很可行,但您是否查看了索引并且是否在选择中使用了适当的隔离级别?

以前的SO问题可能有助于您寻求答案:Any way to select without causing locking in MySQL?

如果您在具有完整交易的SP中执行选择/更新,由于优化,这也可能会加快速度。当然,有时候MySQL中的SP要慢得多:(

我已将此作为评论,但尚未达到该级别:)

我确实读过有关inno-db的部分,但是在使用隔离级别时,经验表明我甚至使用了inno。

答案 1 :(得分:1)

在使用其他数据存储之前,您一定要确保数据库查询已完全优化。

如果您决定缓存此数据,请考虑使用Redis,这会使列表成为头等公民。