Mateusz Mazurek – programista z pasją

Python, architektura, ciekawostki ze świata IT

Algorytmika Programowanie Programowanie webowe

Redis i Python – dobrze dobrana para #10

Cześć.

Za nami dziewięć artykułów których głównym celem jest pokazanie jak z poziomu Pythona pracować z Redisem. Dzisiejszy artykuł jest dziesiątym z kolei i… Ostatnim. Tak! Doszedłem do wniosku, że to już całość wiedzy jaką chciałem Wam przekazać. Jest tego naprawdę sporo. Niemniej jednak zostało kilka zagadnień dla których nie znalazłem dobrego miejsca w poprzednich artykułach, a mogą okazać się przydatne, więc opowiem o nich krótko w tym wpisie.

Nim przejdę do tych kilku ostatnich informacji, przypominam, że pisząc ten artykuł opieram się na wiedzy którą przekazałem w poprzednich wpisach, więc zachęcam do nadrobienia, jeśli nie miałeś wcześniej okazji:

Walrus

Walrus to alternatywny sposób pracy z Redisem. Wszystkie artykuły opierały się na jednej bibliotece dostarczającej dość standardowe API. Teraz pokażę podejście do tematu od trochę innej strony.

Walrusa instalujemy jak każdą bibliotekę:

1
pip install walrus

I piszemy przykładowy kod:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from walrus import *
db = Database(host='localhost', port=6379, db=0)

db['test'] = 11  # odpowiednik SET test 11

redis_list = db.List('test_list')

redis_list.append('22') # odpowiednik RPUSH test_list 22
redis_list.extend([22, 44]) # również RPUSH

redis_set = db.Set('test_set')

redis_set.add(22) # odpowiednik SADD test_set 22
redis_set.remove(22)  # SREM

redis_sorted_set = db.ZSet('test_sorted_set')
redis_sorted_set.add({'w': 11, "e": 33})  # ZADD

który w sumie pokazuje ideę walrusa. Ukrywa on za wygodną implementacją komendy Redisowe dając tym samym API naśladujące Pythonowe rozwiązania.

Jeszcze ciekawszą rzeczą o której nie wiedziałem przed pisaniem tego artykułu jest to, że Walrus pozwala na tworzenie modeli:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from walrus import *

db = Database(host='localhost', port=6379, db=0)


class Book(Model):
    __database__ = db
    id = UUIDField()
    title = TextField()
    description = TextField()
    pages = IntegerField()
    tags = SetField


book = Book.create(title="Włam się do mózgu", description="O tym jak się uczyć", pages=300, tags={'nauka', 'uczenie'})

które potem można sobie potem pobrać po kluczu który wskażemy jako primary_key. W moim kodzie pole „id” będące typem UUIDField automatycznie staje się kluczem głównym. Uruchomienie tego kawałka Pythona generuje kilka kluczy w Redisie:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
127.0.0.1:6379> keys *
1) "book:all"
2) "book:_id.absolute.1"
3) "book:id.1"
4) "book:_id._sequence"
5) "book:id.absolute."
6) "book:_id.continuous"
127.0.0.1:6379> type book:id.1
hash
127.0.0.1:6379> HGETALL book:id.1
1) "title"
2) "W\xc5\x82am si\xc4\x99 do m\xc3\xb3zgu"
3) "description"
4) "O tym jak si\xc4\x99 uczy\xc4\x87"
5) "pages"
6) "300"
7) "_id"
8) "1"

Które wskazują odkrywają sposób implementacji. Walrus konwertuje instancję modelu do hasha Redisowego. Oczywiście nie obeszło się bez kluczy pomocniczych trzymających chociażby id sekwencji (moje pole „id” jest autoincrement).

Jeśli interesuje Cię więcej – zapraszam do dokumentacji Walrusa.

Nieużywane klucze

Szukasz nieużywanych kluczy? Redis pozwala łatwo sprawdzić ile czasu minęło od użycia (tj czytanie lub zmiana) klucza:

