2014-02-26 4 views
1

전체 HASH를 GET과 내가 지금까지 :)은 어떻게 SET를 정렬하고 내가 레디 스에 새로 온 사람

나는 문제에 부딪 치는거야 내가 해결하는 방법을 잘 모르겠어요 그것을 사랑 해요 '라고해야합니다 더 효율적인 방법으로. 저는 SETHASH입니다. 각 HASH은 게시물을 설명합니다. 여기

생성하고 저장하는 코드이다 HASH :

// Create the HASH 
$key = 'post:'.$post->getId(); 
$this->redis->hSet($key, 'created', $post->getCreated()); 
$this->redis->hSet($key, 'author', $post->getAuthor()); 
$this->redis->hSet($key, 'message', $post->getMessage()); 

// Store the HASH in the SET 
$this->redis->sAdd('posts', $post->getId()); 

이제, 이전에 내가 HASHdata 필드에있는 모든 게시물의 속성을 저장했다 (json_encoded)와이 같은 정보를 가져 오는했다 :

$key = 'posts'; 
$data = $this->redis->sort($key, array(
    'by' => 'nosort', 
    'limit' => array($offset, $limit), 
    'get' => 'post:*->data ' 
)); 

if (!is_array($data)) { 
    return array(); 
} 

foreach ($data as &$post) { 
    $post = json_decode($post, true); 
} 

그것은 좋은 일하고, 나는 모든 게시물 정보 :

했다 하지만 Redis (동시 업데이트)에서 게시물을 업데이트 할 때 충돌이 있었기 때문에 모든 게시물의 속성을 fields (HASH)으로 구분하여 충돌 문제를 해결했습니다.

이제 문제는 내 SET에서 HASH을 가져 오는 것입니다.

$key = 'posts'; 
$data = $this->redis->sort($key, array(
    'by' => 'nosort', 
    'limit' => array($offset, $limit), 
    'get' => array('post:*->created', 'post:*->author', 'post:*->message') 
)); 

을 또는 SET에서 직접 전체 HASH를 가져올 수있는 또 다른 방법이있다 :이 같은 모든 단일 필드를 지정해야합니까?


UPDATE

막심

,

이 나는 ​​약 pipeline를 들었지만 나는 내가 위해 내가 phpredis

환호와 함께 사용할 수 있는지 찾고 있어요 무엇 확실하지 않다 나는 내가 분명히 자신을 설명했는지 확신 할 수 없다. 한 세트에 몇 가지 요소가 있습니다 (post_id). SET의 처음 10 개의 게시물을 가져오고 싶습니다. 즉 post 개체를 만들기 위해 10hash (모든 필드와 값을 사용)을 원합니다.

해시 (data)의 한 필드에 이전에 모든 개체 정보를 저장했지만 개체의 특성 당 하나의 필드가 있습니다.

전에 지금

myHash:<id> data

:

myHash:<id> id "1234" created "2010-01-01" author "John"

내가 같이, 상위 10 게시물 가져 오기 (쉽게 페이지를 매기)에 SORT를 사용되기 전에 :

$key = 'posts'; 
$data = $this->redis->sort($key, array(
    'by' => 'nosort', 
    'limit' => array(0, 10), 
    'get' => 'post:*->data ' 
)); 

이제 해시에 X 멤버가 생겼습니다. 무엇이 가장 좋은 솔루션인지 궁금합니다.

$key = 'posts'; 
$data = $this->redis->sort($key, array(
    'by' => 'nosort', 
    'limit' => array($offset, $limit), 
    'get' => 'post:*->data ' 
)); 

아니면 :

$key = 'posts'; 
$data = $this->redis->sort($key, array(
    'by' => 'nosort', 
    'limit' => array($offset, $limit), 
    'get' => '#' 
)); 

foreach($data as $post_id) { 
    $posts[] = $this->redis->hGetAll('post:'.$post_id); 
} 

또는 마지막 :

는인가

$key = 'posts'; 
$data = $this->redis->sort($key, array(
    'by' => 'nosort', 
    'limit' => array($offset, $limit), 
    'get' => '#' 
)); 

$pipeline = $this->redis->multi(); 
foreach ($data as $post_id) { 
    $pipeline->hGetAll('post:'.$post_id); 
} 

return $pipeline->exec(); 

아니면 내가 아직 모르는 뭔가? 가장 빠르고 가장 빠른 방법은 무엇입니까?

+0

각 해시 키의 'X 멤버'는 일정합니까? 그냥 'id', 'created', 'author'입니까? – yinqiwen

+0

네,하지만 3 개 이상의 필드가 있습니다. 10 개가 있습니다. – maxwell2022

+0

음, 정렬 명령에 10 '패턴 가져 오기'를 쓸 수 있습니다. 제한이 없습니다. 이것은 가장 빠른 방법입니다. – yinqiwen

답변

-1

hashes에서 redis.io 문서로 시작하면 여러 개의 해시 구성원을 얻을 수있는 명령이 있다는 것을 알게 될 것입니다. 특히 모든 필드와 값을 가져 오는 데 "HGETALL"을 지정하거나 값이있는 필드 집합을 가져 오는 데 "HMGET"을 지정합니다. 당신은 레디 스의 소스를 읽었다면

은 또한 그들을 설정하는 나는, " HMSET"

+0

해시가 아니라 세트에서 해보고 싶습니다. 나는'hashgetall'을 알고 있지만 이것은 내가 찾고있는 것이 아니다. – maxwell2022

0

로 한 번에 그들을 설정하는 것이 좋습니다 당신은 할 수없는 찾을 수 있습니다. 단일 redis 호출에서 lua 스크립트를 사용하여 'sort'및 'hgetall'명령을 결합하는 해결 방법이 있습니다.

'패턴 가져 오기'는 'lookupKeyByPattern'함수에 의해 처리됩니다. https://github.com/antirez/redis/blob/unstable/src/sort.c#L61

관련 문제