Det är säkert möjligt att modellera dessa data med Redis, men du måste tänka i termer av datastrukturer OCH åtkomstvägar. Med Redis hanteras inte åtkomstvägarna implicit (som med index i RDBMS/MongoDB).
För det angivna exemplet kan du ha:
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
Att lägga till/ta bort ett meddelande skulle innebära att bibehålla de *:skickade och *:mottagna uppsättningarna som motsvarar avsändare och mottagare, utöver att lägga till/ta bort själva meddelandeobjektet.
Att hämta skickade eller mottagna meddelanden för en given användare är bara ett SMEMBERS-kommando, eller en SORTERING om du samtidigt vill hämta meddelandets egenskaper:
# 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
För skälen till att använda sortering, se:
- Hämta flera nyckelvärden från Redis
- Behöver hjälp med att konceptualisera i Redis/NoSQL
Obs 1: med Redis är det bättre att använda heltal som nycklar snarare än UUID eller hashkoder (särskilt i uppsättningar), eftersom de lagras på ett mer effektivt sätt.
Obs 2: om du behöver beställa meddelandena måste listor användas istället för set. Konsekvensen är att endast äldsta meddelanden kan tas bort, och endast nyhetsmeddelanden kan läggas till på ett effektivt sätt. Du skulle förmodligen också lägga till en global lista för alla meddelanden.