Node-redis: almacenar datos json en redis

Creado en 25 ago. 2015  ·  9Comentarios  ·  Fuente: NodeRedis/node-redis

Soy muy nuevo en redis. Entonces, lo que quiero es almacenar los datos recuperados de la base de datos. Ahora, ¿tengo que usar client.set () para cada par clave-valor devuelto por la base de datos o hay alguna otra forma en que pueda guardar todos los datos con un comando? Los datos tienen la forma:
<br i="6"/> {<br i="7"/> "member_username": "nikhil567",<br i="8"/> "member_gender": "Male",<br i="9"/> "member_dob": 0,<br i="10"/> "member_country": "",<br i="11"/> }<br i="12"/>

question

Comentario más útil

@stockholmux intenté usar flat y me da un error: se excedió el tamaño máximo de la pila de llamadas.
¿tienes alguna idea sobre eso?

Todos 9 comentarios

Probablemente quieras usar un hash en Redis. Con un hash puedes usar client.hmset ( más información ) para almacenar tu objeto.

Una nota, JS Objects se pueden anidar, pero Redis Hashes son solo un nivel. Entonces, si sus datos se ven así:

{ member_name : 'johndoe', address : { street: '123 Any Street', city: 'Anytown' } }

Deberá usarlo en plano antes de guardarlo en redis. Escribí un artículo sobre ese proceso.

@stockholmux mis datos se almacenan en miembro variable. Entonces, ¿cómo lo haría?
var member={member_name:'svf',address:'cvbjnk'}
¿Puede darme la consulta de ejemplo?

La forma correcta es hash como se explicó anteriormente, y plana, como también se explicó. Aunque ese módulo de biblioteca es nuevo para mí.
Hay un atajo, que generalmente debe ser mal visto (tldr hará que sea más lento rastrear los datos analíticamente más adelante), pero tal vez sea apropiado a veces: JSON.stringifique su objeto y guárdelo en una clave normal como una cadena.

member_string = JSON.stringify member
redis_client.set 'your_key', member_string
# something like that
# if your object is already flat then you can (just):
redis_client.hmset 'hash_key', member
# something like that, been awhile

@ abhinav76 Realmente depende de cómo acceda a los datos, pero es probable que desee acceder mediante su member_name , ¿verdad? Entonces, introdúzcalo en la llave.

var member={member_name:'svf',address:'cvbjnk'};

client.hmset('members:'+member.member_name, member, function(err) { ... });

Más tarde, si quieres obtener ese hash y todos los campos, harías:

client.hgetall('members:svf', function(err,values) { ... });

Es posible que también desee buscar en algún tipo de tienda secundaria para realizar un seguimiento de todos sus member:* hashes, algo así como un conjunto o lista de redis.

gracias @kulicuu y @stockholmux .

Mis datos de redis se ven a continuación:
ahora, ¿cómo puedo actualizar cualquiera de los campos en estos datos?
@kulicuu @stockholmux

<br i="10"/> "{\"f_name\":\"\",\"profile\":{\"member_username\":\"nikhil371\",\"member_gender\":\"Male\",\"member_dob\":0,\"member_country\":\"\",\"state\":\"\",\"city\":\"\",\"hair_colour\":\"\",\"hairstyle\":\"\",\"eye_colour\":\"\",\"eyesight\":\"\",\"complexion\":\"\",\"height\":\"\",\"body_ENGINE\":\"\",\"exercise\":\"\",\"religion\":\"\",\"religious_beliefs\":\"\",\"education\":\"\",\"occupation\":\"\",\"annual_income\":\"\",\"ethnicity\":\"\",\"nationality\":\"\",\"languages\":\"\",\"diet\":\"\",\"smoke\":\"\",\"drink\":\"\",\"current_relationship_status\":\"\",\"preferred_relationship\":\"\",\"profile_tagline\":\"\",\"screened\":\"N\",\"photo_status\":\"None\",\"hidden\":\"N\",\"record_date\":0,\"update_date\":0,\"ip\":\"\",\"member_id\":10548,\"time_stamp\":0,\"photo_key\":\"\",\"profile_personality\":{\"member_username\":\"nikhil371\",\"feature\":\"xcvbnkm\",\"zodiac\":\"vbnim\",\"favorites\":\"qerrb\",\"motto\":\"cvbn\",\"irritated\":\"aguweihjok\",\"sexiest\":\"atwvyebuinmo\",\"good_evening\":\"ywsbciobnom\",\"like_to_do\":\"vdsfd371\",\"outgoing\":\"ev\",\"prefer_to\":\"ebvjnk\",\"record_date\":371,\"update_date\":372,\"profile_other_info\":{\"id\":10516,\"member_username\":\"nikhil371\",\"describe_yourself\":\"tyuh\",\"views\":371,\"admin_login\":\"\",\"screening_assigned_to\":\"\"}}}}"<br i="11"/>

@kulicuu Si usó JSON.stringify , deberá usar JSON.parse para deserializar los datos, actualizar su campo, luego deberá volver a escribirlo en la misma clave con JSON.stringify . Es un desperdicio tanto en términos de CPU como de eficiencia de espacio.

Usando hash, puede actualizar un solo campo haciendo algo como esto client.hset('my:key:name','member_gender','female') . Si usó flat para desanidar su objeto, podría actualizar un solo archivo con client.hset('my:key:name','profile_personality.member_username','asdf') .

Estoy de acuerdo en que debe estar mal visto, y gracias @stockholmux por profundizar en la discusión de por qué es así, pero vale la pena mencionarlo como un atajo.

Para el contexto, aquí hay algo que escribí hace 8 meses. Tuve que aplazar el refactor principal que habría movido la mayoría de los modelos a los scripts Lua de Redis.
https://github.com/Terebinth/britvic/blob/deprecated_version/server/models/user_iced.iced
(la variable d es el cliente de redis)
Vea también algunos de los otros modelos. @ abhinav76

@stockholmux intenté usar flat y me da un error: se excedió el tamaño máximo de la pila de llamadas.
¿tienes alguna idea sobre eso?

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

Mickael-van-der-Beek picture Mickael-van-der-Beek  ·  6Comentarios

dotSlashLu picture dotSlashLu  ·  5Comentarios

Stono picture Stono  ·  6Comentarios

betimer picture betimer  ·  5Comentarios

adamgajzlerowicz picture adamgajzlerowicz  ·  4Comentarios