【问题标题】:Memcached keys: some clarification neededMemcached 键:需要一些说明
【发布时间】:2012-04-22 12:29:53
【问题描述】:

我已经阅读了很多关于 Memcached 的指南,但是,有几件事我还不清楚:

1) 我见过很多例子,看起来或多或少是这样的:

$sql = "SELECT `name` FROM `users` WHERE `id` = 1;";
$memcache->set(md5($sql), $sql, false, 60);
$memcache->get(md5($sql));

但是,由于我对 Memcache 的了解有限,我在这里看到了一个严重的缺陷:我不能使用相同的方法来存储 INSERT/UPDATE 请求的数据,因为从技术上讲,这会导致不同的哈希

作为一个解决方案,我想我可以使用这样的东西:创建一个可以执行以下操作的类/函数:

class db {
 function insert($sql, $ttl, $key) { // $key would be the name of the key I would manually generate for each query. To maintain uniqueness for each user where needed, could be user_id_keyname
  $memcache->set($key, $sql, false, $ttl);
  mysql_query($sql);
 }


function sel($sql, $ttl, $key) {
  if ($memcache->get($key)) then return $memcache->get($key);
  else {
   $memcache->set($key, $sql, false, $ttl);
   return mysql_query($sql);
  }

这可能是解决我的问题的正确方法吗?真的很想在代码上看到任何 cmets。 } }

【问题讨论】:

    标签: php get memcached set


    【解决方案1】:

    为什么要缓存INSERT/UPDATE 查询的结果?使用SELECT 查询的md5 哈希并没有错,因为您不需要任何其他信息来唯一标识结果集。您只想缓存来自SELECT 查询的结果,这样您就不必一直从数据库中检索数据。当您更新数据时,您不想丢失它,因此您必须将查询发送到数据库。

    您的示例中还有另一个问题。您实际上并没有在缓存中存储任何查询结果。您只存储无用的 SQL 查询。

    【讨论】:

    • 感谢您的回复。我想存储INSERT/UPDATE 请求的原因只是保持缓存是最新的。换句话说,无论缓存是否过期,如果 MySQL 条目已更新,缓存也会更新。我对 memcache 的工作原理知之甚少,所以到目前为止我读过的指南对我来说似乎有点太抽象了。
    • 这并不是缓存设计的真正目的:整个想法是您可以多次重复使用 SELECT 查询的输出。也就是说,缓存用于确保您的服务器不必两次运行相同的查询。但是,在您的情况下,它确实必须运行两次相同的查询,因为输出应该是新鲜的。您可以做的是使您知道受INSERT/UPDATE 查询影响的任何 memcached 密钥无效,这意味着您的站点将始终获得最新的结果。但这样做确实意味着您的网站不太适合缓存。
    • 为什么会这样?如果原始条目没有更新,它仍然会使用缓存的结果。此外,我考虑使用 Memcache 的 主要 原因是我使用 MySQL 的多语言功能(据我了解,.PO 文件将加载整个站点的字符串,而 MySQL 查询可以进行索引搜索)
    猜你喜欢
    • 2013-08-16
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    • 2021-09-28
    • 2019-05-14
    相关资源
    最近更新 更多