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:
- https://mmazurek.dev/redis-i-python-dobrze-dobrana-para-9/
- https://mmazurek.dev/redis-i-python-dobrze-dobrana-para-8/
- https://mmazurek.dev/redis-i-python-dobrze-dobrana-para-7/
- https://mmazurek.dev/redis-i-python-dobrze-dobrana-para-6/
- https://mmazurek.dev/redis-i-python-dobrze-dobrana-para-5/
- https://mmazurek.dev/redis-i-python-dobrze-dobrana-para-4/
- https://mmazurek.dev/redis-i-python-dobrze-dobrana-para-3/
- https://mmazurek.dev/redis-i-python-dobrze-dobrana-para-2/
- https://mmazurek.dev/redis-i-python-dobrze-dobrana-para-1/
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:Jeśli to Cię interesuje to zapraszam również na swoje social media.
Jak i do ewentualnego postawienia mi kawy :)
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.
Mateusz Mazurek
Przeczytałem całą serię, dzięki za masę wiedzy!
Dzięki za przeczytanie i docenienie :D