【问题标题】:Does increasing numbers of keys impact performance in memcached?增加键的数量会影响 memcached 的性能吗?
【发布时间】:2015-10-29 15:55:24
【问题描述】:

我的数据库中有一个表,其中包含 40000 行。这些行的 ID 介于 1 到 40000 之间。现在我想获取 ID 的数据,例如 [1,2,800,5006,12006,25001,35000,35018] .

对于这种情况,我可以采用以下方法之一:

1.通过单个 memcached 键存储每一行​​。就像 key_1 将存储 row1 的数据一样, key_2 将存储 row2 的数据,依此类推。因此,memcached 中将有 40000 个键。对于上面给出的场景,我必须对 memcached 进行 8 次调用(每个 id 调用一次)。

2.我可以使用'in'操作符直接查询数据库。这将只需要一个查询。

我应该遵循哪种方法? memcached 中的泛洪键会影响性能吗?

【问题讨论】:

    标签: mysql database caching memcached


    【解决方案1】:

    你有两点需要考虑:

    • 单次往返的费用
    • 应用程序生成的往返次数

    使用 memcached,往返的成本非常低,而且通常非常确定(在正确的网络上大约需要半毫秒)。使用 mysql,往返的成本取决于更多因素(如查询的复杂性、最终 I/O 的延迟等......)。您应该考虑到往返 mysql 的成本比 memcached 贵。

    那么往返次数呢?使用 mysql,应用程序将只生成一个(假设您一次性获取所有行)。使用 memcached,您还可以生成单次往返,因为:

    • GET 命令可用于一次获取多个键
    • 好的 memcached 客户端无论如何都支持流水线

    如果您使用 memcached 的分布式部署(多个 memcached 实例),那么您的密钥将分布在多个节点上。同样,一个好的 memcached 客户端将并行化到各个节点的往返。由此产生的成本将是最慢的往返成本之一。

    多次获取示例(来自 telnet):

    set didier1 0 0 1
    x
    STORED
    set didier2 0 0 1
    y
    STORED
    get didier1 didier2
    VALUE didier1 0 1
    x
    VALUE didier2 0 1
    y
    END
    

    您不应该对 memcached 进行 8 次调用。您应该执行一次调用来获取 8 个密钥,或者发送一批 8 个命令来获取密钥。

    在您的示例中,我会说使用 memcached 的正确实现会稍微更有效,并且更具可扩展性。对数据库的压力越小,系统的可扩展性就越高。

    【讨论】:

    • MGET 是 telnet 命令吗?如果你能提供一些这样做的例子或一些有用的链接来做同样的事情,那就太好了。
    • MGET 只是表示多次获取。从 telnet,您可以只使用 get 命令并提供多个密钥。我删除了对 MGET 的引用,这只是令人困惑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 2010-12-05
    • 2017-01-27
    • 1970-01-01
    • 2011-07-07
    相关资源
    最近更新 更多