Cześć!
W poprzedniem artykule mogłeś dowiedzieć się czym jest Redis, jakie ma możliwości i dlaczego go lubię. Czas na trochę praktyki! W tym wpisie pokażę, jak w podstawowym zakresie używać Redisa z poziomu programów w Pythonie.
Instalacja
W zależności od dystrybucji Linuxa do instalacji Redisa możesz użyć po prostu dedykowanego managera pakietów. Moja Fedora ma Redisa w podstawowych repozytoriach.
Sugeruję jednak skorzystać z Dockera, będzie szybciej i wygodniej. W ogóle Docker to coś, do czego na początku nie mogłem się przekonać, by z czasem nie wyobrażać sobie bez niego życia. Mega wygodne narzędzie! Jedno polecenie i masz Redisa uruchomionego:
1 2 3 4 5 6 7 8 9 10 11 12 | $ docker run --name some-redis -p 6379:6379 -d redis Unable to find image 'redis:latest' locally latest: Pulling from library/redis 8559a31e96f4: Pull complete 85a6a5c53ff0: Pull complete b69876b7abed: Pull complete a72d84b9df6a: Pull complete 5ce7b314b19c: Pull complete 04c4bfb0b023: Pull complete Digest: sha256:800f2587bf3376cb01e6307afe599ddce9439deafbd4fb8562829da96085c9c5 Status: Downloaded newer image for redis:latest 93c924a5b8972c209262e06d1a0c76e9da2839eb95e9c237a31616ded5c8ad7b |
W kwestii wyjaśnienia, uruchomiliśmy kontener na podstawie ogólnie dostępnego obrazu Redisa.
Łączymy się z Redisem
Żeby móc połączyć się z Redisem należy doinstalować bibliotekę. Komunikacja odbywa się przez protokół TCP. Pozwala nam to oczywiście na napisanie własnej biblioteki, jednak w 99.99% przypadków nie jest to ani konieczne, ani potrzebne, ponieważ istnieje co najmniej kilkanaście bibliotek, które już to umieją robić.
Zainstalujmy jedną z popularniejszych:
1 2 3 4 5 6 | $ pip install redis Collecting redis Downloading redis-3.5.3-py2.py3-none-any.whl (72 kB) |████████████████████████████████| 72 kB 551 kB/s Installing collected packages: redis Successfully installed redis-3.5.3 |
I już :) możemy działać!
Sprawdzić możliwość połączenia się z Redisem, możemy na kilka sposobów. Jednym z prostszych jest uruchomienie takiego kawałka kodu:
1 2 3 | from redis import Redis redis_connection = Redis() print(redis_connection.ping()) |
który, jeśli nie ma problemów, powinien wyświetlić „True”.
Nie musimy podawać w drugiej linii żadnych danych, ponieważ nasz Redis jest uruchomiony na standardowym porcie i bez hasła. Czyli po prostu łączymy się do localhost:6379, a dokładnie te dane są uznawane za domyślne.
Metoda ping odzwierciedla polecenie „PING” dostępne w Redisie.
Czekaj, stop!
Podoba Ci się to co tworzę? Jeśli tak to zapraszam Cię do zapisania się na newsletter:Jeśli to Cię interesuje to zapraszam również na swoje social media.
Jak i do ewentualnego postawienia mi kawy :)
Redis-cli
Fajnie, że umiemy się połączyć z Redisem z poziomu Pythona, ale jest jeszcze coś, co koniecznie trzeba wiedzieć przed podjęciem kolejnych kroków. Tym czymś jest narzędzie redis-cli czyli interaktywna konsola Redisa, pozwalająca wykonywać komendy.
Jeśli zainstalowałeś Redisa z repozytoriów to możesz z dużym prawdopodobieństwem po prostu uruchomić program redis-cli, jeśli użyłeś Dockera, potrzebujesz uruchomić ten sam program, ale w kontenerze. Możesz to zrobić takim poleceniem:
1 | $ docker exec -it some-redis redis-cli |
W jednym i drugim przypadku efektem powinna być konsola czekająca na wprowadzenie danych:
1 2 | $ docker exec -it some-redis redis-cli 127.0.0.1:6379> |
Możesz ją wypróbować! Wszak znasz już polecenie „PING”. Wpisz je i naciśnij enter:
1 2 3 4 | $ docker exec -it some-redis redis-cli 127.0.0.1:6379> PING PONG 127.0.0.1:6379> |
Jak widać Redis odbił piłeczkę i wrócił do oczekiwania na kolejne polecenia.
Wspominam o tym narzędziu, bo jest bardzo przydatne, najczęściej do podejrzenia wartości kluczy.
Zróbmy coś w końcu!
Jak wspomniałem wcześniej, Redis posiada pewien zestaw typów danych i przypisanych do nich komend.
Najprostszym typem danych są oczywiście stringi.
Jeden string może przechowywać maksymalnie 512MB danych.
Redis to baza typu klucz-wartość. W efekcie, aby odczytać jakąś wartość z tej bazy, trzeba posłużyć się kluczem, który jest argumentem do komendy, odpowiedniej dla typu danych przechowywanych w tym kluczu. Brzmi zawile? Zobacz na kod:
1 2 3 4 5 6 7 8 9 | from redis import Redis redis_connection = Redis() key = "some-key" value = "some-val" redis_connection.set(key, value) print(redis_connection.get(key)) |
Pod kluczem „some-key” zapisaliśmy do Redisa wartość „some-val”. Ostatnie dwie linijki to odczytanie tej wartości. Efekt wykonania się tego programu to:
b'some-val'
Jest tak, ponieważ standardowo ta biblioteka zwraca odpowiedź jako ciąg bajtów. Możemy to zmienić, przekazując w __init__ klasy Redis argument decode_responses=True:
1 2 3 4 5 6 7 8 9 | from redis import Redis redis_connection = Redis(decode_responses=True) # <- tu zmiana! key = "some-key" value = "some-val" redis_connection.set(key, value) print(redis_connection.get(key)) |
co sprawi że efektem wykonania się programu będzie już string:
some-val
Użycie metod set i get jednoznacznie określi Redisowi jaki typ danych znajdować się będzie w tym kluczu.
Do tak ustawionych danych można oczywiście dostać się via redis-cli:
1 2 3 4 | $ docker exec -it some-redis redis-cli 127.0.0.1:6379> get some-key "some-val" 127.0.0.1:6379> |
Jeśli zapiszemy nową wartość pod kluczem, który był już wcześniej zdefiniowany – Redis ją po prostu nadpisze. Aby dołączyć do istniejącej wartości zadany string, można użyć metody append. Jeśli chcemy klucz usunąć, to mamy metodę delete. Jest to dość intuicyjne, ale zerknij na kod:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | from redis import Redis redis_connection = Redis(decode_responses=True) key = "some-key" value = "some-val" redis_connection.set(key, value) print(redis_connection.get(key)) redis_connection.append(key, "-append") print(redis_connection.get(key)) redis_connection.delete(key) print(redis_connection.get(key)) |
Jego wynikiem będzie:
some-val some-val-append None
Float, int?
Redis nie ma oddzielnych typów dla liczb, ale całkiem nieźle sobie radzi, jeśli pod jakimś kluczem ustawimy wartość, która jest liczbą. Otwiera nam to drogę do chociażby atomowego zwiększania wartości tej liczby:
1 2 3 4 5 6 7 8 9 10 11 12 13 | from redis import Redis redis_connection = Redis(decode_responses=True) key = "some-key" value = 55 redis_connection.set(key, value) print(redis_connection.get(key)) print(redis_connection.incr(key, 5)) print(redis_connection.decr(key, 20)) |
i wynik:
55
60
40
Zmierzając do brzegu
I tak dobiegł końca drugi artykuł z serii „Redis i Python”. Uruchomiliśmy Redisa z Dockera, połączyliśmy się do niego zarówno z poziomu Pythona jak i z nowo poznanego narzędzia, jakim jest redis-cli, by na koniec poznać jeden z podstawowych typów danych, czyli string. Uwierz, to dopiero wierzchołek góry.
Mateusz Mazurek
A może Walrus?
Nie używałem, ale kojarzę:) może się gdzieś tu pojawi jako ciekawostka:)
Z przydatnych rzeczy o których warto też powiedzieć na początku to np.
do weryfikowania jakie zapytania są wywoływane na instancji Redisa.
Potwierdzam! Fajna komenda, jej wadą jak i zaletą jest to że pokazuje wszystko. Tzn że jest trudno używalna jak mocno wykorzystujesz Redisa:P tak czy siak, jest fajna:)
Mój komentarz wynikał z tego że Twój artykuł traktuje o podstawach Redisa, monitor do debugu aplikacji lokalnie wystarcza w 100%. Do „mocnego” wykorzystywania aplikacji to już można się licytować terminami takimi jak tracing, metryki, observability itd.