2011-08-06 12 views
153

Jaka jest normalna konwencja nazewnictwa dla kluczy w trybie redys? Widziałem wartości oddzielone przez :, ale nie jestem pewien, czym jest normalna konwencja ani dlaczego.Konwencje nazewnictwa kluczowych klawiszy Redis?

Dla użytkownika zrobiłbyś coś takiego ...

user:00

jeśli identyfikator użytkownika został 00

Czy jesteś w stanie zapytać o dopiero początek klawisz, aby powrócić do wszystkich użytkowników ?

Mam przede wszystkim nadzieję, że uda mi się uniknąć przyszłych problemów, badając sposoby, w jakie pracują dla ludzi i dlaczego je wybierali.

Odpowiedz

125

Jaka jest normalna konwencja nazewnictwa dla kluczy w trybie redys? Widziałem wartości oddzielone przez: ale nie jestem pewien, co normalna konwencja jest, lub dlaczego.

Tak, znak dwukropka : jest konwencją podczas nazywania kluczy. W artykule this zamieszczono samouczek dotyczący strony redis: Staraj się trzymać 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 wielu słów, jak w "komentarz: 1234: odpowiedź.to".

Czy jesteś w stanie zapytać o zaledwie początek, aby powrócić wszystkie użytkowników?

Jeśli masz na myśli cos podobnego bezpośrednio zapytań dla wszystkich kluczy, który rozpoczyna się z user: istnieje komenda keys za to. To polecenie powinno być jednak używane tylko do celów debugowania, ponieważ jest to O(N), ponieważ przeszukuje wszystkie klucze strojone w bazie danych.

Bardziej odpowiednim rozwiązaniem tego problemu jest utworzenie dedykowanego klucza, nazwijmy go: users, który będzie przechowywać wszystkie klucze użytkowników, na przykład w strukturze danych list lub set.

+0

To nie jest konwencja, ale jest podobna do formatu URI, co czyni ją popularną wszędzie. – Gustav

+0

@Gustav spoglądając na stronę wiki w formacie URI, nie mogę zrozumieć, jak ten de facto standard jest podobny do formatu URI. Możesz wytłumaczyć? – CivFan

+0

Mówię o 'urn: example: animal: ferret: nose' na tej stronie wiki. – Gustav

5

Nie wiem, czy naprawdę istnieją powszechne "najlepsze praktyki" w zakresie nazewnictwa kluczy Redis.

Eksperymentowałem z użyciem znaków NUL ASCII jako moich separatorów (ponieważ Redis i Python są zarówno 8-bitowe czyste). Wygląda trochę brzydko, jeśli patrzysz na surowe klucze, ale chodzi o to, aby ukryć je za warstwą abstrakcji. Symbole dwukropka i potoku są oczywistymi alternatywami, o ile komponenty twojej przestrzeni nazw są albo gwarantowane, że ich nie używają, albo jeśli chcesz, kodujesz każdy komponent. Jeśli jednak chcesz je zakodować, to chcesz rozwinąć warstwę abstrakcji i unikać przeglądania surowych klawiszy, co zresztą wróciło do użycia \ 0 w moim rozumowaniu.

Będę interesować się widząc, czy są na ten temat wyrażane inne opinie.

18

Używamy dwukropka (:) jako separatora przestrzeni nazw i skrótu (#) dla id-części kluczy, np.:

logistics:building#23 
+0

Jaka jest najlepsza konwencja nazw, jeśli masz więcej kluczy, takich jak ustawienia regionalne, kategoria itp? {resource}: {key} # {value}, {key} # {value} => text: locale # pl, category # 15? Czy masz jakieś inne sugestie? – fsasvari

+1

W moim przykładzie "budowanie" jest po prostu nazwą "kolekcji", a 23 jest niestandardowym "identyfikatorem". Jeśli masz identyfikator złożony z locale = en i category = 15, to rzeczywistym identyfikatorem może być {en, 15}, więc przestrzeń nazw: teksty # {en, 15} lub bardziej szczegółowe: namespace: texts # {locale = en, category = 15}. Ale to tylko pomysł, nigdy go nie używałem w ten sposób. Uważaj, aby nie zmieniać kolejności elementów id, ponieważ klucz nie zostanie znaleziony. W rzeczywistości zamiast kodowania takiej złożoności w nazwach kluczy, należy zamiast tego używać struktur danych redis. Zajrzyj na https://redis.io/topics/indexes –

10

Konwencja wydaje się być dwukropek (:) ale jestem web developer więc ja osobiście wolę ukośnik (/) do separatora. Slash jest już tak ważnym separatorem w adresach URL, który ma być Uniform Resource Locators, czyli rodzajem kluczy dla zasobów. Dlaczego warto zastosować inne podejście z dwukropkiem (:)? Czy to pomaga cokolwiek?

Rozważmy następujący przykład:

Mamy RESTful API dla obiektów zabawki. Jest jeden:

http://example.com/api/toy/234 

Gdzie to jest przechowywane? Używamy Redis i ukośników, więc klucz jest oczywisty:

toy/234 

Jest to unikalny klucz do zabawki. Kluczem może być teraz używane również po stronie klienta:

{ 
    key: "toy/234", 
    color: "red", 
    url: function() { 
     return API_BASE_URL + this.key; 
    } 
} 

użytkownik zażąda obiektu z kluczem toy/666. Jak zdobyć go od Redisa? Przykład związany z Node.js:

redis.get(key, function reply_callback(error, toystring) { 
    var toy = JSON.parse(toystring); 
    ... 
} 

Nie trzeba konwertować ukośników na dwukropki i na odwrót. Wygodny, nie sądzisz?

+19

... wygodnie i prawie * obrzydliwie * niepewnie. Błagam o "zwinięcie http://example.com/api/user/1/hasło" lub podobne. (Po prostu mów.) – ELLIOTTCABLE

+2

Dwukropki, krzyżyki i ukośniki mogą być używane do wyznaczania różnych poziomów zagnieżdżania, np. 'User # 23: uploads: my/path/to/file.ext' – incarnate

+20

Proszę, nigdy nie używaj danych wprowadzanych przez użytkownika jako klucza do bazy danych. – Lyle