1
2
3
4
5
6
127.0.0.1:6379> OBJECT IDLETIME book:id.1
(integer) 186
127.0.0.1:6379> OBJECT IDLETIME book:id.1
(integer) 190
127.0.0.1:6379> OBJECT IDLETIME book:id.1
(integer) 191

Polecenie OBJECT ma jeszcze kilka przydatnych subkomend – warto zajrzeć do dokumentacji.


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.

Jak i do ewentualnego postawienia mi kawy :)
Postaw mi kawę na buycoffee.to

Szukanie dużych kluczy

Istnieje kilka bibliotek które potrafią policzyć które rodziny kluczy zajmują najwięcej miejsca. Redis dostarcza proste narzędzie pozwalające określić największe elementy:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[mmazurek@localhost ~]$ redis-cli --bigkeys
# Scanning the entire keyspace to find biggest keys as well as
# average sizes per key type.  You can use -i 0.1 to sleep 0.1 sec
# per 100 SCAN commands (not usually needed).

[00.00%] Biggest hash   found so far 'book:id.1' with 4 fields
[00.00%] Biggest set    found so far 'book:_id.absolute.3' with 1 members
[00.00%] Biggest set    found so far 'book:all' with 3 members
[00.00%] Biggest zset   found so far 'book:_id.continuous' with 3 members
[00.00%] Biggest string found so far 'book:_id._sequence' with 1 bytes

-------- summary -------

Sampled 10 keys in the keyspace!
Total key length in bytes is 146 (avg len 14.60)

Biggest   hash found 'book:id.1' has 4 fields
Biggest string found 'book:_id._sequence' has 1 bytes
Biggest    set found 'book:all' has 3 members
Biggest   zset found 'book:_id.continuous' has 3 members

0 lists with 0 items (00.00% of keys, avg size 0.00)
3 hashs with 12 fields (30.00% of keys, avg size 4.00)
1 strings with 1 bytes (10.00% of keys, avg size 1.00)
0 streams with 0 entries (00.00% of keys, avg size 0.00)
5 sets with 9 members (50.00% of keys, avg size 1.80)
1 zsets with 3 members (10.00% of keys, avg size 3.00)

Przydatne jeśli komuś się zapomni ustawić odpowiedniego expire’a.

Rozproszone blokady

Jednym z zastosowań Redisa jest tworzenie tzw. distributed locks – czyli blokad umożliwiających sterowanie jedną aplikacją z poziomu innej, zakładając lub zdejmując blokady. Ogólnym celem jest wzajemnie wykluczanie i istnieje już kilka (o ile nie kilkanaście) bibliotek które w oparciu o Redisa dostarczają rozwiązania typu RedLock. Naprawdę niezłe wyjaśnienie znajduje się na stronie Redisa – link.

Zmierzając do końca

I tym radosnym akcentem kończymy tę serię. 10 artykułów to ogromna dawka wiedzy wprowadzająca Cię w „świat Redisa”. Stworzenie jej zajęło mi trochę czasu, bo pierwszy artykuł pojawił się 14.06.2020 a ten 21.12.2020 – czyli bez mała pół roku. Patrząc jednak na efekt – jestem bardzo zadowolony. Jeśli myślisz podobnie, daj lajka, komentarz, udostępnij gdzieś tę serię. Daj światu poznać wartością treść.

Ale to też nie tak, że poza satysfakcją nic z tego nie mam. Tworząc plan, obmyślając zakres, kolejność a na końcu pisząc czuję, ze bardzo usystematyzowałem swoją wiedzę. Jest to bardzo wartościowy efekt uboczny.

Ten projekt kończę, ale blog nadal żyje. Jestem pewien, że pojawi się tu jeszcze więcej ciekawych rzeczy.

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.

2 komentarzy
Inline Feedbacks
View all comments
johnny

Przeczytałem całą serię, dzięki za masę wiedzy!