Estoy un poco confundida con todo el disponible en el almacenamiento de opciones de Redis.
Quiero hacer algo sencillo y no quiero más de ingeniería.
Estoy trabajando con phpredis y Redis v2.8.6.

Tengo este simple array asociativo que necesito almacenar. Yo también necesita ser capaz de recuperar un elemento por su clave y lazo sobre 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 estaba usando hash tipo. el almacenamiento de mi matriz como esta:

foreach ($a as $key => $value) {
    $this->redis->hSet('posts', $key, json_encode($value));
}

Igual que yo pudiera tener acceso a la clave fácilmente como este:

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 todos los puestos que no sé cómo hacerlo y si puedo hacerlo con mi actual estructura. No sé si me necesitan para almacenar todos los post_id en otra lista para ser capaz de recorrer todos los puestos?

Así que mi pregunta es que tipo de datos(s) debo utilizar para almacenar mi lista de puestos, lo que me permite capturar un post por su id y recorrer todos los puestos?

Gracias,
Maxime

InformationsquelleAutor maxwell2022 | 2014-02-24

3 Comentarios

  1. 25

    Puede utilizar el CONJUNTO y de Hash y de clasificación 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 Todos los 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 usted no desea utilizar el tipo que usted puede utilizar Recuperar Todos los nombres de las claves de uso de SMEMBERS y, a continuación, usar Redis Tubería para recuperar todas las claves

    • Así que no hay otras soluciones que para guardar el hash de la post en un SET? ¿Cuál es la mejor de las opciones SORT o SMEMBERS si tengo millones de entradas en el SET?
    • Si usted nota para ordenar estoy usando nosort así que en realidad no va a ordenar. También, estructura Ideal de acuerdo a mi es de HASH para mantener el valor de la clave par, estoy seguro de que te vas a ir a buscar a millones de valores de una sola vez, usted obtendrá sólo unos pocos digamos 50, a continuación, puede utilizar el Límite con la especie . redis.io/comandos/SORT
    • Lo que si quiero borrar todos los hash a partir de este conjunto? Tengo un bucle a través de todos ellos para eliminarlos ?
    • Te refieres a que quieres vaciar el CONJUNTO o usted también desea eliminar el HASH?
    • Ambos de ellos. Quiero eliminar el SET y todos los HASH que contiene. Estoy usando Redis como un buffer mientras que haciendo cálculos, después de los cálculos estoy guardando el resultado en MySQL y quiero eliminar la Redis objetos almacenados que no voy a utilizar nunca más.
    • En ese caso, la Base de datos redis de 0 a 12 . Usted puede elegir una base de datos usando SELECT (por ejemplo, Seleccione 10) comando. Cargar sus datos en una base de datos y, a continuación, utilizar FLUSHDB para eliminar todas las claves de la BASE de datos. Asegúrese de utilizar FLUSHDB no FLUSHALL porque FLUSHALL va a eliminar todas las claves de bases de datos y FLUSHDB va a borrar todas las llaves de la BASE de datos SELECCIONADA.

  2. 12

    Sólo para la gente que busca el código de PHP, aquí es lo que yo he terminado de usar:

    //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 😉

    • Usted debe comprobar para igbinary: $igbinary = function_exists('igbinary_serialize'); $encoded = $igbinary ? igbinary_serialize($data) : serialize($data); debe ser ligeramente más rápido que el ordinario de serializar.
  3. 8

    En PHP puedes hacer

    $redis->set($key, json_encode($value));
    

    Luego

    $value = json_decode($redis->get($key));
    

    O utilizar cualquier serialización técnica que prefiera. JSON codificar/decodificar fue de rendimiento suficiente para mí, no importa.

    • Pero cuando usted necesita hacer esto para los miles de resultados que probablemente el uso más recursos que los necesarios. El uso de una redis-la única solución será menos probable es que usted consigue en el rendimiento de problemas.
    • Sí, abso-fuckin-lutely. Esta respuesta es un poco de un sucio hack y estoy un poco avergonzado de ella. Funcionó muy bien para lo que yo estaba haciendo en el tiempo, sin embargo.

Dejar respuesta

Please enter your comment!
Please enter your name here