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.
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.
Ż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.
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.
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
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
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.
Oj daaawnoo mnie tu nie było. Ale wakacje to był czas dużej liczby intensywnych wyjazdów i tak naprawdę, dopiero jakoś… Read More
Cześć! Zapraszam na krótkie podsumowanie kwietnia. Wyjazd do Niemiec A dokładniej pod granicę z Francją. Chrześnica miała pierwszą komunię. Po… Read More
Ostatnio tygodnie były tak bardzo wypełnione, że nie udało mi się napisać nawet krótkiego podsumowanie. Więc dziś zbiorczo podsumuję luty… Read More
Zapraszam na krótkie podsumowanie miesiąca. Książki W styczniu przeczytałem "Homo Deus: Historia jutra". Książka łudząco podoba do wcześniejszej książki tego… Read More
Cześć! Zapraszam na podsumowanie roku 2023. Książki Zacznijmy od książek. W tym roku cel 35 książek nie został osiągnięty. Niemniej… Read More
Zapraszam na krótkie podsumowanie miesiąca. Książki W grudniu skończyłem czytać Mein Kampf. Nudna książka. Ciekawsze fragmenty można by było streścić… Read More
Pokaż komentarze
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.
https://redis.io/commands/monitor
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.