【问题标题】:Can you store a PHP Array in Memcache?你能在 Memcache 中存储一个 PHP 数组吗?
【发布时间】:2010-11-15 06:18:46
【问题描述】:

你能在 Memcache 中存储一个数组吗?

我想存储;

  1. 用户 ID 号
  2. 用户的照片网址
  3. 用户名

作为一个数组,有人告诉我你可以,然后有人告诉我你不能 是哪个?

【问题讨论】:

    标签: php memcached


    【解决方案1】:
    $memcache = new Memcache;
    $memcache->connect('127.0.0.1', 11211) or die ("Could not connect");
    
    $id = $_REQUEST['name'];
    $key = md5("SELECT * FROM memc where FirstName='{$id}'");
    $get_result = array();
    $get_result = $memcache->get($key);
    
    if ($get_result) {
        echo "<pre>\n";
        echo "FirstName: " . $get_result['FirstName'] . "\n";
        echo "Age: " . $get_result['Age'] . "\n";
        echo "</pre>\n";
    } else {
        $query="SELECT * FROM memc where FirstName='{$id}'";
        $result = mysql_query($query);
        $row = mysql_fetch_array($result);
        echo "<pre>\n";
        echo "FirstName: " . $row[1] . "\n";
        echo "Age: " . $row[3] . "\n";
        echo "Retrieved from the Database\n";
        echo "</pre>\n";
        $memcache->set($key, $row, MEMCACHE_COMPRESSED, 60);
        mysql_free_result($result);
    }
    

    根据您的要求添加更改数据库设置,测试代码请尝试

    【讨论】:

      【解决方案2】:

      memcache 中项目的最大存储大小为 1,048,576 字节 (1MB),序列化数组确实需要一些空间。

      如果你要像这样简单地构造你的数组:

      array(
          [0] => 1,
          [1] => 2,
          [2] => 3
      )
      

      key 是自动生成的,value 是用户 ID。

      使用此结构编号为 1-5000 的 5000 个用户的序列化数组的字符串长度为 67792 个字符,50000 个用户生成一个包含 777794 个字符的数组。

      编号 100000 到 150000 会生成一个包含 838917 个字符的序列化字符串。

      因此,如果用户数为 50k(如您之前的问题中所述),您可能会低于 1MB 的限制。如果您有本地缓存​​(APC 等),请改用它,或者如果出于任何原因不需要一次所有的 ID,我强烈建议拆分结果或仅使用 DB。

      还要考虑您存储在 memcached 中的数据结构。如果您使用缓存只是为了给您提供要查找的主键列表,您还需要其他数据吗?

      【讨论】:

      • 我想要完成的就像一个朋友提要,我需要所有用户 ID 的原因是因为我只能在提要中显示来自用户朋友的操作。我正在研究最好的方法来做到这一点,它似乎不是在每个页面加载时进行多次连接来获取这些数据,我希望使用 memcache 来加速它并减轻 mysql 的压力,我只是在研究现在是一个好方法,所以我对所有事情都持开放态度。
      • 如果我能够存储一个用户朋友列表和 photo_url 和用户名,这将消除像 2 个连接以从用户表中获取图片和名称,然后另一个到朋友表。坏事是一个有 5k 朋友的用户,即使我有朋友列表作为内存列表,我仍然必须使用 IN (1,2,3,4) 来查找要显示的朋友动作,但我认为它会比用mysql查找所有内容要快,而且用户主页上的这个提要被非常频繁地调用,我不认为我可以缓存朋友提要,因为它会不断更新。
      • 用户的好友列表经常更新,但我想我可以在他们添加新用户时重新缓存它。我不应该 5k 朋友将是最大我将限制帐户只添加许多许多许多帐户将没有全部数量一些用户将只有几百个
      • 您是否已经有一个正在使用的示例 mysql 查询?我最近遇到了类似的问题(用户活动流),发现我能够极大地优化 mysql 查询本身。
      • 您是否有更多关于您当前映射的数据库结构的详细信息?您用来查找的基表是什么?基表上的示例查询是什么样的?
      【解决方案3】:

      是的。

      Memcache::set('someKey', array(
          'user_id' => 1,
          'url' => 'http://',
          'name' => 'Dave'
      ));
      

      有关非常详细的示例,请参阅documentation

      【讨论】:

      • 非常感谢,在我的情况下,userid、url 和 name 都将是一个包含多达 5,000 个用户的数组中的数组,这很糟糕吗?
      • 你有理由在内存缓存中存储 5K 记录吗?我认为您可能错过了缓存的重点。
      • 视情况而定。鉴于我的简单示例,该数组将占用约 500 个字节。将其乘以 5,000 即为 2.5 MB。这是一个非常大的对象,要粘在 memcached 中。
      • 目前在每次页面加载时,我都必须对 mysql 进行查询,以便仅从用户朋友列表中的用户那里获取发布的博客,这是一个带有一些连接的大型查询,因为它必须返回博客主题和海报图片 url 和用户名。所以目标是缓存好友列表部分,并经常更新它。我不想缓存匹配的博客 ID 的结果,因为随着新项目的添加,这大约每隔几分钟就会改变一次。我没有太多选择
      • 用户从我的网站注销时是否可以清除缓存?
      【解决方案4】:

      你几乎可以在 memcached 中存储任何你想要的东西。

      请参阅memcache::set 的文档,其中说:

      bool Memcache::set(string $key, mixed $var [, int $flag [, int $expire ]] )
      

      变量

      The variable to store. Strings and integers are stored as is, other types
      

      被序列化存储。

      所以,是的,如果需要,您可以存储一个数组,甚至是一个对象 :-)


      顺便说一句,Memcache::addMemcache::replace 是一样的

      【讨论】:

      • 实际上添加和替换并不完全相同。如果键已经存在,则 add 返回 false。
      猜你喜欢
      • 2022-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-26
      • 1970-01-01
      • 2015-11-16
      • 2019-06-14
      相关资源
      最近更新 更多