query - ¿Redisar cómo almacenar matriz asociativa? ¿Establecer o hash o lista?
redis query (3)
Estoy un poco confundido con todas las opciones de almacenamiento disponibles de Redis. Quiero hacer algo simple y no quiero sobre diseñarlo. Estoy trabajando con phpredis
y Redis v2.8.6
.
Tengo esta simple matriz asociativa que necesito almacenar. También necesito poder recuperar un elemento por su clave y recorrer todos los elementos.
$a = array(
''12345'' => array(
''name'' => ''Post A'',
''val2'' => ''blah blah'',
''val3'' => ''blah blah blah'',
),
''54321'' => array(
''name'' => ''Post B'',
''val2'' => ''blah blah'',
''val3'' => ''blah blah blah'',
),
''998877'' => array(
''name'' => ''Post C'',
''val2'' => ''blah blah'',
''val3'' => ''blah blah blah'',
)
);
Así que lo que estaba haciendo hasta ahora era usar el tipo hash
. almacenando mi matriz de esta manera:
foreach ($a as $key => $value) {
$this->redis->hSet(''posts'', $key, json_encode($value));
}
Así podría acceder a la clave fácilmente así:
public function getPost($postId)
{
return json_decode($this->redis->hGet(''posts'', $postId), true);
}
// This is returning the information of Post A
$post = getPost(12345);
Pero ahora tengo que recorrer todas las publicaciones que no sé cómo hacerlo y si puedo hacerlo con mi estructura actual. ¿No sé si necesito almacenar todos los post_id
en otra lista para poder recorrer todas las publicaciones?
Entonces, mi pregunta es qué tipo de datos debo usar para almacenar mi lista de publicaciones, lo que me permite obtener una sola publicación por su ID y hacer un bucle en todas las publicaciones.
Gracias maxime
En PHP solo puedes hacer
$redis->set($key, json_encode($value));
Entonces
$value = json_decode($redis->get($key));
O use la técnica de serialización que prefiera. La codificación / decodificación JSON fue lo suficientemente buena como para que no me importara.
Puedes usar SET y Hash y SORT en combinación
redis 127.0.0.1:6379> HMSET TEST_12345 name "Post A" val2 "Blah Blah" val3 "Blah Blah Blah"
OK
redis 127.0.0.1:6379> HMSET TEST_54321 name "Post B" val2 "Blah Blah" val3 "Blah Blah Blah"
OK
redis 127.0.0.1:6379> HMSET TEST_998877 name "Post C" val2 "Blah Blah" val3 "Blah Blah Blah"
OK
redis 127.0.0.1:6379> SADD All_keys TEST_12345 TEST_54321 TEST_998877
(integer) 3
redis 127.0.0.1:6379> HGETALL TEST_12345
Para obtener un HASH:
redis 127.0.0.1:6379> HGETALL TEST_12345
1) "name"
2) "Post A"
3) "val2"
4) "Blah Blah"
5) "val3"
6) "Blah Blah Blah"
PARA OBTENER TODO HASH
redis 127.0.0.1:6379> SORT All_keys BY nosort GET *->name GET *->val2 GET *->val3
1) "Post A"
2) "Blah Blah"
3) "Blah Blah Blah"
4) "Post B"
5) "Blah Blah"
6) "Blah Blah Blah"
7) "Post C"
8) "Blah Blah"
9) "Blah Blah Blah"
Si no desea utilizar la ordenación, puede usar Fetch Todas las claves de SET usando SMEMBERS y luego usar Redis Pipeline para obtener todas las claves.
Solo para las personas que buscan el código PHP, esto es lo que acabé usando:
// Create a post hash
$key = ''post:''.$post->getId();
$this->redis->hSet($key, ''data'', serialize($post->toArray()));
// Add a post in the account posts SET
$this->redis->sAdd($account->getId().'':posts'', $post->getId());
// You can execute the above code as many time as you need
// to add an object in a SET
// Fetch the first $limit posts for this account
// SORT <account_id>:posts BY nosort GET <account_id>:post:*->data
$key = $account->getId().'':posts'';
$keys = $this->redis->sort($key, array(
''by'' => ''nosort'',
''limit'' => array($offset, $limit),
''get'' => ''post:*->data''
));
// All Good !
var_dump($keys);
Espero que esto ayude a algunos de ustedes;)