web-dev-qa-db-ja.com

PHP配列をMemcacheに保存できますか?

配列をMemcacheに保存できますか?

保存したいのですが。

  1. ユーザーID番号
  2. ユーザーの写真のURL
  3. ユーザー名

アレイとして一緒に、誰かがあなたができると私に言った、そして誰かがあなたができないと私に言ったそれはどれですか?

18
JasonDavis

はい。

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

非常に詳細な例については、 ドキュメント を参照してください。

23
hobodave

memcache内のアイテムの最大ストレージサイズは1,048,576バイト(1MB)であり、配列のシリアル化には少しスペースが必要です。

配列を次のように単純に構造化する場合:

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

キーは自動生成され、値はユーザーIDです。

この構造を使用して1〜5000の番号が付けられた5000ユーザーのシリアル化された配列の文字列長は67792文字で、50000ユーザーは777794文字の配列を生成します。

100000〜150000の番号を付けると、838917文字のシリアル化された文字列が生成されます。

したがって、5万人のユーザー(前の質問で参照)では、1MBの制限を下回る可能性があります。ただし、ローカルキャッシュ(APCなど)がある場合は、代わりにそれを使用します。または、何らかの理由で一度にすべてのIDが必要ない場合は、結果を分割するか、単にDBを使用することを強くお勧めします。

memcachedに保存しているデータ構造についても考えてください。ルックアップする主キーのリストを提供するためだけにキャッシュを使用している場合、他のデータが必要ですか?

8
Jason
$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
vishal_g

Memcachedにはほとんど何でも保存できます。

memcache::set のドキュメントを参照してください。

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

var

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

シリアル化されて保存されます。

したがって、はい、配列、または必要に応じてオブジェクトを格納できます:-)


BTW、 Memcache::add および Memcache::replace と同じです

1
Pascal MARTIN