Mateusz Mazurek – programista z pasją

Czyli o użyciu Pythona i kilku innych technologii do tworzenia świetnej jakości aplikacji w oparciu o stabilny proces dostarczania oprogramowania.

Linux Programowanie Programowanie webowe

Redis i Python – dobrze dobrana para #2

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:
a w ramach prezentu otrzymasz całkowicie za darmo, dwa dokumenty PDF „6 (nie zawsze oczywistych) błędów popełnianych podczas nauki programowania” który jest jednym z efektów ponad siedmioletniej pracy i obserwacji rozwoju niejednego programisty oraz „Wstęp do testowania w Pythonie”, będący wprowadzeniem do biblioteki PyTest.
Jeśli to Cię interesuje to zapraszam również na swoje social media.

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.

Dzięki za wizytę,
Mateusz Mazurek

A może wolisz nowości na mail?

Subskrybuj
Powiadom o
guest

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

6 komentarzy
Inline Feedbacks
View all comments
Martin

A może Walrus?

jotes

Z przydatnych rzeczy o których warto też powiedzieć na początku to np.

1
https://redis.io/commands/monitor

do weryfikowania jakie zapytania są wywoływane na instancji Redisa.

jotes

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.

Last edited 1 miesiąc temu by jotes

[…] ostatnim wpisie naprawdę sporo zrobiliśmy! Używając Dockera uruchomiliśmy własnego Redisa, połączyliśmy […]