• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • Memcached::getMulti()

    (PECL memcached >= 0.1.0)

    检索多个元素

    说明

    publicMemcached::getMulti(array $keys[,int $flags]): mixed

    Memcached::getMulti()与Memcached::get()类似,但是这个方法用来检索$keys数组指定的多个 key 对应的元素。

    Note:

    在 v3.0 之前,使用的第二个参数是&cas_tokens。它会填充进元素的 CAS token 值。在本扩展里,&cas_tokens参数在 v3.0 中已经移除。它被新的附加选项(flag)Memcached::GET_EXTENDED代替,需要在$flags值里使用。

    $flags参数可以用做指定Memcached::getMulti()的附加选项。当前,仅可以指定为Memcached::GET_PRESERVE_ORDER以保证返回的key的顺序和请求时一致。Memcached::GET_EXTENDED可以确保同时返回了 CAS token 信息。

    参数

    $keys

    要检索的key的数组。

    $flags

    Get 操作的附加选项。

    返回值

    返回检索到的元素的数组或者在失败时返回FALSE.如需要则使用Memcached::getResultCode()。

    范例

    Example #1 Memcached::getMulti()的 Memcached v3 示例

    <?php
    // 扩展版本 v3 有效
    $m = new Memcached();
    $m->addServer('localhost', 11211);
    $items = array(
        'key1' => 'value1',
        'key2' => 'value2',
        'key3' => 'value3'
    );
    $m->setMulti($items);
    $result = $m->getMulti(array('key1', 'key3', 'badkey'));
    var_dump($result);
    ?>
    

    以上例程的输出类似于:

    array(2) {
      ["key1"]=>
      string(6) "value1"
      ["key3"]=>
      string(6) "value3"
    }
    

    Example #2 Memcached::getMulti()的 Memcached v1 和 v2 示例

    <?php
    // 仅在扩展版本 v1 和 v2 中有效
    $m = new Memcached();
    $m->addServer('localhost', 11211);
    $items = array(
        'key1' => 'value1',
        'key2' => 'value2',
        'key3' => 'value3'
    );
    $m->setMulti($items);
    $result = $m->getMulti(array('key1', 'key3', 'badkey'), $cas);
    var_dump($result, $cas);
    ?>
    

    以上例程的输出类似于:

    array(2) {
      ["key1"]=>
      string(6) "value1"
      ["key3"]=>
      string(6) "value3"
    }
    array(2) {
      ["key1"]=>
      float(2360)
      ["key3"]=>
      float(2362)
    }
    

    Example #3 Memcached::GET_PRESERVE_ORDER的 Memcached v3 示例

    <?php
    //  v3 扩展有效
    $m = new Memcached();
    $m->addServer('localhost', 11211);
    $data = array(
        'foo' => 'foo-data',
        'bar' => 'bar-data',
        'baz' => 'baz-data',
        'lol' => 'lol-data',
        'kek' => 'kek-data',
    );
    $m->setMulti($data, 3600);
    $keys = array_keys($data);
    $keys[] = 'zoo';
    $got = $m->getMulti($keys, Memcached::GET_PRESERVE_ORDER);
    foreach ($got as $k => $v) {
        echo "$k $v\n";
    }
    ?>
    

    以上例程的输出类似于:

    foo foo-data
    bar bar-data
    baz baz-data
    lol lol-data
    kek kek-data
    zoo 
    

    Example #4 Memcached::GET_PRESERVE_ORDER的 Memcached v1 和 v2 示例

    <?php
    // 在扩展版本 v1 和 v2  中有效
    $m = new Memcached();
    $m->addServer('localhost', 11211);
    $data = array(
        'foo' => 'foo-data',
        'bar' => 'bar-data',
        'baz' => 'baz-data',
        'lol' => 'lol-data',
        'kek' => 'kek-data',
    );
    $m->setMulti($data, 3600);
    $null = null;
    $keys = array_keys($data);
    $keys[] = 'zoo';
    $got = $m->getMulti($keys, $null, Memcached::GET_PRESERVE_ORDER);
    foreach ($got as $k => $v) {
        echo "$k $v\n";
    }
    ?>
    

    以上例程的输出类似于:

    foo foo-data
    bar bar-data
    baz baz-data
    lol lol-data
    kek kek-data
    zoo 
    

    更新日志

    版本说明
    3.0.0移出参数&cas_tokens。添加Memcached::GET_EXTENDED,当需要获取 CAS token 信息时,传入 flag 中。

    参见

    • Memcached::getMultiByKey() 从特定服务器检索多个元素
    • Memcached::get() 检索一个元素
    • Memcached::getDelayed() 请求多个元素
    GOTCHA: Recently I was tasked with moving from PECL memcache to PECL memcached and ran into a major problem -- memcache and memcached serialize data differently, meaning that data written with one library can't necessarily be read with the other library.
    For example, If you write an object or an array with memcache, it's interpreted as an integer by memcached. If you write it with memcached, it's interpreted as a string by memcache.
    tl;dr - You can't safely switch between memcache and memcached without a either a cache flush or isolated cache environments.
    <?php
    $memcache = new Memcache;
    $memcacheD = new Memcached;
    $memcache->addServer($host);
    $memcacheD->addServers($servers);
    $checks = array(
      123,
      4542.32,
      'a string',
      true,
      array(123, 'string'),
      (object)array('key1' => 'value1'),
    );
    foreach ($checks as $i => $value) {
      print "Checking WRITE with Memcache\n";
      $key = 'cachetest' . $i;
      $memcache->set($key, $value);
      usleep(100);
      $val = $memcache->get($key);
      $valD = $memcacheD->get($key);
      if ($val !== $valD) {
        print "Not compatible!";
        var_dump(compact('val', 'valD'));
      }
      print "Checking WRITE with MemcacheD\n";
      $key = 'cachetest' . $i;
      $memcacheD->set($key, $value);
      usleep(100);
      $val = $memcache->get($key);
      $valD = $memcacheD->get($key);
      if ($val !== $valD) {
        print "Not compatible!";
        var_dump(compact('val', 'valD'));
      }
    }