Z pewnością modelowanie tych danych za pomocą Redis jest możliwe, ale musisz myśleć w kategoriach struktur danych ORAZ ścieżek dostępu. W przypadku Redis ścieżki dostępu nie są zarządzane niejawnie (jak w przypadku indeksów w RDBMS/MongoDB).
W podanym przykładzie możesz mieć:
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
Dodanie/usunięcie wiadomości oznaczałoby utrzymanie zestawów *:sent i *:received odpowiadających nadawcom i odbiorcom, oprócz dodawania/usuwania samego obiektu wiadomości.
Pobieranie wysłanych lub odebranych wiadomości dla danego użytkownika to tylko polecenie SMEMBERS lub SORT, jeśli chcesz jednocześnie pobrać właściwości wiadomości:
# 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
Aby zapoznać się z uzasadnieniem korzystania z sortowania, zobacz:
- Pobieranie wielu wartości klucza z Redis
- Potrzebujesz pomocy w konceptualizacji w Redis/NoSQL
Uwaga 1: z Redis lepiej jest używać liczb całkowitych jako kluczy niż UUID lub kodów skrótu (szczególnie w zestawach), ponieważ są one przechowywane w bardziej wydajny sposób.
Uwaga 2: jeśli chcesz uporządkować wiadomości, to zamiast zestawów należy używać list. Konsekwencją jest to, że tylko najstarsze wiadomości mogą być usuwane, a tylko wiadomości z grupy newset mogą być dodawane w efektywny sposób. Prawdopodobnie chciałbyś również dodać globalną listę wszystkich wiadomości.