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 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.
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.
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.
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.
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.
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
Przeczytałem całą serię, dzięki za masę wiedzy!
Dzięki za przeczytanie i docenienie :D