Ciertamente, es posible modelar estos datos con Redis, pero debe pensar en términos de estructuras de datos Y rutas de acceso. Con Redis, las rutas de acceso no se administran implícitamente (como con los índices en RDBMS/MongoDB).
Para el ejemplo proporcionado, podría tener:
user:<user hash> -> hash of user properties
user:<user hash>:sent -> set of <msg hash>
user:<user hash>:received -> set of <msg hash>
message:<msg hash> -> hash of message properties
Agregar/eliminar un mensaje significaría mantener los conjuntos *:sent y *:received correspondientes a los remitentes y destinatarios, además de agregar/eliminar el objeto del mensaje en sí.
Recuperar mensajes enviados o recibidos para un usuario determinado es solo un comando SMEMBERS, o un SORT si desea recuperar también las propiedades del mensaje al mismo tiempo:
# Get a list of message hash codes only in one roundtrip
smembers user:<user hash>:received
# Get a list of message contents in one roundtrip
sort user:<user hash>:received by nosort get message:*->sender get message:*->message
Para obtener información sobre el uso de ordenar, consulte:
- Obtención de varios valores clave de Redis
- Necesita ayuda para conceptualizar en Redis/NoSQL
Nota 1: con Redis es mejor usar números enteros como claves en lugar de UUID o códigos hash (especialmente en conjuntos), ya que se almacenan de una manera más eficiente.
Nota 2: si necesita ordenar los mensajes, debe usar listas en lugar de conjuntos. La consecuencia es que solo se pueden eliminar los mensajes más antiguos y solo se pueden agregar mensajes nuevos de manera eficiente. Probablemente también agregaría una lista global para todos los mensajes.