Bazy klucz-wartość. Redis - Instytut Informatyki Teoretycznej i

Transkrypt

Bazy klucz-wartość. Redis - Instytut Informatyki Teoretycznej i
Bazy klucz-wartość. Redis
Bazy klucz-wartość. Redis
Technologie Zarządzania Treścią
dr inż. Robert Perliński
[email protected]
Politechnika Częstochowska
Instytut Informatyki Teoretycznej i Stosowanej
21 października 2016
1/60
Plan prezentacji
1
Bazy klucz-wartość
2
Kilka słów o Redis
3
Polecenia w Redis
4
Redis w Node.js
5
Źródła
Bazy klucz-wartość. Redis
2/60
Bazy klucz-wartość
Bazy klucz-wartość:
najprostsze z baz NoSQL,
przechowujemy dane (wartości) z identyfikatorami nazywanymi
kluczami,
jest to bardziej rozbudowany wariant tablicy (rozluźnione ograniczenia
tablicy i trwały zapis jej danych),
używane kiedy łatwość zapisu i pobierania danych jest ważniejsza od
skomplikowanej struktury danych,
wymagana jest unikalnośc każdego klucza w ramach przestrzeni nazw
(kubełek, baza danych, kolekcja),
trzy zalety: prostota, szybkość działania, skalowalność.
Bazy klucz-wartość. Redis
3/60
Od tablic do baz klucz-wartość
Od tablic do baz klucz-wartość
tablica - uporządkowana lista wartości, każda wartość jest pod określonym
indeksem (liczbą całkowitą),
wszystkie dane są tego samego typu,
tablica asocjacyjna - podobna do zwykłych tablic ale indeksowana nie tylko
liczbami całkowitymi, przechowuje wartości różnego typu, indeksem
(kluczem) może być wiele typów danych,
pamięć podręczna - tablica asocjacyjna wykorzystywana
do szybkiego dostępu do danych
(ale bez trwałego zapisywania ich),
baza klucz-wartość - wydajność pamięci podręcznej
z trwałym zapisem danych na nośniku.
Bazy klucz-wartość. Redis
4/60
Funkcjonalności baz klucz-wartość
Prostota:
wykorzystywanie minimalnych struktur danych - dodatkowe
funkcjonalności mogą być po prostu niepotrzebne,
zawsze można do bazy dodać nowe atrybuty,
prosty model danych - prosta manipulacja na danych,
zazwyczaj nie ma kontroli typów - ten sam atrybut może
przechowywać np. liczby i napisy,
proste struktury danych szybko działają.
Bazy klucz-wartość. Redis
5/60
Funkcjonalności baz klucz-wartość
Szybkość:
oferują wysoką przepustowość dla intensywnych operacji na danych,
często przechowują dane w pamięci operacyjnej - bardzo szybki
odczyt i zapis,
większa ilość danych niż wielkość RAM oznacza konieczność
zarządzania danymi w pamięci:
kompresja,
algorytmy zwalniania pamięci, np. LRU (ang. least recently used),
przykład: porzucony koszyk sklepowy.
Skalowalność:
dodawanie lub usuwanie serwerów z klastra, które jak najmniej
zaburza jego działanie,
różne rodzaje replikacji: master-slave albo bez serwera głównego.
Bazy klucz-wartość. Redis
6/60
Klucze
Wykorzystanie kluczy: indeksowanie, identyfikowanie, inne sposoby odnajdowania
wartości. Muszą być unikatowe w ramach przestrzeni nazw. Mogą być bardzo
proste ale nie muszą...
Konstruowanie kluczy
raz utworzony klucz nie powinien się zmieniać,
klucz KOWALSKI J SL dla Jana Kowalskiego mieszkającego w woj. śląskiem
nie jest dobrym pomysłem,
w bazach relacyjnych, w tabelach klucze są nieznaczące,
w bazach NoSQL klucz jest jedynym sposobem dotarcia do wartości,
wykorzystuje się tworzenie znaczących kluczy, które przechowują informację
o atrybutach, np. klient:12345:nazwisko,
wzór na tworzenie klucza:
nazwa encji + ’:’ + identyfikator encji + ’:’ + atrybut encji,
znak rozdzielający może być dowolny.
Bazy klucz-wartość. Redis
7/60
Jak działają klucze
Wykorzystywane są funkcje mapujące liczby całkowite, ciągi znaków
czy nawet listy obiektów na unikatowy ciąg znaków lub liczbę. Służą
do tego funkcje haszujące.
Nie wszystkie bazy klucz-wartość jako klucz wspierają listy i inne
rozbudowane struktury.
Niektóre są bardziej restrykcyjne.
Funkcje haszujące mogą czasem powodować kolizje ale generalnie są
wystarczające.
Klucz
klient:12345:imie
klient:12345:nazwisko
klient:12345:email
klient:12345:adres
Bazy klucz-wartość. Redis
Hasz
a8e4ce250861d79199025b5918620da8fa8a8b9b
a2ccff512db1593b94f96c65bece8c846f862236
fb6b99c8a3bad6a13e9c5e79219f4f2c73e34165
ce605bbaf97de5de5ea19355fa6340dd14b25777
8/60
Unikanie problemów z zapisem
Hasz może określać na którym serwerze w klastrze trzeba zapisać
wartość związaną z kluczem.
Przy kontroli zapisu tych samych danych na różnych serwerach w
klastrze można ułożyć klucze tak, żeby zawsze ten sam klucz był
zapisywany na tym samym serwerze.
W ten sposób nie będzie kolizji, np. bilety z miejscem na różnych
imprezach w określonym dniu,
miejsce 12 rząd 5 w Multikino Częstochowa sala 6 22.10.2016:
M12:R5:Multi:Czest:161022).
Klucze są mapowane do serwerów za pomocą modulo, albo jakoś inaczej ale ten sam klucz jest zawsze zapisywany na tym samym serwerze.
Bazy klucz-wartość. Redis
9/60
Wartości w bazie klucz-wartość
Bazy klucz-wartość:
nie wymagają definiowania typów przechowywanych wartości,
opierają wszystkie wykonywane operacje na kluczach,
za pomocą klucza wstawiamy, pobieramy i usuwamy wartości,
wyszukiwanie danych po zawartości należy obsłużyć w aplikacji,
niektóre zawierają mechanizm indeksowania wartości i wyszukiwania
w nich.
Bazy klucz-wartość. Redis
10/60
Redis
Co to jest Redis?
Redis (skrót od REmote DIctionary Server ) jest:
serwerem struktur danych (struktury danych),
jest projektem open-source(na licenscji BSD),
jest rozproszony (ang. networked),
przechowuje dane w pamięci operacyjnej (ang. in memory ),
przechowuje klucze z opcjonalną trwałością (ang. durability ),
jest najpopularniejszą bazą danych klucz-wartość (zgodnie z rankingami na
DB-Engines.com).
pierwsze wydanie miało miejsce 10 kwietnia 2009 roku.
Bazy klucz-wartość. Redis
11/60
Redis - informacje ogólne
Redis:
jest systemem do przechowywania struktur danych w pamięci operacyjnej,
jest używany jako baza danych, pamięć buforująca albo jako
pośrednik/asystent przekazywania komunikatów (and. message broker ),
ma wbudowanie powielanie danych (replikację),
wspiera skrypty w Lua,
wspiera usuwanie najmniej używanych starych danych (LRU eviction - least
recently used),
ma wbudowane transakcje,
ma wbudowane różne poziomy utrwalania danych na dysku,
dostarcza wysoki poziom dostępności dzięki Redis Sentinel,
udostępnia automatyczne partycjonowanie dzięki Redis Cluster.
Bazy klucz-wartość. Redis
12/60
Redis - wspierane struktury danych
Redis wspiera różne struktury danych (nie tylko string) takie jak:
napisy (string) - jeden prosty element, rozpoznawane są liczby całkowite i
zmiennopozycyjne,
bitmapy - działają na napisach ale są specjalne operacje binarne,
listy - kolekcja elementów, mogą się powtarzać, kolejność jest ważna,
zbiory - kolekcja elementów, nie powtarzają się, nie ma kolejności,
zbiory posortowane - kolekcja elementów, nie powtarzają się, każdy
element ma przypisaną liczbę zmiennopozycyjną - punktacja, o kolejności
elementów decyduje punktacja,
tabice haszowane - klucz zawiera zbiór pól z przypisanymi wartościami,
dane hyperloglogs - używane do przybliżania liczności zbiorów,
dane geoprzestrzenne - operacje na danych przestrzennych Ziemi.
Typ danych definiuje jakie operacje są dostępne dla tych danych.
Bazy klucz-wartość. Redis
13/60
Redis - informacje ogólne
Redis:
jest napisany w ANSI C,
działa na większości systemów POSIX takich jak Linux, *BSD czy OS
X bez zależności zewnętrznych,
jest projektowany na systemach Linux i OS X i tam jest testowany,
jest rekomendowany do wdrażania na Linuxie,
może działać na systemach z rodziny Solaris, np. SmartOS ale może
wymagać dużego zaangażowania fachowej pomocy,
nie ma oficjalnego wsparcia dla Windows, ale Microsoft tworzy i
utrzymuje port do Redis (Win-64).
Bazy klucz-wartość. Redis
14/60
Redis - operacje na typach danych
Redis wspiera wysokopoziomowe operacje atomowe po stronie serwera.
Przykłady takich operacji:
dopisanie danych do napisu,
dodanie elementu do listy,
zwiększenie wartości w tablicy haszowanej,
obliczenie przecięcia, sumy czy różnicy zbiorów,
uzyskanie elementu z najwyższym rankingiem ze zbioru
posortowanego.
Bazy klucz-wartość. Redis
15/60
Redis - działanie
Redis działa na danych w pamięci operacyjnej.
Zależnie od zastosowania, można utrwalić dane:
poprzez zrzucenie obrazu danych na dysk co jakiś określony czas,
poprzez dodawanie każdej komendy do dziennika (log).
Utrwalanie danych na dysku można wyłączyć, jeśli jest potrzebne bogate w
funkcjonalność, dostępne poprzez sieć buforowanie danych.
Redis wspiera banalne w przeprowadzeniu asynchroniczne replikacje danych
master-slave:
z bardzo szybką nieblokującą pierwszą synchronizacją,
automatycznym ponownym połączeniem przy częściowej ponownej
synchronizacji po przerwaniu sieci.
Bazy klucz-wartość. Redis
16/60
Inne cechy Redis
Inne cechy Redis:
automatyczna obsługa pracy awaryjnej (serwer podrzędny staje się
nadrzędnym),
klucze z ograniczonym czasem życia,
transakcje (atomowość i izolacyjność),
MULTI - rozpoczyna blok poleceń będących transakcją,
EXEC - wykonuje wszystkie zapisane w kolejce transakcji polecenia,
połączenie wraca do normalnego stanu, kiedy użyto WATCH, EXEC
zadziała tylko kiedy podane klucze nie zostały zmienione,
DISCARD - czyści kolejkę instrukcji zapisanych w transakcji, połączenie
wraca do normalnego stanu,
WATCH key [key ...] - oznacza podane klucze do kontroli przy
warunkowym wykonaniu transakcji,
UNWATCH - usuwa wszystkie oznaczenia kluczy określone w WATCH.
Bazy klucz-wartość. Redis
17/60
Trwałość danych I
Redis przechowuje dane w pamięci operacyjnej w sposób charakterystyczny
dla siebie.
Uniemożliwia to przechowywanie (przynajmniej narazie) danych większych
niż zawartość pamięci operacyjnej (RAM).
Do wersji 2.4 można było pewne dane przechowywać na dysku ale obecnie
jest to porzucone i odradzane.
Trwałość danych osiąga się obecnie na dwa sposoby:
poprzez robienie migawek (ang. snapshot),
bezpieczniejsza alternatywa - AOF (Append-only file).
Domyślnie Redis zapisuje dane na dysku co 2 sekundy (są opcje do zmiany tego).
W przypadku awarii utraconych może być tylko kilka sekund zmian danych.
Bazy klucz-wartość. Redis
18/60
Trwałość danych II
Robienie migawek (ang. snapshot):
czyli asynchronicznych zapisów stanu bazy na dysku wykonywanych co jakiś
określony czas,
zapisywane daną są składowane w formacie RDB Dumb Format (*.rdb) binarna reprezentacja zawartości pamięci na dysku,
wystarcza to do odtworzenia stanu bazy,
AOF (Append-only file):
bezpieczniejsza alternatywa dostępna od wersji 1.1
jest to dziennik (ang. journal), który zapisuje wszystkie zmiany wykonywane
w bazie,
pozwala wrócić do jakiegokolwiek wcześniejszego stanu,
Redis potrafi poprawiać/przepisywać na nowo AOF w tle w celu uniknięcia
nieskończonego zwiększania się dziennika.
Bazy klucz-wartość. Redis
19/60
Powielanie danych I
Redis wspiera replikację master-slave:
dane z jakiegokolwiek serwera Redis mogą być powielane do dowolnej
liczby serverów podporządkowanych,
serwer B podporządkowany serwerowi A, sam może być nadrzędnym
dla kolejnego serwera C,
pozwala to na utworzenie drzewa replikacji o jednym korzeniu.
Serwery podporządkowane Redis:
mogą być skonfigurowane tak, że będą przyjmować zapis danych
pozwalając na umyślną czy nieumyślną (zaplanowaną lub nie)
niespójność danych między instancjami serwerów.
Bazy klucz-wartość. Redis
20/60
Powielanie danych II
Redis:
ma w pełni zaimplementowany wzorzec przesyłania wiadomości
(Publish/Subscribe),
klient serwera podrzędnego może pobierać wiadomści wysyłane do
serwera nadrzędnego gdziekolwiek w drzewie replikacji.
Powielanie danych jest przydatne w skalowaniu odczytu danych
(ale już nie zapisu) albo przy nadmiarowości danych.
Bazy klucz-wartość. Redis
21/60
Wydajność
Kiedy trwałość danych nie jest konieczna, baza Redis, jako
przechowująca dane w pamięci operacyjnej, jest wyjątkowo wydajna w
porównaniu z systemami baz danych, które zapisują każdą zmianę na
dysku zanim uznają transakcje za zatwierdzoną.
Nie ma jakiejś znacznej różnicy między czasem odczytu i zapisu.
Redis działa na jednym procesie i jest jednowątkowy - jedna instancja
bazy Redis nie może wykorzystać równolegle wykonujących się zadań.
Bazy klucz-wartość. Redis
22/60
Działanie w klastrze
Redis pracujący na klastrze:
jest przystosowany do działania w klastrze,
jest to funkcjonalność rozwijana od niedawna, od roku 2013,
http://redis.io/topics/cluster-speccluster-specification
Bazy klucz-wartość. Redis
23/60
Działanie w klastrze
Działanie w klastrze:
pozwala na automatyczny podział przestrzeni kluczy,
prowadzone na bierząco, na gorąco dzielenie danych na cześci.
Planowane jest wsparcie dla więcej niż 1000 węzłów, tolerancja na uszkodzenia z
leżącym w centrum mechanizmem:
wykrywania uszkodzeń/błędów,
wewnętrznym wersjonowaniem zapobiegającym konfliktom,
wyborem serwera podrzędnego,
promowaniem do bycia serwerem nadrzędnym,
komunikacją poprzez mechanizm publish/subscribe pomiędzy wszystkimi
węzłami klastra.
Bazy klucz-wartość. Redis
24/60
Współpraca z różnymi językami programowania
Redis współpracuje w bardzo wieloma językami programowania, większość
z nich pozwala na połączenie się z Redis za pomocą więcej niż jednej,
ciągle rozwijanej biblioteki:
ActionScript
Common Lisp
emacs lisp
Haskell
Lua
OCaml
R
Scheme
Bash
Crystal
Erlang
Haxe
Matlab
Pascal
Racket
Smalltalk
C
D
Fancy
Io
mruby
Perl
Rebol
Swift
C#
Dart
gawk
Java
Nim
PHP
Ruby
Tcl
C++
Delphi
GNU Prolog
Julia
Node.js
Pure Data
Rust
VB
Clojure
Elixir
Go
Lasso
Objective-C
Python
Scala
VCL
Dostępna jest również długa lista bibliotek, które nie są bibliotekami
zbudowanymi na bazie API Redisa, ale są bibliotekami wysokiego poziomu,
jak ORM, czy biblioteki przesyłające komunikaty, które są zaprojektowane
dla Redis.
Bazy klucz-wartość. Redis
25/60
Instalacja i uruchomienie
Instalacja:
pobieramy najnowszą wersję ze strony producenta:
http://redis.io/download
rozpakowujemy, przechodzimy do utworzonego katalogu (redis-3.2.3),
make,
make test - po utworzeniu warto zrobić testy,
make install - jeśli mamy prawa roota.
Używanie:
redis-server - uruchamianie serwera,
redis-benchmark - wbudowany test wydajności
(ponad 100000 zapytań na sek.; wszystkie zapytania poniżej 2 ms),
redis-cli - tryb poleceń do zabawy z Redis,
redis-check-rdb - sprawdzanie obrazów binarnych bazy.
Włączanie/wyłączanie serwera Redis:
/etc/init.d/redis-server start|stop|restart
Bazy klucz-wartość. Redis
26/60
Ustawienie serwera
W domyślnej instalacji ustawienia serwera są w pliku /etc/redis/redis.conf.
Można określić takie zakresy działania serwera jak:
ogólne opcje serwera, np. ustawienie połączenia (adres IP i port), plik logów,
dopuszczalna liczba baz danych,
sposób wykonywania zapsiów bazy z pamięci na dysk (nazwa pliku,
położenie, czestotliwość zapisu),
zasady wykonywania replikacji,
bezpieczeństwo dostępu (ustawienie hasła),
określenie limitów (np. maksymalna liczba jednoczesnych połączeń czy
wykorzystywanej pamięci),
użycie skryptów LUA,
obsługa klastrów,
obsługa zdarzeń,
inne zaawansowane ustawienia dotyczące np. sposobu generowania kluczy
(haszowania) czy wymaganej szybkości odczytu danych z serwera.
Bazy klucz-wartość. Redis
27/60
Nauka Redis online - tutorial
Bazy klucz-wartość. Redis
http://try.redis.io/
28/60
Struktury danych w Redis
Bazy klucz-wartość przechowują konkretną wartość pod wskazanym kluczem.
Umieszczoną daną można odczytać tylko jeśli zna się dokładnie klucz.
Polecenie SET umieszcza dane w bazie, GET odczytuje dane dla podanego klucza:
> set user:email "[email protected]"
OK
> get user:email
"[email protected]"
Do usuwania kluczy i związanych z nimi wartościami służy DEL:
> DEL user:email
(integer) 1
> get user:email
(nil)
Bazy klucz-wartość. Redis
29/60
Struktury danych w Redis
SETNX (SET-if-Not-eXists) wstawia dane jeśli wcześniej ich nie było w bazie.
INCR zwiększa o jeden wartość liczby umieszczonej pod podanym kluczem. Jest
to operacja atomowa. Może tworzyć też zmienną.
> setnx liczba 12
(integer) 1
> incr liczba
(integer) 13
> get liczba
"13"
> SETNX liczba 123
(integer) 0
> get liczba
"13"
> incr licznik
(integer) 1
> get licznik
"1"
Bazy klucz-wartość. Redis
30/60
Struktury danych w Redis
W Redis dane przechowywane w bazie mogą mieć określoną ważność czasową, po
której upływie automatycznie są usuwane. EXPIRE ustawia czas ważności
zmiennej. TTL (Time To Live) pozwala odczytać pozostały czas.
> SET zmienna "Brak danych"
OK
> EXPIRE zmienna 30
(integer) 1
> TTL zmienna
(integer) 24
> GET zmienna
"Brak danych"
...
> GET zmienna
(nil)
> TTL zmienna
(integer) -2
PTTL zwraca pozostały czas życia zmiennej w milisekundach.
Bazy klucz-wartość. Redis
31/60
Polecenie SET z opcjami
SET key value [EX seconds] [PX milliseconds] [NX|XX]
Parametry:
EX - ustala czas życia zmiennej w sekundach
PX - ustala czas życia zmiennej w milisekundach
NX - ustawia zmienną tylko, jeśli jeszcze nie istnieje
XX - ustawia zmienną tylko, już istnieje
> SET zmienna "Na 20 sekund" EX 20 XX
(nil)
> SET zmienna "Na 20 sekund" EX 20 NX
OK
> get zmienna
"Na 20 sekund"
> ttl zmienna
(integer) 10
127.0.0.1:6379> ttl zmienna
(integer) -2
> get zmienna
(nil)
Bazy klucz-wartość. Redis
32/60
Polecenia
W najnowszej wersji Redis 3.2 jest 197 poleceń podzielonych na 14 grup:
Cluster - zarządzanie klastrem
Connection - odpowiadają za połączenie z serwerem,
Geo
Hashes
HyperLogLog
Keys - obsługa kluczy
Lists - obsługa list
Pub/Sub
Scripting
Server - obsługa klientów, danych w pamięci, dostępne polecenia,
Sets - obsługa zbiorów
Sorted Sets - obsługa posortowanych zbiorów
Strings - obsługa wartości prostych, operacje na napisach, operacje bitowe
Transactions - obsługa transakcji
Bazy klucz-wartość. Redis
33/60
Polecenia - help
W redis-cli polecenie help pozwala na uzyskanie informacji o
poleceniach (indywidualnie albo w grupach), np.:
$ help BGSAVE
BGSAVE summary: Asynchronously save the dataset to disk
since: 1.0.0
group: server
$ help @connection
AUTH password
summary: Authenticate to the server
since: 1.0.0
ECHO message
summary: Echo the given string
since: 1.0.0
...
Bazy klucz-wartość. Redis
34/60
Polecenia z grupy Keys I
DEL key [key ...] - usuwa jeden/wiele kluczy, zwraca liczbę usuniętych
kluczy, klucze nieistniejące zostaną pominięte,
EXISTS key [key ...] - sprawdza istnienie kluczy, zwraca liczbę klucz
istniejących w bazie z tych podanych na liście, podanie dwa razy tego
samego klucza dwukrotnie go policzy,
EXPIRE key seconds - ustawia czas ważności klucza w sekundach, po
upływie którego będzie on usunięty (klucz ulotny, niestabilny),
KEYS pattern - zwraca wszystkie klucze pasujące do wzorca, powinien być
używany tylko w środowisku produkcyjnym, może znacznie obniżyć
wydajność, powinno się używać SCAN albo sets; wzorce:
h?llo dopasowuje np. hello, hallo czy hxllo
h*llo dopasowuje np. hllo czy heeeello
h[ae]llo dopasowuje np. hello i hallo, ale nie hillo
h[^e]llo dopasowuje np. hallo, hbllo, ... ale nie hello
h[a-b]llo dopasowuje hallo i hbllo
Bazy klucz-wartość. Redis
35/60
Polecenia z grupy Keys II
MOVE key db - przenosi klucz z aktualnie wybranej bazy do bazy bazy
określonej drugim parametrem,
PERSIST key - usuwa ograniczenie czasowe dla podanego klucza, zmiena go
z ulotnego na stały,
RANDOMKEY - zwraca losowy klucz z bazy, dla pustej bazy zwraca nil,
RENAME key newkey - zmiena nazwę klucza na nową, jeśli klucz nie istnieje
zwraca błąd, jeśi nowa nazwa już istnieje to wartość pod tym kluczem
zostanie usunięta (wywołanie DEL),
SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET
pattern ...]] [ASC|DESC] [ALPHA] [STORE destination] - zwraca
albo pobiera elementy w listach, zbiorach i zbiorach posortowanych przy
podanym kluczu sortowania,
TTL key - zwraca liczbę sekund, jaką klucz pozostanie jeszcze w bazie
danych, zob. PTTL
TYPE key - zwraca nazwę typu jakiego jest wartość pod danym kluczem,
możliwe typy: string, list, set, zset, hash i none (jeśli klucz nie istnieje).
Bazy klucz-wartość. Redis
36/60
Polecenia z grupy Keys III
SCAN, SSCAN, HSCAN, ZSCAN - polecenia pozwalają na iteracyjne przejście po
kolekcji elementów:
SCAN - iteruje po kolekcji kluczy w aktywnej bazie danych,
SSCAN key cursor [MATCH pattern] [COUNT count] - przechodzi
po kolekcji elementów zbioru,
HSCAN key cursor [MATCH pattern] [COUNT count] - przechodzi
po kolekcji elementów tablicy asocjacyjnej,
ZSCAN key cursor [MATCH pattern] [COUNT count] - przechodzi
po kolekcji elementów posortowanego zbioru.
Polecenia nie muszą w jednym przebiegu zwracać wszystkich wartości
kolekcji, zwykle zwracają tylko małą cześć całej kolekcji (nie blokują bazy
jak KEYS czy SMEMBERS).
Zwracana wartość oznacza aktualną pozycję kursora, od której zaczynamy
przeszukiwanie następnym razem, np.:
scan 0
scan 12
Bazy klucz-wartość. Redis
// zwraca np. wartość 12 i 12 pierwszych elementów
// zwraca 0 i pozostałe klucze w bazie
37/60
Polecenia z grupy Strings I
APPEND key value - pozwala na dopisanie do klucza podanej wartości
(string), jeśli klucz nie istniej zostanie utworzony,
GETRANGE key start end - zwraca część łańcucha spod podanego klucza
z od położenia start do end (przesunięcie początkowe i końcowe),
SETRANGE key offset value - nadpisuje wartość podanego klucza
podaną wartością zaczynając od podanego przesunięcia,
STRLEN key - zwraca długość napisu podanego klucza, musi być prosta
(string),
GET key - zwraca watość klucza, działa tylko dla prostych danych
napisowych, nie działa dla list, zbiorów,
GETSET key value - zwraca starą wartość umieszczoną pod podanym
kluczem zastępując ją jednocześnie nową podaną wartością, operacja
atomowa,
Bazy klucz-wartość. Redis
38/60
Polecenia z grupy Strings II
INCR key - zwiększa wartość przechowywaną w podanym kluczu o 1, j.w.,
liczby całkowite są przechowywane w kluczach są zapisane z podstawą
dziesiętną, ale przechowywane są w bazie jako liczby całkowite,
DECR key - zmniejsza wartość przechowywaną w podanym kluczu o 1, musi
być prosta (string) i musi być reprezentacją liczby całkowitej,
INCRBY key increment, DECRBY key decrement, zwiększa, zmniejsza
warość przechowywaną pod podanym kluczem o podany parametr
increment,
INCRBYFLOAT key increment - zwiększa wartość umieszczoną pod
podanym kluczem, wartość musi być reprezentacją liczby zmiennopozycyjnej,
MGET key [key ...] - zwraca wartości wszystkich podanych kluczy,
MSET key value [key value ...] - ustawia wartości dla wszystkich
podanych kluczy, operacja atomowa.
Bazy klucz-wartość. Redis
39/60
Polecenia z grupy Strings III - operacje bitowe
GETBIT key offset - zwraca bit na pozycji offset,
SETBIT key offset - ustawia bit na pozycji offset,
BITPOS key bit [start] [end] - zwraca pozycję pierwszego bitu
ustawionego na 0 albo 1,
BITOP operation destkey key [key ...] - wykonuje operacje bitowe
na podanych kluczach, wynik zapisuje w destkey, dostępne operacje: AND,
OR, XOR, NOT (przyjmuje tylko jeden klucz),
BITCOUNT key [start end] - zlicza liczbę ustawionych bitów w podanym
kluczu, można ograniczyć zakres bajtów, które będą sprawdzane,
BITFIELD key [GET type offset] [SET type offset value]
[INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL] polecenie traktuje napis jako tablicę bitów, pozwala odczytać, zapisać albo
zwiększyć wybrany ciąg bitów:
Bazy klucz-wartość. Redis
40/60
Przykłady operacj bitowych
> set bit "\x44"
// szesnastkowo, wartość 68, binarnie 0100 0100
OK
> get bit
// odpowiada znakowi ’D’ ASCII
"D"
> BITFIELD bit GET u2 0
1) (integer) 1
> BITFIELD bit GET u4 0
1) (integer) 4
> BITFIELD bit GET u6 0
1) (integer) 17
> BITFIELD bit GET u8 0
1) (integer) 68
BITFIELD bit SET i8 #0 67
// ustawiamy 8 bitów traktowanych jako integer
1) (integer) 68
// wartością 67, zwraca nam poprzednią wartość
> get bit
"C"
> 2> BITCOUNT bit
// 2 razy (2>) wykonuje BITCOINT
(integer) 3
(integer) 3
> SETBIT bit 5 1
// ustawia 6 bit na 1 (liczymy od lewej)
(integer) 0
> get bit
"G"
// zwiększyło wartość o 4, z "C" zrobiło się "G"
Bazy klucz-wartość. Redis
41/60
Polecenia z grupy Lists I
Każdy dowolny klucz może zacząć pracować jako lista, jeśli nie jest już innym
typem danych.
Polecenia do obsługi list:
RPUSH key value [value ...] - dodaje wartość/wartości do końca listy,
LPUSH key value [value ...] - dodaje wartość/wartości na początku
listy,
LLEN key - zwraca bieżącą długość listy umieszczonej w podanym kluczu,
LRANGE key start stop - zwraca podzbiór listy; dwa parametry określają
początek i koniec zwracanego podzbioru; drugi parametr o wartości -1
oznacza pobranie elementów do końca listy,
LPOP key, RPOP key - usuwa pierwszy, ostatni element z listy i zwraca go,
LTRIM key start stop - przycina listę zostawiając tylko elementy o
indeksach od start do stop (włącznie),
Bazy klucz-wartość. Redis
42/60
Przykład pracy z listą
> RPUSH zm "Basia"
(integer) 1
> RPUSH zm "Daniel"
(integer) 2
> LPUSH zm "Adam"
(integer) 3
> LRANGE zm 0 -1
1) "Adam"
2) "Basia"
3) "Daniel"
> LRANGE zm 1 2
1) "Basia"
2) "Daniel"
> LLEN zm
(integer) 3
> LPOP zm
"Adam"
> RPOP zm
"Daniel"
> LLEN zm
(integer) 1
Bazy klucz-wartość. Redis
43/60
Polecenia z grupy Lists II
Każdy element listy ma indeks. Indeksy listy zaczynają się od 0.
Licząc dd końca indeksy zaczynają się od -1 (pierwszy od końca).
0
1
2
3
4
"Ala" "kot" "ul" "pies" "dom"
-5
-4
-3
-2
-1
Pozostałe polecenia do obsługi list:
LINDEX key index - zwraca element listy leżący na pozycji index,
LREM key count value - zależnie od wartości count wykonuje:
count=0 - usuwane są wszystkie elementy równe value
count>0 - usuwanych jest count wystąpień elementu równego value
licząc od początku,
count<0 - usuwanych jest count wystąpień elementu równego value
licząc od końca,
LSET key index value - ustawia wartość pozycji na liście określonej
indexem,
LINSERT key BEFORE|AFTER pivot value - dodaje element o podanej
wartości do listy na przed/po pozycji pivot
Bazy klucz-wartość. Redis
44/60
Polecenia z grupy Sets I
SADD key member [member ...] - dodaje elementy/elementy do zbioru
key, powtarzające się w zbiorze elementy są ingorowane,
SCARD key - zwraca liczbę elementów w zbiorze, zwraca 0 jeśli zbiór o
podanej nie istnieje,
SDIFF key [key ...] - zwraca elementy pierwszego zbioru po odjęciu
elementów wszystkich kolejnych zbiorów, z jednym parametrem zwraca
wszystkie elementy zbioru,
SDIFFSTORE destination key [key ...] - jak SDIFF ale zamiast
zwracać elementy zapisuje je pod innym kluczem,
SINTER key [key ...] - zwraca elementy zbioru będące przecięciem
wszyskich podanych zbiorów, przy jednym parametrze zwraca cały zbiór,
SINTERSTORE destination key [key ...] - jak SINTER ale zamiast
zwracać zbiór zapisuje go pod innym kluczem,
SISMEMBER key member - zwraca 1 albo 0 zależnie czy member elementem
zbioru określonego podanym kluczem,
Bazy klucz-wartość. Redis
45/60
Polecenia z grupy Sets II
SMEMBERS key - zwraca wszystkie elementy zbioru pod podanym kluczem,
SMOVE source destination member - przenosi element ze zbioru
źródłowego do docelowego, operacja atomowa,
SPOP key [count] - usuwa i zwraca jeden lub więcej losowych elementów
ze zbioru, podobne do SRANDMEMBER,
SREM key member [member ...] - usuwa jeden lub więcej elementów ze
zbioru,
SUNION key [key ...] - zwraca elementy będące sumą wszyskich
podanych zbiorów, z jednym parametrem zwraca cały zbiór,
SUNIONSTORE destination key [key ...] - jak SUNION ale zamiast
zwrócić zbiór zapisuje go pod innym kluczem,
SSCAN - przechodzi po kolekcji elementów zbioru.
Bazy klucz-wartość. Redis
46/60
Polecenia z grupy Sorted Sets I
ZADD key [NX|XX] [CH] [INCR] score member [score member ...]
- dodaje element/elementy razem z ich wartością porządkową (score) w
formacie double, np. ZADD zbior 3.4 zeszyt 1.2 mazak -10 atrament
ZCARD key - zwraca liczbę elementów w zbiorze, zwraca 0 jeśli zbiór o
podanej nie istnieje,
ZCOUNT key min max - zwraca liczbę elementów w zbiorze z wartością
porządkową mieszczącą się w przedziale min max, ZCOUNT zz -inf +inf
ZINCRBY key increment member - zwiększa wartość porządkową
podanego elementu member o podaną wartość increment, podanie wartości
ujemnej zmniejsza wartość porządkową, brak elementu w zbiorze tworzy go
ustawiając wartość porządkową na increment,
ZRANGE key start stop [WITHSCORES] - zwraca elementy podanego
zbioru od pozycji start do stop (chodzi o numer elementu w zbiorze a nie o
wartość prządkującą),
ZRANK key member - zwraca numer elementu w zbiorze podanego jako
drugi parametr, element pierwszy, najniższy rangą ma pozycję 0,
Bazy klucz-wartość. Redis
47/60
Polecenia z grupy Sorted Sets II
ZREM key member [member ...] - usuwa podane elementy ze zbioru,
zwraca liczbę usuniętych elementów,
ZREMRANGEBYRANK key start stop - usuwa wszystkie elementy ze zbioru
zaczynając do numeru start do numeru stop, numeracja zaczyna się od 0,
ZREMRANGEBYSCORE key min max - usuwa wszystkie elementy ze zbioru
posiadające wartość porządkującą w przedziale min max,
ZREMRANGEBYSCORE zz 1.9 2.01,
ZSCORE key member - zwraca wartość porządkującą podanego elementu z
podanego zbioru,
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight
[weight ...]] [AGGREGATE SUM|MIN|MAX] - wyznacza sumę zbiorów
podanych jako argumenty key, trzeba podać liczbę zbiorów, które wystąpią numkeys, wartości porządkujące tych samych elementów się sumują (SUM),
jest brane maksimum (MAX) albo minimum (MIN), przy wartościach
porządkowych można dodawać mnożnik (weight) inny do każdego zbioru,
ZSCAN - przechodzi po kolekcji elementów zbioru.
Bazy klucz-wartość. Redis
48/60
Polecenia z grupy Hashes I - modyfikacja
HSET key field value - tworzy pole (field) w podanym kluczu (key) o
podanej wartości (value),
HMSET key field value [field value ...] - tworzy listę pól razem z
podanymi wartościami w podanym kluczu,
HSETNX key field value - ustawia wartość dla pola field tylko jeśli pole
jeszcze nie istnieje,
HDEL key field [field ...] - usuwa pole/pola z tablicy asocjacyjnej
określonej podanym kluczem,
HINCRBY key field increment - zwiększa wartość liczby przechowywanej
w field o increment dla podanego klucza, increment o wartości ujemnej
zmniejsza liczbę,
HINCRBYFLOAT key field increment - dla podanego klucza modyfikuje
wartość pola field o podaną wartość increment (dodatnią lub ujemną),
Bazy klucz-wartość. Redis
49/60
Polecenia z grupy Hashes II - odczyt
HGET key field - dla klucza key zwraca wartość związaną z polem field,
HMGET key field [field ...] - dla podanego klucza zwraca wartości
związane z podanymi polami, jeśli klucz nie istnieje zwraca listę wartości
nil,
HGETALL key - zwraca listę wszystkich pól i ich wartości dla podanego
klucza, lista: pole1, wartość1, pole2, wartość2, ... (2 razy więcej niż pól)
HEXISTS key field - zwraca 1 jeśli dla podanego klucza istnieje podane
pole,
HLEN key - zwraca liczbę pól przechowywanych w podanym kluczu,
HSTRLEN key field - dla podanego klucza zwraca liczbę znaków wartości
związanej z podanym polem,
HKEYS key - zwraca listę wszystkich pól dla podanego klucza,
HVALS key - zwraca listę wszystkich wartości dla podanego klucza,
HSCAN - przechodzi po kolekcji elementów zbioru.
Bazy klucz-wartość. Redis
50/60
Przykład pracy tablicą asocjacyjną
> HSET stud imie Wojciech
(integer) 1
> HSET stud nazwisko Kasicki
(integer) 1
> HMSET stud dataur 19940812 plec M stypendium 850.0
OK
> HINCRBYFLOAT stud stypendium -100
"750"
> HSTRLEN stud dataur
(integer) 8
> HDEL stud plec
(integer) 1
> HGETALL stud
1) "imie"
2) "Wojciech"
3) "nazwisko"
4) "Kasicki"
5) "dataur"
6) "19940812"
7) "stypendium"
8) "750"
> DEL stud
(integer) 1
Bazy klucz-wartość. Redis
51/60
Polecenia z grupy Connection
AUTH password - podawanie hasła do serwera, który wymaga hasła,
ECHO message - zwraca podaną wiadomość,
redis> ECHO "Hello World!"
"Hello World!"
redis>
PING [message] - testowanie odpowiedzi serwera, bez argumentu
zwraca ”PONG”,
redis> PING
PONG
redis> PING "hello world"
"hello world"
redis>
QUIT - zamyka połączenie, zamyka redis-cli,
SELECT index - zmienia bazę danych dla bieżącego połączenia,
podaje się numer bazy; nowe połączenia zawsze używają numeru 0.
Bazy klucz-wartość. Redis
52/60
Polecenia z grupy Server I
Jest aż 31 poleceń. Nie wszystie będę omawiał szczegółowo.
CLIENT GETNAME - zwraca nazwę dla bieżącego połączenia jeśli taką
ustawiono,
CLIENT SETNAME connection-name - pozwala ustalić nazwę dla danego
połączenia, może się przydać w celach np. usuwania błędów z klienta,
CLIENT LIST - zwraca informacje i statystyki o klientach przyłączonych do
serwera,
CLIENT PAUSE timeout - pozwala zatrzymać polecenia wszystkich
przyłączonych klientów na określoną liczbę milisekund, np. w celu zmiany
serwera z podrzędnego na główny,
CLIENT KILL [ip:port] [ID client-id] [TYPE
normal|master|slave|pubsub] [ADDR ip:port] [SKIPME yes/no] polecenie zamyka określone parametrami połączenie klienta,
CLIENT REPLY ON|OFF|SKIP - pozwala na wyłączenie odpowiedzi z
serwera, czasem przydatne,
Bazy klucz-wartość. Redis
53/60
Polecenia z grupy Server II
COMMAND - zwraca zagnieżdżoną tablicę opisującą wszystkie dostępne
polecenia w Redis,
COMMAND COUNT - zwraca liczbę wszystkich poleceń serwera Redis,
COMMAND INFO command-name [command-name ...] - zwraca informacje
o wybranym poleceniu (poleceniach),
DBSIZE - zwraca liczbę kluczy w aktualnie wybranej bazie,
FLUSHDB - usuwa wszystkie klucze w aktualnej bazie danych,
FLUSHALL - usuwa wszystkie klucze z wszystkich istniejących baz, nie
tylko tej wybranej,
INFO [section] - zwraca informacje i statystyki dotyczące serwera, można
określić sekcję zwracanych informacji,
CONFIG RESETSTAT - resetuje statystyki zwracane przez polecenie INFO,
SLAVEOF [NO ONE|hostname port] - zmienia ustawienie replikacji
bieżącego servera (ustawia go na master albo jaki slave innego),
Bazy klucz-wartość. Redis
54/60
Polecenia z grupy Server III
MONITOR - polecenie do wykrywania błędów, wyświetla w strumieniu
wszystko co dzieje się z bazą danych, można używać z redis-cli albo z
telnet, np. telnet localhost 6379,
ROLE - wyświetla informacje o danej instancji Redisa w kontekście klastra i
replikacji (czy jest master czy slave, co jest podłączone do niego),
BGSAVE - zapisuje w tle (background) bazę danych na dysku
(/var/lib/redis/dump.rdb),
LASTSAVE - zwraca czas Unixowy określający kiedy był ostatni zapis
poleceniem BGSAVE,
SAVE - synchroniczny zapis danych z pamięci na dysk, stosowany w
awaryjnych sytuacjach.
SHUTDOWN [NOSAVE|SAVE] -zatrzymuje wszystkie połączenia, zapisuje dane
(SAVE), wyłącza serwer.
TIME - zwraca bieżący czas serwera jako listę dwuelementową (punkt
czasowy Unixa i liczbę mikrosekund),
Bazy klucz-wartość. Redis
55/60
Dostępne biblioteki Redis w Node.js
Dostępne biblioteki Redis w Node.js (pogrubiono pozycje rekomendowane):
fast-redis-cluster - https://github.com/h0x91b/fast-redis-cluster
ioredis - wspaniały, skupiony na wydajności, udostępniający pełną funkcjonalność
(obsługa klastrów, wartownika, potoków, skryptów LUA),
https://github.com/luin/ioredis
node redis - https://github.com/NodeRedis/node_redis
rebridge - https://github.com/CapacitorSet/rebridge
redis-fast-driver - https://github.com/h0x91b/redis-fast-driver
spade - https://github.com/rootslab/spade
then-redis - mały, działa wykorzystując obietnice,
https://github.com/mjackson/then-redis
thunk-redis - https://github.com/thunks/thunk-redis
yoredis - https://github.com/djanowski/yoredis
Powyższe biblioteki są aktywne (zmiany w kodzie w ciągu ostatnich 6 m-cy).
Bazy klucz-wartość. Redis
56/60
ioredis
Wspiera Redis >= 2.6.12 i (Node.js >= 0.10.16 albo io.js).
Cechy:
wysoka wydajność,
wspaniałe API, działa na wywołaniach zwrotnych z Node.js i na
obietnicach,
przestrzeń abstrakcji dla skryptów LUA, pozwala definiować własne
polecenia,
wsparcie dla danych binarnych,
wsparcie dla TSL,
wsparcie typów z ES6 (jak map i set),
wsparcie dla poleceń z grupy GEO,
zaawansowana obsługa obłędów.
Bazy klucz-wartość. Redis
57/60
ioredis - instalacja, podstawowe użycie
Instalacja biblioteki: npm install ioredis --save
Proste użycie:
var Redis = require(’ioredis’);
var redis = new Redis();
redis.set(’zmienna’, ’wartosc’);
redis.get(’zmienna’, function (err, result) {
console.log(result);
});
// w przypadku użycia obietnic, ostatni argument nie jest funkcją
redis.get(’foo’).then(function (result) {
console.log(result);
});
// argumenty do poleceń są spłaszczane, poniższe dwa polecenia wykonują to samo
redis.sadd(’set’, 1, 3, 5, 7);
redis.sadd(’set’, [1, 3, 5, 7]);
// wszystkie argumenty są przekazywane bezpośrednio do serwera redis
redis.set(’key’, 100, ’EX’, 10);
Bazy klucz-wartość. Redis
58/60
ioredis - połączenie z bazą danych
Połączenie z bazą danych:
new Redis()
// Połączenie z 127.0.0.1:6379
new Redis(6380)
// 127.0.0.1:6380
new Redis(6379, ’192.168.1.1’)
// 192.168.1.1:6379
new Redis(’/tmp/redis.sock’)
new Redis({
port: 6379,
// Redis port
host: ’127.0.0.1’,
// Redis host
family: 4,
// 4 (IPv4) or 6 (IPv6)
password: ’auth’,
db: 0
})
Inny sposób połączenia podając adres URL:
// Połączenie z 127.0.0.1:6380, db 4, podane hasło "authpassword":
new Redis(’redis://:[email protected]:6380/4’)
Bazy klucz-wartość. Redis
59/60
Źródła
https://www.g2crowd.com/press-release/
best-nosql-databases-fall-2015/
https://en.wikipedia.org/wiki/Redis
https://github.com/sripathikrishnan/redis-rdb-tools/wiki/
Redis-RDB-Dump-File-Format
http://redis.io/topics/cluster-spec
Bazy klucz-wartość. Redis
60/60

Podobne dokumenty