Jaka jest normalna konwencja nazewnictwa dla kluczy w redis? Widziałem wartości oddzielone przez: ale nie jestem pewien, jaka jest normalna konwencja i dlaczego.
Tak, znak dwukropka :
jest konwencją przy nazywaniu kluczy. W tym samouczku na stronie redis podano: Spróbuj trzymać się schematu. Na przykład „object-type: id: field” może być dobrym pomysłem, jak w „user: 1000: password”. Lubię używać kropek w polach zawierających wiele słów, takich jak „komentarz: 1234: odpowiedź.to”.
Czy jesteś w stanie zapytać tylko o początek klucza, aby zwrócić wszystkich użytkowników?
Jeśli masz na myśli coś takiego, jak bezpośrednie zapytanie o wszystkie klucze, które zaczyna się od, user:
istnieje do tego polecenie klucze . Polecenia tego należy jednak używać wyłącznie w celu debugowania, ponieważ jest ono O (N), ponieważ przeszukuje wszystkie klucze zapisane w bazie danych.
Bardziej odpowiednie rozwiązanie dla tego problemu jest stworzenie dedykowanego klucza, nazwijmy to users
, w którym można przechowywać wszystkie klucze użytkowników, na przykład, w liście lub zadanej struktury danych.
scan
nie jest opcją @EranH., najlepszą praktyką jest iterowanie kluczy.scan
służy do stopniowego iterowania kolekcji elementów.$redis->delete($redis->keys('user:password:*'));
Używamy dwukropka (:) jako separatora przestrzeni nazw i skrótu (#) dla części identyfikacyjnych kluczy, np .:
źródło
Konwencja wydaje się być dwukropkiem (:), ale jestem programistą, więc osobiście wolę ukośnik (/) jako separator. Slash jest już tak ważnym separatorem w adresach URL, które mają być jednolitymi lokalizatorami zasobów, więc są kluczem do zasobów. Dlaczego warto stosować inne podejście do jelita grubego (:)? Czy to coś pomaga?
Rozważ ten przykład:
Mamy interfejs API RESTful dla obiektów zabawkowych. Jest jeden:
Gdzie go przechowujemy? Używamy Redis i ukośników, więc klucz jest oczywisty:
To unikalny klucz do zabawki. Klucza można teraz używać także po stronie klienta:
Użytkownik żąda obiektu z kluczem
toy/666
. Jak zdobyć od Redis? Przykład związany z Node.js:Nie trzeba konwertować ukośników na dwukropki i odwrotnie. Wygodne, nie sądzisz?
Uwaga: zawsze upewnij się, że użytkownik może uzyskać dostęp tylko do tego, co zamierzyłeś. Podane powyżej surowe podejście URL-to-key jest również w stanie pobrać
user/1/password
, jak zauważyli komentatorzy. Nie powinno to stanowić problemu, jeśli używasz Redis jako publicznej pamięci podręcznej tylko do odczytu.źródło
curl http://example.com/api/user/1/password
lub podobne. (TylkoUser#23:uploads:my/path/to/file.ext
Nie wiem, czy naprawdę istnieją jeszcze szeroko rozpowszechnione „najlepsze praktyki” dotyczące nazewnictwa kluczy Redis.
Eksperymentowałem z użyciem znaków ASCII NUL jako moich separatorów (ponieważ Redis i Python są czyste 8-bitowo). Wygląda trochę brzydko, jeśli patrzysz na surowe klucze, ale pomysł polega na tym, aby ukryć je za warstwą abstrakcji. Symbole dwukropka i potoku są oczywistymi alternatywami, pod warunkiem, że elementy przestrzeni nazw albo nie będą z nich korzystać, albo będziesz chciał zakodować każdy element w razie potrzeby. Jednakże, jeśli chcesz je kodować, to chciałbyś rozwinąć warstwę abstrakcji i unikając przeglądania surowych kluczy ... co wróciło mnie do korzystania z \ 0 w moim rozumowaniu.
Będę ciekawy, czy zostaną wyrażone jakieś inne opinie na ten temat.
źródło
Wydaje mi się, że dla twojego przypadku lepiej byłoby zastosować HSET / HGET . Istnieje również polecenie HKEYS .
Wszystkie te polecenia mają taką samą złożoność jak GET / SET / KEYS, więc dlaczego ich nie użyć?
Możesz mieć następującą strukturę:
lub:
Wystarczy wyodrębnić identyfikator użytkownika i użyć go jako klucza skrótu. Osobiście wolę to podejście, ponieważ jest przyjemniejsze, a także możesz łatwo wyszukiwać istniejące identyfikatory użytkowników.
źródło