2009-07-29 5 views
16

Memcache에 배열을 저장할 수 있습니까?Memcache에 PHP 배열을 저장할 수 있습니까?

저장하고 싶습니다.

  1. 사용자의 사진 URL
  2. 사용자가 배열로 함께

이름을 사용자 ID, 누군가가 당신이 수 얘기하고 누군가가 나에게 말했다 당신이 을하지 수있는 그렇지?

답변

22

예.

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

자세한 예제는 documentation을 참조하십시오.

+0

큰 감사를 시도하고 내 경우에는하시기 바랍니다 테스트 및 이름은 모두 최대 5,000의 배열 안에 배열 될 것이다 사용자, 그게 나쁜가요? – 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의 문서를 참조하십시오. BTW


:-) 필요한 경우

그래서, 그래, 당신이 배열 또는 객체를 저장할 수 있습니다, 그것은 항목의 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

내가 달성하려고하는 것은 친구 피드와 같습니다. 모든 사용자 ID가 필요한 이유는 사용자 친구가 보낸 피드에만 작업을 표시 할 수 있기 때문입니다. 나는 최선의 방법에 대한이 일을 연구하고 그냥 모든 페이지로드에 여러 개의 조인을 수행하는 대신이 데이터를 얻으려면 Memcache 사용 속도를 최대 및 mysql을 몇 가지 걸릴 바랬다, 다시 나는 단지 지금은 좋은 방법으로 모든 것에 대한 제안을 열어두고 있습니다. – JasonDavis

+0

사용자 테이블에서 사진과 이름을 가져오고 친구 테이블에서 사진을 가져 오도록 2 개의 조인을 제거 할 수있는 사용자 친구 목록과 photo_url 및 사용자 이름을 저장할 수 있었다면. 나쁜 것은 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); 
} 

것은 UR의 요구 사항에 따라 변경 데이터베이스 설정을 추가, 코드는 사용자 ID, URL을

관련 문제