2009-07-29 15 views
16

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

私は保存したいと思います。

  1. ユーザーの写真のURL
  2. Aのユーザーは、アレイとして一緒に

に名前を付け、ユーザーID、誰かがあなたができた私に言った後、誰かが私に言った、あなたが をできませんでしたそれは...ですか?

答えて

22

はい。

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

非常に詳細な例については、documentationを参照してください。

+0

大感謝をしてみてください、私の場合には、ユーザーID、URL、および名前はすべて、最大5000の配列内の配列となり、ウルの要件に応じて設定変更データベースを追加ユーザーは、それは悪いですか? – JasonDavis

+4

memcacheに5Kレコードを保存する理由はありますか?私はあなたがキャッシングのポイントを見逃しているかもしれないと思う。 – doomspork

+0

それは異なります。私の単純な例を考えてみると、その配列は約500バイトかかります。 5,000を乗算すると2.5 MBになります。それはmemcachedに固執する非常に大きなオブジェクトです。 – hobodave

1

memcachedに必要なものをほとんど保存できます。

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 

がシリアル化された格納されています

氏は述べています memcache::setのドキュメントを参照してください。ところで


:-)必要に応じて

だから、そう、あなたは配列、あるいはオブジェクトを格納することができ、それはアイテムのMemcache::addMemcache::replace

+0

実際に追加して置き換えることは全く同じではありません。キーがすでに存在する場合、addはfalseを返します。 – andufo

8

最大ストレージサイズと同じですmemcacheの1,048,576バイト(1MB)ですが、配列をシリアライズするには少しのスペースが必要です。

あなたは単にとしてあなたのアレイを構築した場合:

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

キーであること、自動生成され、値がユーザーIDであること。

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

番号100000〜150000は、838917文字のシリアル化された文字列を生成します。

(これまでの質問で参照したように)50kユーザーの場合、1MBの制限を超える可能性があります。あなたがローカルキャッシュを持っている場合(APC、etc ...)、その代わりに、または何らかの理由ですべてのIDを一度に必要としない場合は、結果を分割するか、単純にDBを使用することを強く推奨します。

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

+0

私が達成しようとしているのは友人のフィードのようなものです。なぜなら、ユーザーの友達からのフィードだけにアクションを表示できるからです。私はこれを行うための最善の方法を研究しています、それはちょうど、私はそれを高速化し、mysqlからいくつかの緊張を取るmemcacheを使用することを望んでいた、このデータを取得するためにすべてのページの負荷で複数の結合を行うのではなく、今は良い方法だから、私はすべての提案をすることができます。 – JasonDavis

+0

ユーザーの友人リストとphoto_urlとユーザー名を保存できれば、2つの結合のようにユーザーテーブルから写真と名前をフェッチし、別のものを友だちテーブルからフェッチすることはできません。悪いことに、5kの友達がいるユーザーは、友だちリストをメモリに入れていても、表示する友だちのアクションを参照するためにIN(1,2,3,4)を使用する必要がありますが、もっと早くmysqlを使ってみることもできます。また、このホームページへのフィードは非常に頻繁に呼び出されます。絶えず更新されているので、友人フィードをキャッシュすることはできません。 – JasonDavis

+0

ユーザーのフレンドリストは頻繁に更新されますが、新しいユーザーを追加するときに再キャッシュできると思います。私は5kの友人は最大であるべきではありません私はアカウントを制限するだけで多くの多くのアカウントが完全な量を持っていないいくつかのユーザーが数百を持つことになります – JasonDavis

2
$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); 
} 

コードをテストした

関連する問題