memcachedにnullやbooleanなどを入れたらどうなるか、曖昧になっていたので調べた。


テストコード

(PHP5、Pecl::Memcached使用)
$m = new Memcached();
$m->addServer('localhost', 11211);

//test data
$items = array(
  'string'  => 'string',
  'integer' => 1,
  'array'   => array(
    1,
    'a' => 'A'
  ),
  'true'    => true,
  'false'   => false,
  'empty'   => '',
  'null'   => null
);
//sets
$m->setMulti($items);

//keys
$keys = array_keys($items);
//add key has no value
$keys[] = 'not_found';

//gets
$null = null;
$result = $m->getMulti($keys, $null, Memcached::GET_PRESERVE_ORDER);

//result
var_dump($result);

結果

array
  'string' => string 'string' (length=6)
  'integer' => int 1
  'array' => 
    array
      0 => int 1
      'a' => string 'A' (length=1)
  'true' => boolean true
  'false' => boolean false
  'empty' => string '' (length=0)
  'null' => null
  'not_found' => null


当然のことながら、文字列、数値、配列の各値は挿入したままの型で返される。
空要素を挿入した場合も、そのまま空要素が返される。

booleanも挿入したままの型で返されるけれども、falseをsetして、getした場合、返り値だけではfalseが返ったのかgetに失敗したのかが見分けられない(Memcached::getResultCodeで確認すればわかる)ので、現実的にはあんまりしない方がよさげ。


nullを挿入した時もnullが返されるけれども、mgetでGET_PRESERVE_ORDERが設定されている場合(要求したのと同じ順番でキーが返されることを保障される)には、値が存在しないkeyに対してもnullが返るので注意が必要。memcachedにデータがなければMySQLに取りに行く...という構造にしていて、値が存在しないなら「存在しない」という結果をキャッシュしておきたい場合、nullやfalseをセットすると判断が面倒くさい(一部の値が取得できなくてもgetResultCodeはMemcached::RES_SUCCESSを返すし)ので、空の値を入れておいて、取得に成功したかどうかは値がnullか否かで判断するのが良さそう。

※当たり前の結論ではあるんだけど、ちと混乱してたのでまとめた。



関連リンク

PHP: Memcached - Manual