【问题标题】:MySQL/Python preemptive cachingMySQL/Python 抢占式缓存
【发布时间】:2012-11-09 04:17:24
【问题描述】:

我运行一个用 python 编写的 Web 应用程序,并使用 mysql 作为我们的主要数据存储。我们在 amazon RDS 上有一个包含数千万行的大表,预计它会大 10 倍。我们运行许多查询,根据主键选择几百个随机行(例如“select * from table where id IN (ids)”,其中 id 是主键)。它有时很慢,需要 30 多秒。最终我们将不得不对表进行分片,但我们一直在考虑尝试保留缓存在 memcache 中的行的副本。在运行选择查询之前,我们会发送一个 multi_get 到内存缓存。鉴于我们的工作流程(我们运行大量更新),如果我们也抢先将行的更改写入 memcache 版本,我们只会获得显着的性能提升。

我想知道是否有人使用过这样的设置,以及是否有 ORM 可以很好地处理这个问题或其他有用的工具(比如可能从 mysql 二进制日志中提取更改并将它们发送到 memcache)。最危险的部分是如果有人忘记更新或至少使他们在 mysql 上更新的 memcache 中的行无效。

谢谢!

【问题讨论】:

  • 您可能想对您的访问模式发表更多评论。 WHERE IN(...) 子句中使用的 id 是否以某种方式相关(与您获得频繁请求的相同 id 集的位置)?您通常只引用最近添加的行吗?您是否使用任何类型的复制或集群?
  • 不幸的是,WHERE 子句中的 id 集的重叠相对较少。通常,至少有一半的 id 基本上是均匀随机的,并且最近没有添加。复制是一种选择,但我们更愿意在迁移到单个数据库之前对其进行优化。我们使用亚马逊 RDS,因此不能选择集群。

标签: python mysql orm memcached


【解决方案1】:

这是 Django 中“透明”缓存的示例:https://github.com/mmalone/django-caching。 但是,我应该警告您,这种方式的缓存会变得非常复杂,非常快。

如果您有数千万行并且您的访问模式通常是按行 ID,那么您可能需要考虑使用 NoSQL 解决方案。由于您已经在 AWS 上,请考虑使用 DynamoDBSimpleDB。两者都提供快速且可扩展的键值访问。

【讨论】:

    猜你喜欢
    • 2018-09-16
    • 1970-01-01
    • 2011-11-23
    • 2013-02-22
    • 2015-03-05
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多