你能在Memcache中存储PHP数组吗?

时间:2009-07-29 22:29:35

标签: php memcached

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

我想存储;

  1. 用户ID号
  2. 用户的照片网址
  3. 用户名
  4. 作为一个阵列,有人告诉我你可以然后有人告诉我你不能 这是什么?

4 个答案:

答案 0 :(得分:23)

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

请参阅documentation了解非常详细的示例。

答案 1 :(得分: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等),请使用它,或者如果由于任何原因不一次需要所有ID,我强烈建议拆分结果或只使用数据库。

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

答案 2 :(得分: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);
}

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

答案 3 :(得分:1)

您可以在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
     

以序列化方式存储。

所以,是的,您可以存储数组,甚至可以存储对象: - )


顺便说一句,与Memcache::addMemcache::replace

相同