<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Bartosz Dąbek, Autor w serwisie bdabek.pl</title>
	<atom:link href="https://www.bdabek.pl/author/admin/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.bdabek.pl/author/admin/</link>
	<description>Bartosz Dąbek</description>
	<lastBuildDate>Mon, 17 Feb 2025 18:24:20 +0000</lastBuildDate>
	<language>pl-PL</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://www.bdabek.pl/wp-content/uploads/2020/10/cropped-5986134a-46ba-41ac-9c82-bb4ffb3a7bf3_200x200-1-150x150.png</url>
	<title>Bartosz Dąbek, Autor w serwisie bdabek.pl</title>
	<link>https://www.bdabek.pl/author/admin/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Cache w Javie. Trochę wiedzy</title>
		<link>https://www.bdabek.pl/cache-java/</link>
					<comments>https://www.bdabek.pl/cache-java/#respond</comments>
		
		<dc:creator><![CDATA[Bartosz Dąbek]]></dc:creator>
		<pubDate>Mon, 17 Feb 2025 18:24:20 +0000</pubDate>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">https://www.bdabek.pl/?p=3198</guid>

					<description><![CDATA[<p>Cześć. Dawno, dawno temu, na produkcji, pojawił nam się problem z wydajnością aplikacji. Analiza i rozwiązanie problemu pochłonęła nam dobre kilka dni. Debugowaliśmy, czytaliśmy dokumentację, analizowaliśmy logi. Nic nie mogliśmy znaleźć, do momentu, gdy nas oświeciło. Analizowaliśmy requesty i zauważyliśmy, że większość czasu żądania była na odczycie wartości z&#8230; cache. Problem był banalny. Zapychaliśmy cache&#8217;a&#8230;&#160;<a href="https://www.bdabek.pl/cache-java/" rel="bookmark">Dowiedz się więcej &#187;<span class="screen-reader-text">Cache w Javie. Trochę wiedzy</span></a></p>
<p>Artykuł <a href="https://www.bdabek.pl/cache-java/">Cache w Javie. Trochę wiedzy</a> pochodzi z serwisu <a href="https://www.bdabek.pl">bdabek.pl</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Cześć.</p>



<p>Dawno, dawno temu, na produkcji, pojawił nam się problem z wydajnością aplikacji. Analiza i rozwiązanie problemu pochłonęła nam dobre kilka dni. Debugowaliśmy, czytaliśmy dokumentację, analizowaliśmy logi. Nic nie mogliśmy znaleźć, do momentu, gdy nas oświeciło. Analizowaliśmy requesty i zauważyliśmy, że większość czasu żądania była na odczycie wartości z&#8230; cache. Problem był banalny. <strong>Zapychaliśmy cache&#8217;a generując za każdym razem uniwersalny klucz wartości</strong>. Chwilę wcześniej mergowaliśmy ogromnego PR, który pozmieniał w kodzie dużo &#8211; za dużo. Zmiany były w różnych częściach aplikacji &#8211; technicznych i biznesowych. To był nasz ogromny błąd.</p>



<p>Uznałem, że artykuł, który w sposób początkujący przedstawi temat cache pomoże innym. Mi też będzie punktem referencyjnym w przyszłości. W dzisiejszym artykule:</p>



<ul class="wp-block-list">
<li><strong><a href="#czym_jest_cache">Czym jest cache</a></strong></li>



<li><strong><a href="#in-memory-vs-distributed">Cache lokalny vs rozproszony</a></strong></li>



<li><a href="#algorytmy_cache"><strong>Algorytmy przechowujące dane</strong></a></li>



<li><a href="#inwalidacja_cache"><strong>Inwalidacja cache</strong></a></li>



<li><a href="#monitorowanie_cache"><strong>Monitorowanie cache</strong></a></li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><h2 id="czym_jest_cache"> <a href="#czym_jest_cache"><span class="dashicons dashicons-admin-links"></span></a>Czym jest cache</h2></h2>



<p>Cache w Javie to mechanizm przechowywania często używanych danych, w celu szybszego dostępu i poprawy wydajności aplikacji. Możemy zastosować go do operacji, które są <strong>czasochłonne</strong> lub <strong>kosztowne w wykonaniu</strong>. Dobrymi przykładami takich operacji są zapytania do bazy danych, requesty do API czy powtarzalne obliczenia matematyczne.</p>


<div class="wp-block-image">
<figure class="alignleft size-full is-resized"><img fetchpriority="high" decoding="async" width="512" height="512" src="https://www.bdabek.pl/wp-content/uploads/2025/02/cache_co_to.webp" alt="" class="wp-image-3424" style="width:202px;height:auto" srcset="https://www.bdabek.pl/wp-content/uploads/2025/02/cache_co_to.webp 512w, https://www.bdabek.pl/wp-content/uploads/2025/02/cache_co_to-300x300.webp 300w, https://www.bdabek.pl/wp-content/uploads/2025/02/cache_co_to-150x150.webp 150w" sizes="(max-width: 512px) 100vw, 512px" /></figure>
</div>


<p>Załóżmy, że tworzymy aplikację pobierającą informacje o pogodzie. Informacje pobieramy z różnych lokalizacji, z zewnętrznego serwisu pogodowego za pomocą REST API. Pobierane dane zmieniają się co 3 godziny. Z naszej aplikacji dziennie korzysta około 50 000 osób, co przekłada się na średnio 2000 requestów na godzinę (upraszczamy, że ruch został rozłożony na całą dobę równomiernie). Użytkownicy pochodzą głównie z Polski i często pytają o te same lokalizacje. Aby uniknąć wywoływania zewnętrznego serwisu pogodowego wiele razy, możemy użyć mechanizmu cache. Przyspieszymy dostęp do informacji i unikniemy ciągłego zapytywania zewnętrznego API.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><h2 id="in-memory-vs-distributed"> <a href="#in-memory-vs-distributed"><span class="dashicons dashicons-admin-links"></span></a>Cache lokalny vs rozproszony</h2></h2>



<p>Pamięć cache, możemy podzielić na dwa typy: lokalny i rozproszony. W tej sekcji postaram się opisać ich cechy, wady oraz zalety. Na końcu sekcji wrzuciłem też dwie tabele. Jedna porównująca cechy obydwu typów i druga z przykładami i rekomendacjami, który rodzaj wybrać w danej sytuacji.</p>



<h4 class="wp-block-heading"><strong>Cache lokalny (In-memory cache)</strong></h4>



<p>In-memory cache to <strong>lokalny cache w procesie aplikacji</strong>, który przechowuje dane w pamięci RAM na jednym serwerze. Pozwala to na błyskawiczny dostęp do danych tam przechowywanych. Jest on najszybszy, ale ograniczony rozmiarem pamięci dostępnej w jednej instancji aplikacji. Jego główne cechy to:</p>


<figure class="wp-block-image alignright size-full is-resized"><img decoding="async" width="1000" height="892" class="wp-image-3406" style="width: 483px; height: auto;" src="https://www.bdabek.pl/wp-content/uploads/2025/02/memory_hierarchy.webp" alt="Hierarchia pamięci" srcset="https://www.bdabek.pl/wp-content/uploads/2025/02/memory_hierarchy.webp 1000w, https://www.bdabek.pl/wp-content/uploads/2025/02/memory_hierarchy-300x268.webp 300w, https://www.bdabek.pl/wp-content/uploads/2025/02/memory_hierarchy-768x685.webp 768w" sizes="(max-width: 1000px) 100vw, 1000px" /><figcaption class="wp-element-caption" style="text-align: center;"><em> Hierarchia pamięci</em></figcaption></figure>


<ul class="wp-block-list">
<li><strong>Lokalność:</strong> dane przechowywane są w pamięci RAM konkretnego procesu lub instancji aplikacji.</li>



<li><strong>Szybkość:</strong> dostęp do danych jest ekstremalnie szybki, ponieważ omijana jest komunikacja sieciowa i operacje na dysku.</li>



<li><strong>Prostota:</strong> może być implementowany za pomocą prostych struktur danych, np. <code>ConcurrentHashMap</code>, lub dedykowanych bibliotek, np. Caffeine.</li>



<li><strong>Brak współdzielenia:</strong> dane w cache są dostępne tylko dla jednego procesu lub instancji aplikacji (chyba że używana jest rozproszona implementacja in-memory, np. Hazelcast).</li>
</ul>



<p><strong>Zalety:</strong></p>



<ul class="wp-block-list">
<li><strong>Wysoka wydajność</strong>: zapewnia bardzo niski czas dostępu do danych, ponieważ przechowuje je w pamięci RAM. Odczyt danych z pamięci jest znacznie szybszy niż z dysku twardego czy bazy danych, co przyspiesza działanie aplikacji.</li>



<li><strong>Prosta implementacja</strong>: jest stosunkowo łatwa i nie wymaga skomplikowanej konfiguracji. Istnieje wiele gotowych rozwiązań, oferujących gotowe mechanizmy.</li>
</ul>



<p><strong>Wady:</strong></p>



<ul class="wp-block-list">
<li><strong>Ulotność danych</strong>: dane zostaną utracone w przypadku restartu serwera lub awarii aplikacji.</li>



<li><strong>Ograniczona pojemność</strong>: pojemność jest ograniczona przez dostępność pamięci RAM na serwerze. W przypadku dużych aplikacji lub intensywnego wykorzystania pamięci może to prowadzić do problemów z wydajnością lub brakiem miejsca na nowe dane (<code>OutOfMemoryError</code>).</li>



<li><strong>Trudności w skalowaniu</strong>: w architekturze rozproszonej każda instancja aplikacji ma swoją własną pamięć podręczną, co może prowadzić do problemów z synchronizacją danych między instancjami oraz zwiększonego ryzyka nieaktualnych informacji.</li>
</ul>



<h4 class="wp-block-heading"><strong>Cache rozproszony (Distributed cache)</strong></h4>



<p>Działa na wielu serwerach w klastrze, umożliwiając szybki dostęp do często używanych danych. Pamięć współdzielona jest między wieloma instancjami aplikacji i umożliwia obsługę dużych wolumenów danych oraz zapewnia wysoką dostępność danych. Jego główne cechy:</p>



<ul class="wp-block-list">
<li><strong>Rozproszenie danych (eureka!):</strong> te same dane dostępne z różnych instancji aplikacji.</li>



<li><strong>Skalowalność</strong>: może być łatwo skalowany poprzez dodawanie nowych węzłów do klastra. To pozwala na zwiększenie pojemności cache i obsługę większej liczby żądań.</li>



<li><strong>Odporność na awarie</strong>: dzięki replikacji danych na różnych węzłach, nawet w przypadku awarii jednego z nich, dane pozostają dostępne.</li>



<li><strong>Partycjonowanie (sharding):</strong> każdy węzeł przechowuje <strong>tylko część</strong> danych, a aplikacja odwołuje się bezpośrednio do odpowiedniego serwera.</li>
</ul>


<figure class="wp-block-image alignright size-full is-resized"><img decoding="async" width="655" height="634" class="wp-image-3416 alignright" style="width: 582px; height: 564px;" src="https://www.bdabek.pl/wp-content/uploads/2025/02/distributed_cache_schema.webp" alt="" srcset="https://www.bdabek.pl/wp-content/uploads/2025/02/distributed_cache_schema.webp 655w, https://www.bdabek.pl/wp-content/uploads/2025/02/distributed_cache_schema-300x290.webp 300w" sizes="(max-width: 655px) 100vw, 655px" /><figcaption style="text-align: center;"><em>Schemat cache&#8217;u rozproszonego</em></figcaption></figure>


<p><strong>Zalety:</strong></p>



<ul class="wp-block-list">
<li><strong>Wysoka dostępność i odporność na awarie: </strong>dane mogą być replikowane na wielu węzłach, dzięki czemu awaria jednego serwera nie powoduje utraty danych.</li>



<li><strong>Szybkość i niskie opóźnienia:</strong> dane przechowywane są w pamięci RAM (z tym, że na wielu węzłach w porównaniu z lokalnym cache).</li>



<li><strong>Usprawnienie pracy mikroserwisów:</strong> w systemach mikroserwisowych cache rozproszony pozwala na szybką wymianę danych między usługami bez konieczności ciągłego odpytywania bazy danych.</li>



<li><strong>Obsługa dużych wolumenów danych</strong>: dzięki partycjonowaniu dane mogą być równomiernie rozłożone na węzłach, co pozwala na obsługę dużych zbiorów danych w rozproszonym środowisku.</li>
</ul>



<p><strong>Wady:</strong></p>



<ul class="wp-block-list">
<li><strong>Opóźnienia Sieciowe:</strong> cache działa na wielu serwerach, co oznacza, że każde zapytanie musi przejść przez sieć. Jeśli węzły są oddalone geograficznie, latencja wzrasta.</li>



<li><strong>Koszt Pamięci RAM:</strong> RAM jest znacznie droższy niż dysk, a cache rozproszony przechowuje dane w pamięci operacyjnej. Skalowanie dużych systemów wymaga serwerów z dużą ilością RAM-u.</li>



<li><strong>Nieścisłości w Danych (Data Inconsistency):</strong> dane na różnych węzłach mogą być przez chwilę niespójne. Możesz odczytać stare dane, zanim propagacja zmian się zakończy.</li>



<li><strong>Złożoność architektury:</strong> wprowadza dodatkową złożoność do architektury systemu. Wymaga planowania i zarządzania, aby zapewnić prawidłowe działanie i integrację z innymi komponentami systemu.</li>



<li><strong>Split-Brain:</strong> Jeśli węzły stracą komunikację między sobą, może dojść do stanu „split-brain”, gdzie różne węzły mają różne wersje danych. Część aplikacji może korzystać z nieaktualnych danych.</li>
</ul>



<h4 class="wp-block-heading">Rozproszony vs Lokalny</h4>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th><strong>Cecha</strong></th><th><strong>Rozproszony Cache</strong></th><th><strong>Lokalny Cache</strong></th></tr></thead><tbody><tr><td><strong>Lokalizacja danych</strong></td><td>Dane są przechowywane na wielu instancjach.</td><td>Dane są przechowywane w pamięci RAM lokalnej instancji aplikacji.</td></tr><tr><td><strong>Dostępność danych</strong></td><td>Dane są współdzielone między wszystkimi instancjami aplikacji w klastrze.</td><td>Dane są dostępne tylko dla jednej instancji aplikacji.</td></tr><tr><td><strong>Przykłady technologii</strong></td><td>Redis, Memcached, Hazelcast, Infinispan, Apache Ignite, Ehcache (tryb rozproszony)</td><td>Caffeine, Guava, Ehcache (tryb lokalny), ConcurrentHashMap <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></td></tr><tr><td><strong>Szybkość dostępu</strong></td><td>Dostęp jest szybszy niż do bazy danych, ale wymaga komunikacji sieciowej.</td><td>Dostęp jest ekstremalnie szybki, ponieważ dane są przechowywane w pamięci lokalnej.</td></tr><tr><td><strong>Skalowalność</strong></td><td>Łatwo skalowalny dzięki rozproszonej architekturze – nowe węzły można dodawać w celu zwiększenia pojemności.</td><td>Skalowalność ograniczona do zasobów (RAM) jednej instancji aplikacji.</td></tr><tr><td><strong>Niezawodność danych</strong></td><td>Może obsługiwać replikację i trwałość danych.</td><td>Dane są ulotne – tracone w przypadku restartu aplikacji lub awarii instancji.</td></tr><tr><td><strong>Złożoność zarządzania</strong></td><td>Zazwyczaj wymaga dodatkowej konfiguracji.</td><td>Łatwe w zarządzaniu – wystarczy biblioteka lub struktura danych w aplikacji.</td></tr><tr><td><strong>Przeznaczenie</strong></td><td>Do współdzielenia danych między wieloma instancjami lub usługami w architekturze rozproszonej</td><td>Do lokalnego buforowania danych specyficznych dla jednej instancji aplikacji.</td></tr><tr><td><strong>Czas życia danych (TTL)</strong></td><td>Obsługuje globalne TTL dla danych, które są ważne niezależnie od instancji.</td><td>Dane wygasają tylko w kontekście jednej instancji aplikacji.</td></tr><tr><td><strong>Koszty</strong></td><td>Wymaga dodatkowych zasobów infrastruktury (np. serwery Redis, Memcached).</td><td>Niskie koszty – wykorzystuje lokalną pamięć aplikacji.</td></tr><tr><td><strong>Odporność na awarie</strong></td><td>Może być replikowany, co zwiększa odporność na awarie</td><td>Dane są tracone w przypadku awarii procesu aplikacji.</td></tr></tbody></table></figure>



<h4 class="wp-block-heading"><strong>Kiedy wybrać który?</strong></h4>



<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:100%">
<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th><strong>Scenariusz</strong></th><th><strong>Rekomendacja</strong></th></tr></thead><tbody><tr><td>Współdzielenie danych między wieloma instancjami.</td><td><strong>Distributed Cache</strong></td></tr><tr><td>Dane muszą być dostępne po awarii instancji.</td><td><strong>Distributed Cache</strong></td></tr><tr><td>Maksymalna szybkość dostępu bez komunikacji sieciowej.</td><td><strong>In-Memory Cache</strong></td></tr><tr><td>Aplikacja monolityczna z pojedynczym węzłem.</td><td><strong>In-Memory Cache</strong></td></tr><tr><td>Architektura mikrousługowa lub klaster aplikacji.</td><td><strong>Distributed Cache</strong></td></tr><tr><td>Buforowanie krótkotrwałych danych specyficznych dla jednej instancji.</td><td><strong>In-Memory Cache</strong></td></tr></tbody></table></figure>
</div>
</div>
</div></div>



<h2 class="wp-block-heading"><h2 id="algorytmy_cache"> <a href="#algorytmy_cache"><span class="dashicons dashicons-admin-links"></span></a>Algorytmy przechowujące dane</h2></h2>



<p>Wiemy już czym jest cache i jakie są jego typy. Teraz pora poznać jakie algorytmy są implementowane najczęściej. Warto poznać co się dzieje pod bebechami, w jaki sposób nasze dane są organizowane w cache. W gotowych rozwiązaniach mamy możliwość customizowania, znając skróty (np. LRU, LFU) oraz teoretyczne działanie algorytmu, jesteśmy w stanie lepiej go ustawić.</p>


<figure class="wp-block-image aligncenter size-full"><img decoding="async" width="494" height="531" class="wp-image-3430" src="https://www.bdabek.pl/wp-content/uploads/2025/02/cache_algorytmy.webp" alt="" srcset="https://www.bdabek.pl/wp-content/uploads/2025/02/cache_algorytmy.webp 494w, https://www.bdabek.pl/wp-content/uploads/2025/02/cache_algorytmy-279x300.webp 279w" sizes="(max-width: 494px) 100vw, 494px" /><figcaption class="wp-element-caption" style="text-align: center;"><em>Książka do algorytmów</em> cache</figcaption></figure>


<ul class="wp-block-list marker:text-textOff list-disc pl-8">
<li><strong>Zastosowania i ograniczenia</strong>: Omówienie, kiedy i dlaczego warto stosować dany algorytm oraz ich potencjalne ograniczenia.</li>
</ul>



<p>Najpopularniejsze algorytmy to: </p>



<ul class="wp-block-list">
<li><strong>LRU (Least Recently Used)</strong></li>



<li><strong>LFU (Least Frequently Used)</strong></li>



<li><strong>FIFO (First In, First Out)</strong></li>



<li><strong>ARC (Adaptive Replacement Cache)</strong></li>



<li><strong>SLRU (Segmented LRU)</strong></li>



<li><strong>2Q (Two-Queue)</strong></li>
</ul>



<h5 class="wp-block-heading mb-2 mt-6 text-lg first:mt-3">LRU (Least Recently Used)</h5>



<p>Algorytm LRU usuwa najdawniej używane elementy z cache, aby zrobić miejsce dla nowych. Jest to jeden z najczęściej stosowanych algorytmów, ponieważ dobrze odzwierciedla rzeczywiste wzorce użycia danych. Warto go stosować gdy <strong>ważne są najświeższe dane</strong>.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" width="1024" height="235" src="https://www.bdabek.pl/wp-content/uploads/2025/02/cache_lru-1024x235.webp" alt="" class="wp-image-3445" srcset="https://www.bdabek.pl/wp-content/uploads/2025/02/cache_lru-1024x235.webp 1024w, https://www.bdabek.pl/wp-content/uploads/2025/02/cache_lru-300x69.webp 300w, https://www.bdabek.pl/wp-content/uploads/2025/02/cache_lru-768x176.webp 768w, https://www.bdabek.pl/wp-content/uploads/2025/02/cache_lru-1536x352.webp 1536w, https://www.bdabek.pl/wp-content/uploads/2025/02/cache_lru.webp 1983w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption"><em>Algorytm LRU</em></figcaption></figure>
</div>


<p>Wyobraźmy sobie aplikację udostępniającą zdjęcia.&nbsp;Zdjęcia są przechowywane na dysku, a ich pobieranie zajmuje pewien czas. Aby przyspieszyć dostęp do często żądanych zdjęć, aplikacja może użyć cache LRU. Kiedy użytkownik żąda zdjęcia, aplikacja najpierw sprawdza, czy znajduje się ono w pamięci podręcznej. Jeśli tak, zdjęcie jest natychmiast zwracane. Jeśli zdjęcia nie ma w pamięci podręcznej, aplikacja pobiera go z dysku, zapisuje w pamięci podręcznej i zwraca użytkownikowi. Pamięć podręczna LRU ma ograniczoną pojemność, więc gdy jest pełna, algorytm <strong>usuwa najdawniej używane zdjęcie,</strong> aby zrobić miejsce dla nowego. Dzięki temu często żądane zdjęcia są szybko dostępne, co poprawia wydajność serwera i skraca czas ładowania strony dla użytkowników</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Dlaczego warto?</strong></p>



<ul class="wp-block-list">
<li>Wykorzystuje lokalność czasową – elementy używane niedawno prawdopodobnie będą używane ponownie.</li>



<li>Sprawdza się w systemach z przewidywalnym wzorcem dostępu do danych.</li>



<li>Prosta i sprawdzona strategia &#8211; po prostu usuwa element, który był najdawniej używany.</li>



<li>Dobra wydajność dla większości zastosowań &#8211; operacje dostępu (<code>get</code> i <code>put</code>) są w czasie O(1) w <code>LinkedHashMap</code>, jeśli używamy listy podwójnie powiązanej.</li>
</ul>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Ograniczenia:</strong></p>



<ul class="wp-block-list">
<li>Cache pollution – jeśli aplikacja chwilowo użyje dużej liczby rzadko używanych obiektów, cache może zostać „zalany” niepotrzebnymi danymi.</li>



<li>Wysokie koszty operacyjne &#8211; wymaga dodatkowej pamięci do przechowywania wskaźników (np. w <code>LinkedHashMap</code> jest to lista podwójnie powiązana).</li>



<li>Brak adaptacyjności &#8211; każdy nowy dostępny element traktowany jest jednakowo, co może prowadzić do błędnych decyzji o usunięciu. Jeśli aplikacja używa dwóch zestawów danych naprzemiennie, LRU może stale usuwać jedną grupę na rzecz drugiej.</li>
</ul>
</div>
</div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h5 class="wp-block-heading mb-2 mt-6 text-lg first:mt-3">LFU (Least Frequently Used)</h5>



<p>Algorytm LFU usuwa elementy, które były <strong>najrzadziej używane w danym okresie czasu</strong>. Wymaga on śledzenia liczby odwołań do każdego elementu w cache, co może zwiększać złożoność implementacji i obciążenie pamięci. Warto go stosować gdy <strong>ważna jest częstotliwość użycia</strong>.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img decoding="async" width="1024" height="546" src="https://www.bdabek.pl/wp-content/uploads/2025/02/cache_lfu-1024x546.webp" alt="" class="wp-image-3448" style="width:674px;height:auto" srcset="https://www.bdabek.pl/wp-content/uploads/2025/02/cache_lfu-1024x546.webp 1024w, https://www.bdabek.pl/wp-content/uploads/2025/02/cache_lfu-300x160.webp 300w, https://www.bdabek.pl/wp-content/uploads/2025/02/cache_lfu-768x409.webp 768w, https://www.bdabek.pl/wp-content/uploads/2025/02/cache_lfu.webp 1280w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption"><em>Algorytm LFU</em></figcaption></figure>
</div>


<p>Wyobraź sobie, że tworzysz aplikację finansową, która pokazuje kursy walut w czasie rzeczywistym. Każdego dnia tysiące użytkowników sprawdza notowania, ale większość z nich interesuje się tylko kilkoma najpopularniejszymi walutami – np. USD, EUR i PLN. Zamiast za każdym razem pobierać dane z API, przechowujemy w pamięci najczęściej pobierane kursy walut, a rzadko używane usuwamy.</p>



<p>1&#x20e3; Użytkownik pyta o kurs USD/PLN. Sprawdzamy, czy mamy go w LFU Cache.<br>2&#x20e3; Im częściej dana waluta jest wyszukiwana, tym dłużej pozostaje w cache.<br>3&#x20e3; Jeśli cache jest pełny, usuwamy najrzadziej pobierane waluty.</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Dlaczego warto?</strong></p>



<ul class="wp-block-list">
<li>Idealny dla danych o wysokiej lokalności częstotliwościowej – rzadko używane obiekty są usuwane, a często odczytywane pozostają.</li>



<li>Sprawdza się w aplikacjach, gdzie dostęp do pewnych obiektów jest naturalnie „gorący” (np. ranking produktów w sklepie).</li>
</ul>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Ograniczenia:</strong></p>



<ul class="wp-block-list">
<li>Problem zimnego startu – nowo dodane elementy mogą zostać szybko usunięte, zanim zdążą być użyte wystarczająco często.</li>



<li>Wysoka złożoność operacji – O(log n) zamiast O(1). W odróżnieniu od LRU Cache, który można zaimplementować w O(1), standardowa implementacja LFU wymaga struktury danych, która potrafi śledzić częstotliwość użycia i usuwać najrzadziej używany element.</li>



<li>Nie radzi sobie dobrze z nagłymi zmianami trendów &#8211; dane, które były często używane dawno temu, mogą długo pozostawać w cache, nawet jeśli nie są już potrzebne.</li>
</ul>
</div>
</div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h5 class="wp-block-heading mb-2 mt-6 text-lg first:mt-3">FIFO (First In, First Out)</h5>



<p>Algorytm FIFO usuwa najstarsze elementy z cache&#8217;a w momencie, gdy osiągnięty zostaje jego maksymalny rozmiar. Jest to <strong>prosty algorytm</strong>, ale <strong>może nie być optymalny</strong> w przypadku, gdy starsze dane są nadal często używane.</p>



<p>Załóżmy, że budujemy <strong>serwer proxy</strong>, który buforuje strony internetowe, aby zmniejszyć liczbę żądań wysyłanych do serwera źródłowego. Kiedy użytkownik odwiedza stronę, jej zawartość jest zapisywana w pamięci podręcznej. Jeśli inny użytkownik zażąda tej samej strony, proxy zwróci ją z cache, zamiast pobierać ponownie z internetu.</p>



<p>Jednak cache ma ograniczoną pojemność, więc <strong>najstarsze strony muszą być usuwane, aby zrobić miejsce na nowe</strong>. FIFO dobrze sprawdza się w tym przypadku, ponieważ <strong>starsze strony są mniej prawdopodobne do ponownego użycia</strong>.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" width="1024" height="279" src="https://www.bdabek.pl/wp-content/uploads/2025/02/cache_fifo-1024x279.webp" alt="" class="wp-image-3450" srcset="https://www.bdabek.pl/wp-content/uploads/2025/02/cache_fifo-1024x279.webp 1024w, https://www.bdabek.pl/wp-content/uploads/2025/02/cache_fifo-300x82.webp 300w, https://www.bdabek.pl/wp-content/uploads/2025/02/cache_fifo-768x209.webp 768w, https://www.bdabek.pl/wp-content/uploads/2025/02/cache_fifo.webp 1138w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption"><em>FIFO algorithm</em></figcaption></figure>
</div>


<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Dlaczego warto?</strong></p>



<ul class="wp-block-list">
<li>Bardzo prosty do implementacji i tani obliczeniowo.</li>



<li>Może działać dobrze w sytuacjach, gdzie stare dane są naturalnie mniej istotne.</li>



<li>Brak kosztów obliczeniowych związanych z priorytetyzacją w przeciwieństwie do algorytmów takich jak LRU czy LFU, FIFO nie wymaga monitorowania częstotliwości ani czasu dostępu do danych.</li>



<li>Działa w przewidywalny sposób, ponieważ zawsze usuwa najstarszy element. Nie wymaga skomplikowanych heurystyk ani analizy częstości użycia danych.</li>
</ul>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Ograniczenia:</strong></p>



<ul class="wp-block-list">
<li>Ignoruje rzeczywisty dostęp do danych – może usuwać często używane dane, jeśli zostały one załadowane wcześniej niż inne mniej używane elementy</li>



<li>Może prowadzić do niskiej efektywności cache (tzw. Problem Belady’ego) – zwiększenie rozmiaru cache może pogorszyć jego skuteczność zamiast ją poprawić.</li>



<li>Brak kontroli nad priorytetami danych &#8211; w FIFO wszystkie dane są traktowane jednakowo, niezależnie od ich ważności dla aplikacji.</li>
</ul>
</div>
</div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h5 class="wp-block-heading mb-2 mt-6 text-lg first:mt-3">ARC (Adaptive Replacement Cache)</h5>



<p>ARC to bardziej zaawansowany algorytm, który <strong>łączy cechy LRU i LFU</strong>. Dostosowuje się do zmieniających się wzorców użycia danych, starając się utrzymać równowagę między częstością a świeżością danych w cache&#8217;u. Algorytm <strong>opiera się na czterech listach</strong>, które służą do zarządzania pamięcią podręczną. Dwie główne listy, T1 i T2, odpowiadają za przechowywanie odpowiednio niedawno używanych oraz często używanych elementów. Dodatkowo istnieją dwie listy pomocnicze, B1 i B2, które przechowują referencje do elementów wcześniej usuniętych z T1 i T2, co pozwala na <strong>inteligentne dostosowanie algorytmu</strong> do zmieniających się wzorców dostępu do danych.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" width="1024" height="585" src="https://www.bdabek.pl/wp-content/uploads/2025/02/cache_ARC-1024x585.webp" alt="" class="wp-image-3455" srcset="https://www.bdabek.pl/wp-content/uploads/2025/02/cache_ARC-1024x585.webp 1024w, https://www.bdabek.pl/wp-content/uploads/2025/02/cache_ARC-300x171.webp 300w, https://www.bdabek.pl/wp-content/uploads/2025/02/cache_ARC-768x439.webp 768w, https://www.bdabek.pl/wp-content/uploads/2025/02/cache_ARC-1536x878.webp 1536w, https://www.bdabek.pl/wp-content/uploads/2025/02/cache_ARC.webp 1792w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption"><em>ARC algorithm</em></figcaption></figure>
</div>


<p>Załóżmy, że mamy <strong>system rekomendacji filmów</strong> w serwisie streamingowym. Filmy mogą być często oglądane przez różnych użytkowników (np. hity kinowe), ale niektóre treści mogą być oglądane tylko raz przez jednego użytkownika (np. premierowe odcinki seriali). ARC może być tu użyty do cache&#8217;owania najczęściej oglądanych filmów, jednocześnie dostosowując się do zmieniającego się trendu popularności. Jeśli dany film jest nagle często oglądany przez wielu użytkowników, ARC zwiększy swoją pamięć dla takich elementów (T2). Jeśli użytkownicy konsumują głównie nowe treści (np. nowy sezon serialu), ARC dostosuje się do tego, zwiększając T1 i usuwając mniej popularne starsze filmy.</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Dlaczego warto?</strong></p>



<ul class="wp-block-list">
<li>Lepsza adaptacja do zmieniających się wzorców dostępu – eliminuje problem wyboru między LRU i LFU.</li>



<li>Efektywne wykorzystanie cache – dynamiczne dostosowanie do obciążenia zapewnia mniejszą liczbę niepotrzebnych wymian.</li>



<li>Dobre działanie w przypadku zarówno skokowych zmian popularności, jak i stabilnych trendów.</li>
</ul>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Ograniczenia:</strong></p>



<ul class="wp-block-list">
<li>Większa złożoność obliczeniowa niż LRU czy LFU – zarządzanie wieloma listami i dynamiczne dostosowywanie kosztuje więcej CPU.</li>



<li>Większe zużycie pamięci – dodatkowe struktury (B1, B2) zwiększają overhead.</li>



<li>Może nie sprawdzić się w scenariuszach z bardzo ograniczoną pamięcią – w ekstremalnie małych cache&#8217;ach, prostsze algorytmy jak LRU mogą działać lepiej.</li>
</ul>
</div>
</div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h5 class="wp-block-heading mb-2 mt-6 text-lg first:mt-3">SLRU (Segmented LRU)</h5>



<p>SLRU to wariant klasycznego algorytmu LRU, który wprowadza podział pamięci podręcznej na dwa segmenty: ochronny i próbny. Ochronny przechowuje często używane elementy, które zostały uznane za „ważne”, próbny natomiast nowe elementy, które jeszcze nie zostały uznane za istotne. Nowo wczytane elementy trafiają najpierw do segmentu próbnego. Jeśli element zostanie ponownie użyty, jest przenoszony do segmentu ochronnego. Elementy z segmentu ochronnego mają pierwszeństwo przed usunięciem – jeśli pamięć cache jest pełna, elementy usuwane są w pierwszej kolejności z segmentu próbnego, co zwiększa szanse na zachowanie często używanych danych.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" width="1024" height="585" src="https://www.bdabek.pl/wp-content/uploads/2025/02/cache_SLRU-1024x585.webp" alt="" class="wp-image-3457" srcset="https://www.bdabek.pl/wp-content/uploads/2025/02/cache_SLRU-1024x585.webp 1024w, https://www.bdabek.pl/wp-content/uploads/2025/02/cache_SLRU-300x171.webp 300w, https://www.bdabek.pl/wp-content/uploads/2025/02/cache_SLRU-768x439.webp 768w, https://www.bdabek.pl/wp-content/uploads/2025/02/cache_SLRU-1536x878.webp 1536w, https://www.bdabek.pl/wp-content/uploads/2025/02/cache_SLRU.webp 1792w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption"><em>SLRU algorithm</em></figcaption></figure>
</div>


<p>Weźmy realny przykład z e-commerce. Każdy użytkownik, odwiedzając sklep internetowy, otrzymuje sesję, która może być wykorzystywana wielokrotnie, np. podczas dodawania produktów do koszyka, ale w wielu przypadkach jest jednorazowa – użytkownik przegląda stronę i nigdy nie wraca. W takim scenariuszu nowo utworzone sesje trafiają najpierw do segmentu próbnego pamięci podręcznej. Jeśli użytkownik podejmuje kolejne działania, jego sesja zostaje przeniesiona do segmentu ochronnego, co oznacza, że uznano ją za wartościową. W momencie, gdy pamięć cache się zapełni, system usuwa w pierwszej kolejności elementy z segmentu próbnego, pozostawiając w cache sesje użytkowników aktywnie korzystających z platformy. Dzięki takiemu podejściu unika się przechowywania w cache sesji użytkowników, którzy odwiedzili stronę tylko raz i nie wykazali żadnej aktywności.</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Dlaczego warto?</strong></p>



<ul class="wp-block-list">
<li>Lepsza retencja często używanych danych – rzadko używane elementy są usuwane szybciej, co sprawia, że cache lepiej przechowuje istotne dane.</li>



<li>Unikanie problemu „jednorazowych” danych – nie przenosi od razu nowych elementów do segmentu ochronnego, co zapobiega przypadkowemu wyrzuceniu bardziej wartościowych danych.</li>
</ul>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Ograniczenia:</strong></p>



<ul class="wp-block-list">
<li>Nieadaptacyjny – w przeciwieństwie do ARC, SLRU nie dostosowuje automatycznie swoich segmentów do zmieniających się wzorców dostępu.</li>



<li>Możliwa suboptymalna wymiana – jeśli segment ochronny jest pełny, rzadko używane elementy mogą utrzymywać się zbyt długo, zamiast zrobić miejsce na bardziej wartościowe dane.</li>
</ul>
</div>
</div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h5 class="wp-block-heading mb-2 mt-6 text-lg first:mt-3">2Q (Two-Queue)</h5>



<p>Algorytm 2Q to ulepszona wersja LRU, która lepiej radzi sobie z jednorazowymi dostępami do danych. Dzieli pamięć cache na dwie główne kolejki: A1 i Am. Nowe elementy trafiają najpierw do A1, która pełni funkcję filtra. Jeśli dany element zostanie użyty ponownie po usunięciu, przechodzi do Am, gdzie przechowywane są często wykorzystywane wpisy. Dzięki temu system unika sytuacji, w której jednorazowe żądania wypierają wartości bardziej istotne.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" width="1024" height="585" src="https://www.bdabek.pl/wp-content/uploads/2025/02/cache_2Q-1024x585.webp" alt="" class="wp-image-3458" srcset="https://www.bdabek.pl/wp-content/uploads/2025/02/cache_2Q-1024x585.webp 1024w, https://www.bdabek.pl/wp-content/uploads/2025/02/cache_2Q-300x171.webp 300w, https://www.bdabek.pl/wp-content/uploads/2025/02/cache_2Q-768x439.webp 768w, https://www.bdabek.pl/wp-content/uploads/2025/02/cache_2Q-1536x878.webp 1536w, https://www.bdabek.pl/wp-content/uploads/2025/02/cache_2Q.webp 1792w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption"><em>2Q algorithm</em></figcaption></figure>
</div>


<p>Wyobraź sobie aplikację internetową dla sklepu online, który obsługuje zapytania użytkowników o szczegóły produktów. Każde zapytanie pobiera dane z bazy, co może powodować duże obciążenie serwera. Standardowy mechanizm cache oparty na LRU miałby problem, gdyby użytkownicy jednorazowo przeglądali wiele różnych produktów – te mniej popularne mogłyby wypierać z cache&#8217;a często wyszukiwane artykuły.</p>



<p>Algorytm 2Q rozwiązuje ten problem poprzez wstępną kolejkę A1, do której trafiają nowo pobrane produkty. Jeśli dany produkt zostanie zapytany tylko raz, po krótkim czasie zostanie usunięty, nie wpływając na cache długoterminowy. Natomiast produkty często wyszukiwane zostaną przeniesione do kolejki Am, gdzie będą utrzymywane dłużej, co przyspieszy ich późniejsze ładowanie. Dzięki temu aplikacja efektywnie zarządza pamięcią cache, zmniejsza liczbę zapytań do bazy danych i poprawia czas odpowiedzi dla użytkowników.</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Dlaczego warto?</strong></p>



<ul class="wp-block-list">
<li>Zamiast natychmiastowego usuwania elementów, algorytm przenosi je między kolejkami, co może zminimalizować usuwanie przy małym dostępie.</li>



<li>Dobre rozwiązanie, gdy nie wiemy, jaki wzorzec dostępu dominuje w systemie.</li>
</ul>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Ograniczenia:</strong></p>



<ul class="wp-block-list">
<li>Wymaga więcej pamięci i złożonych struktur danych.</li>



<li>Nie zawsze najlepszy w systemach z bardzo małą pamięcią cache – może nie być opłacalny przy niewielkich zasobach.</li>
</ul>
</div>
</div>



<h5 class="wp-block-heading">Porównanie algorytmów</h5>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th><strong>Algorytm</strong></th><th><strong>Kiedy warto?</strong></th><th><strong>Ograniczenia</strong></th></tr></thead><tbody><tr><td><strong><strong>LRU</strong></strong></td><td>Lokalność czasowa, np. cache przeglądarki</td><td>Wrażliwy na zalanie cache nowymi danymi</td></tr><tr><td><strong><strong>LFU</strong></strong></td><td>Obiekty z wysoką częstotliwością dostępu (np. rankingi)</td><td>Problem zimnego startu, większa złożoność</td></tr><tr><td><strong><strong>FIFO</strong></strong></td><td>Proste przypadki (np. cache kolejki)</td><td>Nie uwzględnia lokalności czasowej</td></tr><tr><td><strong>ARC</strong></td><td>Zmienny wzorzec dostępu, wymagająca wydajność</td><td>Złożona implementacja</td></tr><tr><td><strong>SLRU</strong></td><td>Dobre dla mieszanej lokalności</td><td>Wymaga dostrajania wielkości segmentów</td></tr><tr><td><strong>2Q</strong></td><td>Przeciwdziała problemowi zimnego startu</td><td>Większe wymagania pamięciowe</td></tr></tbody></table></figure>



<h2 class="wp-block-heading"><h2 id="inwalidacja_cache"> <a href="#inwalidacja_cache"><span class="dashicons dashicons-admin-links"></span></a>Inwalidacja cache</h2></h2>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" width="1024" height="585" src="https://www.bdabek.pl/wp-content/uploads/2025/02/cache_invalidation-1024x585.webp" alt="" class="wp-image-3485" srcset="https://www.bdabek.pl/wp-content/uploads/2025/02/cache_invalidation-1024x585.webp 1024w, https://www.bdabek.pl/wp-content/uploads/2025/02/cache_invalidation-300x171.webp 300w, https://www.bdabek.pl/wp-content/uploads/2025/02/cache_invalidation-768x439.webp 768w, https://www.bdabek.pl/wp-content/uploads/2025/02/cache_invalidation-1536x878.webp 1536w, https://www.bdabek.pl/wp-content/uploads/2025/02/cache_invalidation.webp 1792w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption"><em>Cache invalidation</em></figcaption></figure>
</div>


<p>Inwalidacja cache to proces usuwania lub aktualizowania nieaktualnych danych w pamięci podręcznej. Jest kluczowa dla zapewnienia <strong>spójności danych</strong> i zapobiegania zwracaniu przestarzałych wartości. Istnieją różne strategie inwalidacji, zależnie od wymagań aplikacji.</p>



<h6 class="wp-block-heading"><strong>Inwalidacja oparta na czasie (TTL &#8211; Time-To-Live)</strong> / TTI (Time-To-Idle)</h6>



<p>TTL jest najprostsza metodą, w której każdy wpis w cache ma określony <strong>czas życia</strong>. Po upływie tego czasu zostaje automatycznie usunięty. TTI powoduje usunięcie wpisu z cache, jeśli nie był on używany przez określony czas. <strong>TTI i TTL można łączyć</strong>, np. ustawić TTL na 30 min i TTI na 10 min, aby zapewnić zarówno maksymalny czas życia, jak i usuwanie nieaktywnych danych.</p>



<h6 class="wp-block-heading"><strong>Inwalidacja natychmiastowa (Explicit Invalidation)</strong></h6>



<p>Aplikacja ręcznie usuwa wpisy z cache, gdy dane ulegną zmianie. Gwarantuje to aktualność danych, ale wymaga dokładnego zarządzania cachem.</p>



<h6 class="wp-block-heading"><strong>Inwalidacja oparta na polityce zastępowania (LRU/LFU)</strong></h6>



<p>LRU usuwa najdawniej używane wpisy, a LFU najrzadziej używane wpisy. Sprawdza się, gdy cache ma ograniczony rozmiar. Jego wadą jest, że może przetrzymywać nieistotne dane, które znalazły się w cache a mogłyby już z niego wylecieć.</p>



<h6 class="wp-block-heading"><strong>Jaką strategię wybrać?</strong></h6>



<ul class="wp-block-list">
<li><strong>Dane szybko się zmieniają?</strong> → TTL + TTI + Explict Invalidation.</li>



<li><strong>Masz ograniczoną pamięć cache?</strong> → LRU/LFU.</li>



<li><strong>Dane muszą być zawsze aktualne?</strong> → Explict Invalidation.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><h2 id="monitorowanie_cache"> <a href="#monitorowanie_cache"><span class="dashicons dashicons-admin-links"></span></a>Monitorowanie cache</h2></h2>



<p>Monitorowanie cache to kluczowy proces, <strong>pomagający</strong> utrzymać wydajność, spójność danych i oszczędność zasobów. Aby efektywnie monitorować cache, należy zastanowić się nad metrykami.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img decoding="async" width="1024" height="1024" src="https://www.bdabek.pl/wp-content/uploads/2025/02/cache_metrics.webp" alt="" class="wp-image-3467" style="width:658px;height:auto" srcset="https://www.bdabek.pl/wp-content/uploads/2025/02/cache_metrics.webp 1024w, https://www.bdabek.pl/wp-content/uploads/2025/02/cache_metrics-300x300.webp 300w, https://www.bdabek.pl/wp-content/uploads/2025/02/cache_metrics-150x150.webp 150w, https://www.bdabek.pl/wp-content/uploads/2025/02/cache_metrics-768x768.webp 768w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption"><em>Metryki Cache w dashboardzie Grafany</em></figcaption></figure>
</div>


<h5 class="wp-block-heading">Jakie metryki warto zbierać?</h5>



<ul class="wp-block-list">
<li><strong>Hit Ratio </strong>– określa, jak często dane są znajdowane w cache, zamiast być pobierane z bazy.</li>



<li>*<strong>Miss Rate </strong>– pokazuje, ile zapytań nie znajduje danych w cache i musi iść do bazy. <strong>Jeśli zbyt wysoki</strong>, warto zwiększyć <strong>rozmiar cache</strong> lub poprawić strategię inwalidacji. Miss Rate i Hit Ratio wzajemnie sumują się do 100%, więc mierząc jeden, automatycznie otrzymujesz drugi. </li>



<li><strong>Eviction Rate (Wskaźnik usunięć)</strong> – Mierzy, ile obiektów zostało usuniętych z cache (z powodu przepełnienia, TTL lub inwalidacji). Zbyt wysoki wskaźnik oznacza, że cache jest za mały.</li>



<li><strong>Memory Usage (Zużycie pamięci)</strong> – ile RAM zajmuje cache.</li>



<li><strong>Latency (Opóźnienie)</strong> – ile trwa odczyt/zapis w cache.</li>
</ul>



<h5 class="wp-block-heading">Jak monitorować Cache w Javie?</h5>



<p>W Javie istnieje kilka sposobów monitorowania cache. Dużo zależy od tego, jakiego typu aplikację rozwijamy/tworzymy. Jeżeli tworzysz aplikację w Spring Boot, możesz w prosty sposób dodać zależności do actuatora + micrometer&#8217;a i prometheusa.</p>


<pre class="crayon-plain-tag">&lt;dependency&gt;
    &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
    &lt;artifactId&gt;spring-boot-starter-actuator&lt;/artifactId&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
    &lt;groupId&gt;io.micrometer&lt;/groupId&gt;
    &lt;artifactId&gt;micrometer-registry-prometheus&lt;/artifactId&gt;
&lt;/dependency&gt;</pre>


<p>Następnie w <code>application.properties</code> (lub analogicznie yaml z odpowiednią strukturą) wystarczy włączyć metryki i możemy strzelać do API:</p>



<pre class="crayon-plain-tag">management.endpoints.web.exposure.include=*

curl 'http://localhost:8080/actuator/caches' -i -X GET</pre>



<p>Teraz można przenieść te dane do Prometheusa, zrobić dashboardy na Grafanie, dodać alerty i mamy gotowy system monitorujący. Nie jest to temat na ten artykuł. </p>



<p>Natomiast jeżeli nie używamy Spring Boota, możemy <strong>użyć MBean&#8217;ów JMX&#8217;a</strong>. Jeżeli korzystasz z popularnego rozwiązania do cache&#8217;owania w Javie, to jest duża szansa, że to rozwiązanie daje możliwość udostępnienia danych przez JMX. Osobiście korzystając z tych metryk, używałem bezpośrednio DataDog&#8217;a, więc nie jestem w stanie powiedzieć czy integracja ze stackiem Prometheus + Grafana jest tu możliwa, ale zakładam, że tak.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading has-text-align-left">Podsumowanie</h2>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://www.bdabek.pl/jak-programista-moze-radzic-sobie-ze-stresem/light-bulb-symbol-png/" rel="attachment wp-att-3333"><img decoding="async" width="358" height="400" src="https://www.bdabek.pl/wp-content/uploads/2025/01/light-bulb-symbol-png.webp" alt="żaróweczka" class="wp-image-3333" srcset="https://www.bdabek.pl/wp-content/uploads/2025/01/light-bulb-symbol-png.webp 358w, https://www.bdabek.pl/wp-content/uploads/2025/01/light-bulb-symbol-png-269x300.webp 269w" sizes="(max-width: 358px) 100vw, 358px" /></a></figure>
</div>


<p>Cache jest potężnym narzędziem, które może znacząco przyspieszyć działanie aplikacji. Poprzez inteligentne przechowywanie danych w pamięci podręcznej, możemy zmniejszyć czas dostępu do nich i zwiększyć wydajność. Warto zatem znać i rozważyć wykorzystanie cache&#8217;a.</p>



<p>Jeżeli chciałbyś rozwinąć którąś z sekcji, podzielić się swoją opinią czy doświadczeniami, to zachęcam do dyskusji w komentarzach.</p>
<p>Artykuł <a href="https://www.bdabek.pl/cache-java/">Cache w Javie. Trochę wiedzy</a> pochodzi z serwisu <a href="https://www.bdabek.pl">bdabek.pl</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bdabek.pl/cache-java/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Jak programista może radzić sobie ze stresem🤔. Moich 5 sposobów ✔️</title>
		<link>https://www.bdabek.pl/jak-programista-moze-radzic-sobie-ze-stresem/</link>
					<comments>https://www.bdabek.pl/jak-programista-moze-radzic-sobie-ze-stresem/#comments</comments>
		
		<dc:creator><![CDATA[Bartosz Dąbek]]></dc:creator>
		<pubDate>Fri, 17 Jan 2025 11:23:15 +0000</pubDate>
				<category><![CDATA[Inne]]></category>
		<guid isPermaLink="false">https://www.bdabek.pl/?p=3260</guid>

					<description><![CDATA[<p>Cześć 👋. Dawno mnie tu nie było, ale wracam po długiej przerwie&#8230; bardzo długiej. Do bloga wracam po tym, jak zastanawiałem się nad jego zamknięciem przy końcówce roku, gdy trzeba było opłacić domenę i hosting. Zdecydowałem jednak, że przejdę na tańszy hosting a przy migracji przeglądałem skrzynkę odbiorczą, która dodatkowo mocno zachęciła mnie do powrotu.&#8230;&#160;<a href="https://www.bdabek.pl/jak-programista-moze-radzic-sobie-ze-stresem/" rel="bookmark">Dowiedz się więcej &#187;<span class="screen-reader-text">Jak programista może radzić sobie ze stresem🤔. Moich 5 sposobów ✔️</span></a></p>
<p>Artykuł <a href="https://www.bdabek.pl/jak-programista-moze-radzic-sobie-ze-stresem/">Jak programista może radzić sobie ze stresem🤔. Moich 5 sposobów ✔️</a> pochodzi z serwisu <a href="https://www.bdabek.pl">bdabek.pl</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Cześć <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f44b.png" alt="👋" class="wp-smiley" style="height: 1em; max-height: 1em;" />.</p>
<p>Dawno mnie tu nie było, ale wracam po długiej przerwie&#8230; bardzo długiej. Do bloga wracam po tym, jak zastanawiałem się nad jego zamknięciem przy końcówce roku, gdy trzeba było opłacić domenę i hosting. Zdecydowałem jednak, że przejdę na tańszy hosting a przy migracji przeglądałem skrzynkę odbiorczą, która dodatkowo mocno zachęciła mnie do powrotu.</p>
<p><img decoding="async" class="aligncenter wp-image-3284" src="https://www.bdabek.pl/wp-content/uploads/2025/01/c0d93240-b3c2-4297-b5e7-95558066ff8c.jpg" alt="Laptop z blogiem na tle gór" width="409" height="409" srcset="https://www.bdabek.pl/wp-content/uploads/2025/01/c0d93240-b3c2-4297-b5e7-95558066ff8c.jpg 640w, https://www.bdabek.pl/wp-content/uploads/2025/01/c0d93240-b3c2-4297-b5e7-95558066ff8c-300x300.jpg 300w, https://www.bdabek.pl/wp-content/uploads/2025/01/c0d93240-b3c2-4297-b5e7-95558066ff8c-150x150.jpg 150w" sizes="(max-width: 409px) 100vw, 409px" /></p>
<p>Dziś chciałbym się podzielić subiektywnymi wskazówkami &#8211; tudzież doświadczeniami &#8211; jak, jako programista radzę sobie ze stresem w pracy (i nie tylko). Temat wydaje mi się o tyle istotny, że <strong>każdy przeżywa jakiś stres</strong>. Praca programisty na pierwszy rzut oka wydaje się bezstresowa i lekka &#8211; przecież nie narażamy niczyjego zdrowia. Dokładnie takie stwierdzenie usłyszałem ostatnio od znajomego. Nie chciało mi się tłumaczyć, jak szeroki zakres ma dziś IT i na jakie aspekty życia nasza branża wpływa. Mam świadomość, że nie każdy potrafi sobie poradzić ze stresem, dlatego chcę dać Ci pięć przykładów, jak to jest u mnie. Wydaje mi się, że wyszedł całkiem ciekawy artykuł i mam nadzieję, że będziesz zainspirowany / zainspirowana.</p>
<p>W dzisiejszym artykule dowiesz się, jak radzę sobie ze stresem poprzez:</p>
<ul>
<li><a href="#aktywnosc_fizyczna"><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f3c3.png" alt="🏃" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Aktywność fizyczną</strong></a></li>
<li><a href="#wyzwania_30_dniowe"><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f3af.png" alt="🎯" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Wyzwania 30 dniowe</strong></a></li>
<li><a href="#codzienny_dziennik"><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4dd.png" alt="📝" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Codzienny dziennik</strong></a></li>
<li><a href="#wspomnienia_z_przeszlosci"><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f50e.png" alt="🔎" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Wspomnienia z przeszłości</strong></a></li>
<li><a href="#wiara"><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f64c.png" alt="🙌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Wiarę</strong></a></li>
</ul>
<hr />
<h2><h2 id="aktywnosc_fizyczna"> <a href="#aktywnosc_fizyczna"><span class="dashicons dashicons-admin-links"></span></a><strong>Aktywność fizyczna <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f3c3.png" alt="🏃" class="wp-smiley" style="height: 1em; max-height: 1em;" /></strong></h2></h2>
<div>Kończąć liceum i idąc na pierwsze studia &#8211; zarządzanie, które skończyłem po 8 tygodniach &#8211; ważyłem 87 kilogramów. To był 2013 rok. Byłem kulką, kochałem jedzenie (nadal je kocham) i nie miałem w ogóle świadomości żywieniowej. <strong>Mój brzuch był śmietnikiem.</strong> Wszystko co można było zjeść, jadłem. W tamtym też czasie dostałem pierwszego smart phone&#8217;a &#8211; dzięki Bogu za to. Dlaczego? Zaraz po tym, jak go dostałem zainstalowałem jakąś aplikację do ćwiczeń. Początkowo ćwiczyłem nieregularnie, ale miesiąc po miesiącu, rok po roku i wykształtowałem nawyk regularnego ćwiczenia. Pisząc ten artkuł mamy 2025 rok, a ja nadal ćwiczę. Oczywiście jest to już całkowicie inny rodzaj ćwiczeń niż te z roku 2013. Ćwiczę regularnie, minimum trzy razy w tygodniu (poniedziałek, środa, piątek), a ich intensywność uzależniam od tego, jak czuję się danego dnia.</div>
<div><a href="https://www.bdabek.pl/jak-programista-moze-radzic-sobie-ze-stresem/stres_1/" rel="attachment wp-att-3289"><img decoding="async" class="aligncenter size-full wp-image-3289" src="https://www.bdabek.pl/wp-content/uploads/2025/01/stres_1.jpg" alt="Osoba wiążąca buty do biegania" width="700" height="200" srcset="https://www.bdabek.pl/wp-content/uploads/2025/01/stres_1.jpg 700w, https://www.bdabek.pl/wp-content/uploads/2025/01/stres_1-300x86.jpg 300w" sizes="(max-width: 700px) 100vw, 700px" /></a></div>
<p>W moim przekonaniu dowolna aktywność fizyczna pomaga i rozwija w bardzo wielu aspektach. Co rozumiem przez aktywność? Dla mnie jest to dowolny ruch ciała, zwiększający zużycie kalorii. Dla jednego to będzie kilku kilometrowy spacer, dla innego wyczerpujący trening kilka razy w tygodniu, a kolejnemu jakaś gra zespołowa, np. siatkówka, piłka nożna, squash, etc. Ja na przestrzeni ostatnich 7 lat wykształtowałem sobie nawyki w różnych rodzajach ćwiczeń. Obecnie są to głównie sporty indywidualne, gdzie jedyną osobą, z którą się challenguję jestem sam&#8230; <strong>i to mi odpowiada</strong>.</p>
<h5>Nie bój się porażek</h5>
<p>W pierwszych latach, gdy nieświadomie kształtowałem nawyk aktywności fizycznej lubiłem gry zespołowe &#8211; szczególnie siatkówkę i siatkówkę plażową (nadal je lubię!). Natomiast do tego potrzebny jest zespół. Oprócz tego trzeba reprezentować poziom zależny od tego z kim grasz. Ja byłem przeciętny. Miałem wzrost (190cm) i to było jakimś plusem, coś tam umiałem ściąć, wyblokować i wystawić, ale bez rewelacji + <strong>robiłem sporo błędów</strong>. I właśnie te przyczyniły się do tego, że uznałem iż się nie nadaję. Nie mam talentu, żeby grać na wystarczająco dobrym poziomie, który by mnie zadowalał + nie chciałem psuć zabawy innym.</p>
<p><a href="https://www.bdabek.pl/jak-programista-moze-radzic-sobie-ze-stresem/stres_2/" rel="attachment wp-att-3296"><img decoding="async" class="aligncenter wp-image-3296" src="https://www.bdabek.pl/wp-content/uploads/2025/01/stres_2.jpg" alt="Osoba oglądająca w TV inną osobę, która biegnie" width="607" height="607" srcset="https://www.bdabek.pl/wp-content/uploads/2025/01/stres_2.jpg 1080w, https://www.bdabek.pl/wp-content/uploads/2025/01/stres_2-300x300.jpg 300w, https://www.bdabek.pl/wp-content/uploads/2025/01/stres_2-1024x1024.jpg 1024w, https://www.bdabek.pl/wp-content/uploads/2025/01/stres_2-150x150.jpg 150w, https://www.bdabek.pl/wp-content/uploads/2025/01/stres_2-768x768.jpg 768w" sizes="(max-width: 607px) 100vw, 607px" /></a></p>
<p>Od roku 2016 zacząłem biegać. Do biegów miałem przeważnie kompana, który przez około 3 lata chętnie się dołączał. Później pojawiła mu się dwójka dzieci i ciężko było wychodzić na wspólne bieganie. Taka kolej rzeczy, <strong>priorytety się zmieniają</strong>. Natomiast te 3 lata wystarczyły do tego, żebym się wkręcił. Pokochałem bieganie, szczególnie po lesie. Teraz rocznie staram się przebiec minimum 365 kilometrów &#8211; 1 kilometr dziennie. Chociaż mówiąc trochę nawiasem, a trochę się chwaląc, w 2024 wyszło mi ich 606. Dodatkowo od 2019 roku, kiedy w Polsce robi się wiosennie, zaczynam jeździć rowerem. W ciągu 5 lat nauczyłem się siebie i wiem jaka jazda najbardziej mi odpowiada. Lubię szybko i nie za długo &#8211; trasy najlepiej do max. 2 godzin (choć czasem fajnie jest zrobić odskocznię). Historia pokazuje, że średnio moje trasy mają 20-30km i zajmują około godziny.</p>
<h5>Jak zacząć?</h5>
<p>Co bym polecił osobie, która nie ćwiczy, nie zna się na tym, ale chce coś zmienić? Zacząć <strong>być aktywnym dziś, teraz!</strong> Moja świadomość i wiedza w zakresie aktywności fizycznej jest o kilka rzędów wielkości większa niż jak zaczynałem, ale zacząć od czegoś musiałem. Bardzo często biegając po lesie porównywałem sobie przebiegnięcie 1 kilometra do czasu straconego na youtubie. I co, że obejrzę jakiś filmik, który nic nie wnosi (albo wnosi mało) do mojego życia? Nic, to tylko stracone minuty życia. Zresztą&#8230;aktywność da się łączyć z nauką czy treściami rozrywkowymi. Z tym pierwszym jest to mało efektywne, ale z tym drugim &#8211; przyjemne z pożytecznym.</p>
<p>Podsumowując ten akapit, aktywność fizyczna to sprawdzony i <strong>potwierdzony</strong> przez wiele osób i badań<strong> sposób na radzenie sobie ze stresem</strong>. Podczas ćwiczeń, w zależności co będziesz robić, możesz wyładować negatywne emocje, wyciszyć się, wypocić, przemyśleć wiele tematów, poszukać inspiracji. Regularnie ćwicząć zwiększasz odporność na stres. Same korzyści. Ja polecam, jeżeli jeszcze tego nie robisz, zacznij. Nie pożałujesz.</p>
<hr />
<h2><h2 id="wyzwania_30_dniowe"> <a href="#wyzwania_30_dniowe"><span class="dashicons dashicons-admin-links"></span></a><strong>Wyzwania 30 dniowe </strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f3af.png" alt="🎯" class="wp-smiley" style="height: 1em; max-height: 1em;" /></h2></h2>
<p>Czym są wyzwania 30 dniowe wedle moich reguł? Jest to lista czynności do wykonania. Lista zawiera zazwyczaj 8-10 elementów &#8211; w zależności od roku. Każdy element z listy powtarzam <strong>codziennie, przez 30 dni</strong>. Jeżeli zrobię przerwę podczas trwania wyzwania (nawet w 29 dniu), to wyzwanie powtarzam jeszcze raz przez całe 30 dni. Bez względu na chorobę czy ból, mam przejść cały cykl. Czy zdarzyło mi się, że powtarzałem cykl? Tak. Czy zdarzyło mi się, żebym zrobił wyjątej od tej reguły &#8211; tak.</p>
<p><a href="https://www.bdabek.pl/jak-programista-moze-radzic-sobie-ze-stresem/stres_3/" rel="attachment wp-att-3319"><img decoding="async" class="aligncenter wp-image-3319" src="https://www.bdabek.pl/wp-content/uploads/2025/01/stres_3.webp" alt="Wspinaczka górska" width="560" height="560" srcset="https://www.bdabek.pl/wp-content/uploads/2025/01/stres_3.webp 1080w, https://www.bdabek.pl/wp-content/uploads/2025/01/stres_3-300x300.webp 300w, https://www.bdabek.pl/wp-content/uploads/2025/01/stres_3-1024x1024.webp 1024w, https://www.bdabek.pl/wp-content/uploads/2025/01/stres_3-150x150.webp 150w, https://www.bdabek.pl/wp-content/uploads/2025/01/stres_3-768x768.webp 768w" sizes="(max-width: 560px) 100vw, 560px" /></a></p>
<p>Co mi dają wyzwania 30 dniowe? Motywację do działania. Ćwiczą we mnie zaciętość, dają mi cel i możliwość jego osiągnięcia. Bez względu jak się czuję i jaka jest pogoda za oknem, <strong><em>muszę</em></strong> zrobić to co zaplanowałem. Mam przecież całe 24 godziny na wykonanie wyzwania. No dobra, ale co to ma do radzenia sobie ze stresem? Jeszcze aktywność fizyczna to rozumiem, ale jakieś wyzwania? No i dlatego na samym początku tego wpisu informowałem, że jest to moja subiektywna lista sposobów. Natomiast pozwól, że spróbuję udowodnić, że jednak ma.</p>
<h5>Kiedy to robię</h5>
<p>Wyzwania ustalam pod koniec każdego roku, przy okazji podsumowując poprzedni. I to jest u mnie istotny etap. To <strong>od niego zależy, co będę robił przez około 8-10 miesięcy</strong> kolejnego roku codziennie. W jaki sposób wyznaczam wyzwania? Głównie inspiruję się Internetem i (już teraz) historią moich poprzednich wyzwań. Staram się, żeby to było coś, co mnie rozwinie w dowolny sposób &#8211; duchowy, fizyczny, intelektualny. Dowolny. Staram się, żeby było to na tyle ciekawe dla mnie samego, żebym chciał zrobić to na nowo kolejnego dnia &#8211; przynajmniej z początku roku. Podczas samych wyzwań bywa już różnie. Moje aktualne wyzwania możesz śledzić na <a href="https://github.com/BartoszDabek/bdabek.pl/?tab=readme-ov-file#-30-dniowe-wyzwania" target="_blank" rel="noopener">githubie</a>.</p>
<p>Na ten rok obrałem sobie dziewięć wyzwań 30 dniowych. Załóżmy, że pierwsze wyzwanie zacznę 15 stycznia i każde kolejne będę zaczynał pięć dni po poprzednim skończonym. Bez większej matematyki, ale powiedzmy, że mniej więcej w listopadzie skończy się moje ostatnie wyzwanie. To oznacza, że do tego czasu, raz w miesiącu mam poczucie osiągnięcia czegoś, co chciałem. Daje mi to<strong> satysfakcję</strong> i<strong> podbija moje endorfiny</strong>, czy jakiejś tam inne hormony szczęścia i<strong> daje zapał do dalszej pracy</strong>. Podczas wyzwań bywa ciężko. Jeżeli pokonałem przeciwności, jestem silniejszy, odporniejszy &#8211; wiem, że mogę jeżeli chcę.</p>
<hr />
<h2><h2 id="codzienny_dziennik"> <a href="#codzienny_dziennik"><span class="dashicons dashicons-admin-links"></span></a><strong>Codzienny dziennik <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4dd.png" alt="📝" class="wp-smiley" style="height: 1em; max-height: 1em;" /></strong></h2></h2>
<p><img decoding="async" class="wp-image-3323 alignleft" src="https://www.bdabek.pl/wp-content/uploads/2025/01/stres_5.webp" alt="Dziennik" width="234" height="256" srcset="https://www.bdabek.pl/wp-content/uploads/2025/01/stres_5.webp 350w, https://www.bdabek.pl/wp-content/uploads/2025/01/stres_5-274x300.webp 274w" sizes="(max-width: 234px) 100vw, 234px" /></p>
<p>Od 2018 roku prowadzę <a href="https://github.com/BartoszDabek/bdabek.pl/tree/master/daily-notes" target="_blank" rel="noopener">codzienny dziennik</a>. Wpisuję tam <strong>swoje przemyślenia</strong> &#8211; co robiłem wczoraj, co będę robił dziś, za co jestem wdzięczny, na co jestem zły. Pewnego rodzaju daily, sam ze sobą. Można to robić w formie fizycznego dziennika, pliku tekstowego, nagrań głosowych, nagrań video i co jeszcze do głowy przyjdzie. Ja codzienne notatki prowadzę w formie zwykłego pliku tekstowego. Tak mi najbardziej pasuje. Możesz się nim dzielić z innymi, a możesz zachować wyłącznie dla siebie. Jeżeli nigdy przedtem nie robiłeś/aś czegoś podobnego to muszę Cię przestrzec. Prowadzenie dziennika daje wartość pod dwoma warunkami. Po pierwsze robisz to przez dłuższy czas. Osobiście uważam, że co najmniej rok jest już wystarczający, żeby się za to zabrać. Drugim jest przegląd dziennika od czasu do czasu.</p>
<p>Przejdźmy do korelacji dziennika ze stresem według mnie. Mogę tam wyładować swoje negatywne emocje, jeżeli takie się pojawią. Codziennie mogę tam napisać za co jestem wdzięczny. Oczywiście nie zawsze to robię, a nawet powiedziałbym, że rzadko. Natomiast <strong>codziennie coś wpisuję</strong>, dosyć często są to bardzo zbliżone wpisy, ale w kontekście roku jest kilka perełek, nad którymi mogę się głębiej zastanowić. Przegląd dziennika robię raz w roku, na jego koniec. To pomaga mi w sprawdzeniu siebie i podsumowaniu rocznym. Widzę co przechodziłem, jak to przeżywałem i z perspektywy czasu jestem w stanie sprawdzić &#8211; czy to było warte stresu. <strong>Odpowiednio wyciągnięte wnioski są cennymi lekcjami na kolejne lata</strong>.</p>
<h5>Stres zawodowy</h5>
<p>Kolejnym plusem prowadzenia dziennika w kontekście radzenia sobie ze stresem zawodowym jest możliwość ustawienia priorytetów. Ja wpis do takiego dziennika staram się robić <strong>codziennie rano.</strong> To sprawia, że już z samego rana mogę zaplanować tę najważniejszą rzecz, którą chcę/powinienem zrobić. Obecnie nie praktykuję tego codziennie. Właściwie jak to piszę, to myślę, czy by do tego nie wrócić&#8230; Wyplucie na ekran tego, co powinienem zrobić i świadomość, że jutro sam przed sobą to ocenię, może zwiększyć przypływ motywacji, poczucie kontroli i zarazem zredukowanie stresu. Z drugiej strony ciągłe niewykonywanie postawionych celów może tę motywację zabić, a stres zwiększyć.</p>
<p><figure id="attachment_3329" aria-describedby="caption-attachment-3329" style="width: 365px" class="wp-caption aligncenter"><a href="https://www.bdabek.pl/jak-programista-moze-radzic-sobie-ze-stresem/stres_4/" rel="attachment wp-att-3329"><img decoding="async" class="wp-image-3329" src="https://www.bdabek.pl/wp-content/uploads/2025/01/stres_4.webp" alt="Laptop, notatnik, kawa" width="365" height="244" srcset="https://www.bdabek.pl/wp-content/uploads/2025/01/stres_4.webp 730w, https://www.bdabek.pl/wp-content/uploads/2025/01/stres_4-300x200.webp 300w" sizes="(max-width: 365px) 100vw, 365px" /></a><figcaption id="caption-attachment-3329" class="wp-caption-text">Laptop, notatnik, kawa</figcaption></figure></p>
<p>Jeszcze słowem zakończenia tego akapitu, gdybyś chciał(a) zacząć praktykować dziennik. <strong>Nie załamuj się</strong>, jeżeli opuścisz dzień czy dwa. Mnie samemu czasem zdarza się pominąć jakiś dzień, gdy np. mam mnóstwo obowiązków z rana, a później w ciągu dnia całkowicie wylatuje to już z głowy. Z początku to nie będzie Twój nawyk i możliwe, że będziesz musiał(a) sobie przypominać o wpisach. Z czasem natomiast wchodzi to już w krew. Ostatnio będąc nawet na wakacjach, robiłem codzienne wpisy. Zaskakujące dla mnie było to, że były one o wiele dłuższe i bardziej szczegółowe niż te standardowe.</p>
<hr />
<h2><h2 id="wspomnienia_z_przeszlosci"> <a href="#wspomnienia_z_przeszlosci"><span class="dashicons dashicons-admin-links"></span></a><strong>Wspomnienia z przeszłości <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f50e.png" alt="🔎" class="wp-smiley" style="height: 1em; max-height: 1em;" /></strong></h2></h2>
<p>Kolejny niekonwencjonaly sposób radzenia sobie ze stresem jest moja własna historia. A może bardziej jej wspomnienie. W IT jestem od 2018 roku &#8211; 7 lat będzie w lutym. Natomiast moja droga nie była prosta, żeby być tu, gdzie jestem. We <a href="#aktywnosc_fizyczna">wcześniejszym akapicie</a> wspomniałem, że po 8 tygodniach zrezygnowałem ze swoich pierwszych studiów &#8211; zarządzania. W momencie, w którym teraz jestem, uważam, że <strong>to była jedna z lepszych decyzji</strong>, jakie mogłem podjąć. Ten dzień zapewne będę pamiętał do końca życia. Rodzice nie byli z tego powodu zadowoleni &#8211; wręcz odwrotnie, byli na mnie wściekli. A ja w moim planie zakładałem, że to właśnie oni będą mnie utrzymywali. Zastanawiając się teraz głębiej, to nie miałem planu. Na tamten czas chciałem grać w gry i z tego zarabiać.</p>
<p><figure id="attachment_3343" aria-describedby="caption-attachment-3343" style="width: 550px" class="wp-caption alignright"><a href="https://www.bdabek.pl/jak-programista-moze-radzic-sobie-ze-stresem/stres_7/" rel="attachment wp-att-3343"><img decoding="async" class="wp-image-3343" src="https://www.bdabek.pl/wp-content/uploads/2025/01/stres_7.webp" alt="Programista w swojej piwnicy z oknem" width="550" height="550" srcset="https://www.bdabek.pl/wp-content/uploads/2025/01/stres_7.webp 600w, https://www.bdabek.pl/wp-content/uploads/2025/01/stres_7-300x300.webp 300w, https://www.bdabek.pl/wp-content/uploads/2025/01/stres_7-150x150.webp 150w" sizes="(max-width: 550px) 100vw, 550px" /></a><figcaption id="caption-attachment-3343" class="wp-caption-text">Programista w swojej piwnicy z oknem</figcaption></figure></p>
<p>Nie poszło jednak po mojej myśli. Jako, że byłem na utrzymaniu rodziców, to kazali mi iść do pracy. Nie miałem innego wyjścia, bo z gierek nie zarabiałem wystarczająco, aby pozwoliło mi to na utrzymanie się na własną kieszeń. I poszedłem do swojej pierwszej pracy na magazyn w dużym zakładzie meblarskim. Musiałem pracować na 3 zmiany, gdzie były nocki &#8211; a tych nienawidziłem. Po 4 miesiącach wyratowali mnie tato z bratem. Załatwili mi pracę w ich fabryce, gdzie nocek już nie było. Tylko dalej to była praca bez perspektywy, w zamknięciu za drutem. <strong>Trochę jakby w obozie pracy</strong> gdzie musisz przerobić 8 godzin i dopiero możesz wyjść za mur.</p>
<h5>Czas zmiany</h5>
<p>I nadszedł piękny dzień, kiedy i z tej pracy zrezygnowałem, a zająłem się tym, co pokochałem. Byłem już studentem zaocznym 2 roku i wiedziałem, kim chcę być w najbliższej przyszłości. Kryteria miałem dosyć proste &#8211; nie chciałem pracować w zakładzie, zamknięty za ogrodzeniem i zmuszony, żeby tam być przez 8 godzin. <strong>Marzyła mi się praca zdalna i elastyczność z tym związana</strong>. W skrócie opisałem moją historię. Oczywistym jest, że Ciebie ona nie odstresuje i nie pomoże Ci w rozładowaniu stresu. Mnie natomiast tak i pozwól że wyjaśnię w jaki sposób.</p>
<p>Kilka razy miałem taką sytuację, że w backlogu nazbierały mi się ważne, trudne zadania do zrobienia, które nie były pilne. Wiem natomiast, że przyjdzie dzień, kiedy zaczną być pilne, a ich ważność jeszcze bardziej wzrośnie. Nie wiem jak Ty funkcjonujesz, ale u mnie <strong>stres pojawia się podświadomie</strong>. Wspominając zdarzenia z przeszłości, analizując jaką drogę przeszedłem i po co, pomaga mi w załagodzeniu stresu. Ba! Nawet zwiększa motywację do działania! Zdaję sobie sprawę, że u Ciebie to wcale nie musi zadziałać, natomiast <strong>u mnie działa i dlatego się tym dzielę</strong>.</p>
<hr />
<h2><h2 id="wiara"> <a href="#wiara"><span class="dashicons dashicons-admin-links"></span></a><strong>Wiara <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f64c.png" alt="🙌" class="wp-smiley" style="height: 1em; max-height: 1em;" /></strong></h2></h2>
<p><figure id="attachment_3350" aria-describedby="caption-attachment-3350" style="width: 488px" class="wp-caption alignleft"><a href="https://www.bdabek.pl/jak-programista-moze-radzic-sobie-ze-stresem/stres_8/" rel="attachment wp-att-3350"><img decoding="async" class="wp-image-3350 " src="https://www.bdabek.pl/wp-content/uploads/2025/01/stres_8.webp" alt="Madeira &lt;3" width="488" height="365" srcset="https://www.bdabek.pl/wp-content/uploads/2025/01/stres_8.webp 480w, https://www.bdabek.pl/wp-content/uploads/2025/01/stres_8-300x224.webp 300w" sizes="(max-width: 488px) 100vw, 488px" /></a><figcaption id="caption-attachment-3350" class="wp-caption-text">Madeira <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2764.png" alt="❤" class="wp-smiley" style="height: 1em; max-height: 1em;" /></figcaption></figure></p>
<p>Ostatnie, ale <strong>dla mnie najważniejsze</strong>. Celowo umieściłem to na samym końcu, bo rozumiem, że o polityce i religii nie powinno się dyskutować. Nie ukrywam swoich poglądów, ale też się z nimi nie afiszuję. Jestem praktykującym chrześcijaninem. Sam czytam Biblię i się modlę bezpośrednio do Boga. To daje mi nowe siły na każdy dzień i pomaga pokonywać stres. Nie chcę się mocno rozpisywać na ten temat, bo blog o charakterze programistycznym nie jest do tego. Natomiast jeżeli jesteś ciekawy/a, to w komentarzach lub prywatnych wiadomościach możemy o tym podyskutować.</p>
<hr />
<h2>Podsumowanie</h2>
<p><a href="https://www.bdabek.pl/jak-programista-moze-radzic-sobie-ze-stresem/light-bulb-symbol-png/" rel="attachment wp-att-3333"><img decoding="async" class="wp-image-3333 aligncenter" src="https://www.bdabek.pl/wp-content/uploads/2025/01/light-bulb-symbol-png.webp" alt="żaróweczka" width="240" height="268" srcset="https://www.bdabek.pl/wp-content/uploads/2025/01/light-bulb-symbol-png.webp 358w, https://www.bdabek.pl/wp-content/uploads/2025/01/light-bulb-symbol-png-269x300.webp 269w" sizes="(max-width: 240px) 100vw, 240px" /></a></p>
<p>Wyszedł całkiem długi wpis. Jeżeli dotrwałeś do samego końca, to dziękuję. W artykule odsłoniłem dużą część <em>siebie</em>. Mam nadzieję, że nie spojrzysz na to zbyt krytycznie, ale odnajdziesz coś, co da wartość Tobie. Taki jest mój cel.</p>
<p>To są moje główne sposoby na walkę ze stresem. Czy zawsze mi pomagają w 100%? Nie. Ale jak się głębiej nad tym zastanowić, to nie ma takich sposobów. Z pewnością redukują stres, pomagają pokonywać przeciwności &#8211; <strong>jest łatwiej</strong>. Sposobów na walkę ze stresem jest z pewnością więcej. Jeżeli masz swoje sprawdzone sposoby, które u Ciebie działają &#8211; daj znać w komentarzu i pozwól mi lub innym czytelnikom się zainspirować.</p>
<p>Do usłyszenia <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f44b.png" alt="👋" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>Artykuł <a href="https://www.bdabek.pl/jak-programista-moze-radzic-sobie-ze-stresem/">Jak programista może radzić sobie ze stresem🤔. Moich 5 sposobów ✔️</a> pochodzi z serwisu <a href="https://www.bdabek.pl">bdabek.pl</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bdabek.pl/jak-programista-moze-radzic-sobie-ze-stresem/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>Aspekty i Spring 👈</title>
		<link>https://www.bdabek.pl/spring-aop/</link>
					<comments>https://www.bdabek.pl/spring-aop/#comments</comments>
		
		<dc:creator><![CDATA[Bartosz Dąbek]]></dc:creator>
		<pubDate>Thu, 10 Feb 2022 21:26:01 +0000</pubDate>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Spring]]></category>
		<guid isPermaLink="false">https://www.bdabek.pl/?p=2973</guid>

					<description><![CDATA[<p>Spring AOP to nic trudnego jeżeli mamy kawałek fundamentalej wiedzy. Rozbierając na czynniki pierwsze Aspekty i Springa jesteśmy lepiej w stanie pojąć i zrozumieć o co tam chodzi. W dzisiejszym artykule: Aspekty i Spring Koncept Aspektów Rodzaje Advice w AOP Mechanizm Proxy Przykład użycia Programowanie aspektowe (AOP) uzupełnia programowanie obiektowe (OOP), dostarczając innego sposobu myślenia&#8230;&#160;<a href="https://www.bdabek.pl/spring-aop/" rel="bookmark">Dowiedz się więcej &#187;<span class="screen-reader-text">Aspekty i Spring 👈</span></a></p>
<p>Artykuł <a href="https://www.bdabek.pl/spring-aop/">Aspekty i Spring 👈</a> pochodzi z serwisu <a href="https://www.bdabek.pl">bdabek.pl</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Spring AOP to nic trudnego jeżeli mamy kawałek fundamentalej wiedzy. Rozbierając na czynniki pierwsze Aspekty i Springa jesteśmy lepiej w stanie pojąć i zrozumieć o co tam chodzi.</p>
<p>W dzisiejszym artykule:</p>
<ul>
<li><a href="#Aspekty i Spring"><strong>Aspekty i Spring</strong></a></li>
<li><a href="#Koncept Aspektów"><strong>Koncept Aspektów</strong></a></li>
<li><a href="#Rodzaje Advice w AOP"><strong>Rodzaje Advice w AOP</strong></a></li>
<li><a href="#Mechanizm Proxy"><strong>Mechanizm Proxy</strong></a></li>
<li><a href="#Przykład użycia"><strong>Przykład użycia</strong></a></li>
</ul>
<hr />
<h2><h2 id="Aspekty i Spring"> <a href="#Aspekty i Spring"><span class="dashicons dashicons-admin-links"></span></a>Aspekty i Spring</h2></h2>
<p>Programowanie aspektowe (AOP) uzupełnia programowanie obiektowe (OOP), dostarczając innego sposobu myślenia o strukturze programu. Kluczową jednostką modularności programowania obiektowego jest klasa, podczas gdy w AOP <strong>jednostką modularności jest aspekt</strong>. Aspekty umożliwiają modularyzację zagadnień (takich jak zarządzanie transakcjami), które dotyczą wielu typów i obiektów.</p>
<p>AOP jest paradygmatem programowania, który ma na celu zwiększenie modularności. Czyni to poprzez dodawanie dodatkowych zachowań do istniejącego kodu bez modyfikowania samego kodu. Zamiast tego, możemy zadeklarować nowy kod i nowe zachowanie osobno.</p>
<p><a href="https://www.bdabek.pl/spring-aop/aspekty-01/" rel="attachment wp-att-2988"><img decoding="async" class="aligncenter size-full wp-image-2988" src="https://www.bdabek.pl/wp-content/uploads/2022/05/aspekty-01.webp" alt="" width="1224" height="816" srcset="https://www.bdabek.pl/wp-content/uploads/2022/05/aspekty-01.webp 1224w, https://www.bdabek.pl/wp-content/uploads/2022/05/aspekty-01-300x200.webp 300w, https://www.bdabek.pl/wp-content/uploads/2022/05/aspekty-01-1024x683.webp 1024w, https://www.bdabek.pl/wp-content/uploads/2022/05/aspekty-01-768x512.webp 768w, https://www.bdabek.pl/wp-content/uploads/2022/05/aspekty-01-930x620.webp 930w" sizes="(max-width: 1224px) 100vw, 1224px" /></a></p>
<p>Jednym z <strong>kluczowych komponentów Springa jest framework AOP</strong>. Podczas gdy kontener Spring IoC nie zależy od AOP (co oznacza, że nie musisz używać AOP, jeśli nie chcesz), AOP uzupełnia Spring IoC, aby zapewnić wydajne rozwiązania. AOP w Springu jest używant m.in. do:</p>
<ul>
<li>Dostarczania deklaratywnych usług &#8211; najważniejszą taką usługą jest <a href="https://www.bdabek.pl/jak-dziala-adnotacja-transactional-w-springu/" target="_blank" rel="noopener">zarządzanie transakcjami</a>.</li>
<li>Pozwala użytkownikom implementować niestandardowe aspekty, uzupełniając ich użycie OOP o AOP.</li>
</ul>
<hr />
<h2><h2 id="Koncept Aspektów"> <a href="#Koncept Aspektów"><span class="dashicons dashicons-admin-links"></span></a>Koncept Aspektów</h2></h2>
<p>Aby lepiej zrozumieć działanie i odsłonić magię aspektów, trzeba się zapoznać z tym jak ten mechanizm działa. Spójrz na obrazek i przejdź do opisu definicji, aby lepiej poznać konept aspektów.</p>
<p><a href="https://www.bdabek.pl/spring-aop/aspekty-02/" rel="attachment wp-att-2990"><img decoding="async" class="aligncenter size-full wp-image-2990" src="https://www.bdabek.pl/wp-content/uploads/2022/05/aspekty-02.webp" alt="" width="1183" height="845" srcset="https://www.bdabek.pl/wp-content/uploads/2022/05/aspekty-02.webp 1183w, https://www.bdabek.pl/wp-content/uploads/2022/05/aspekty-02-300x214.webp 300w, https://www.bdabek.pl/wp-content/uploads/2022/05/aspekty-02-1024x731.webp 1024w, https://www.bdabek.pl/wp-content/uploads/2022/05/aspekty-02-768x549.webp 768w" sizes="(max-width: 1183px) 100vw, 1183px" /></a></p>
<h3><h3 id="JoinPoint"> <a href="#JoinPoint"><span class="dashicons dashicons-admin-links"></span></a>JoinPoint</h3></h3>
<p>Joinpoint jest punktem podczas wykonywania programu, takim jak wykonanie metody lub obsługa wyjątku. <strong>W Spring AOP, JoinPoint zawsze reprezentuje wykonanie metody.</strong></p>
<h3><h3 id="Pointcut"> <a href="#Pointcut"><span class="dashicons dashicons-admin-links"></span></a>Pointcut</h3></h3>
<p>Poincut jest predykatem, który pomaga dopasować poradę (Advice), która ma być zastosowana przez Aspekt w konkretnym JoinPoincie. Często kojarzymy Advice z Pointcutem i jest ona uruchamiana w dowolnym JoinPoincie dopasowanym przez ten Poincut.</p>
<h3><h3 id="Advice"> <a href="#Advice"><span class="dashicons dashicons-admin-links"></span></a>Advice</h3></h3>
<p>Advice jest akcją podejmowaną przez aspekt w konkretnym JoinPoincie. Są różne typy porad, o czym w <a href="#Rodzaje Advice w AOP">kolejnym punkcie</a>. W Springu, Advice jest modelowany jako interceptor, utrzymujący łańcuch interceptorów wokół Joinpoint.</p>
<hr />
<h2><h2 id="Rodzaje Advice w AOP"> <a href="#Rodzaje Advice w AOP"><span class="dashicons dashicons-admin-links"></span></a>Rodzaje Advice w AOP</h2></h2>
<p><a href="https://www.bdabek.pl/spring-aop/aspekty-03/" rel="attachment wp-att-2999"><img decoding="async" class="aligncenter size-full wp-image-2999" src="https://www.bdabek.pl/wp-content/uploads/2022/05/aspekty-03.webp" alt="" width="602" height="217" srcset="https://www.bdabek.pl/wp-content/uploads/2022/05/aspekty-03.webp 602w, https://www.bdabek.pl/wp-content/uploads/2022/05/aspekty-03-300x108.webp 300w" sizes="(max-width: 602px) 100vw, 602px" /></a></p>
<p>Spring AOP zawiera następujące rodzaje porad:</p>
<ul>
<li><strong>Before advice</strong> &#8211; porada, która działa przed JoinPointem, ale która nie ma możliwości zatrzymania wykonania programu (chyba, że rzuci wyjątek).</li>
<li><strong>After returning advice </strong>&#8211; porada, którą należy uruchomić po normalnym zakończeniu JoinPointu (na przykład, jeśli metoda powróci bez rzucenia wyjątku).</li>
<li><strong>After throwing advice </strong>&#8211; porada, którą należy uruchomić, jeśli metoda zakończy działanie rzucając wyjątek.</li>
<li><strong>After (finally) advice </strong>&#8211; porada, którą należy uruchomić niezależnie od sposobu, w jaki JoinPoint wychodzi z wykonania (normalny lub zakończony wyjątkiem).</li>
<li><strong>Around advice </strong>&#8211; porada, która otacza JoinPoint, taki jak wywołanie metody. Jest to najpotężniejszy rodzaj porady. Wokół porady może wykonywać niestandardowe zachowanie przed i po wywołaniu metody. Jest ona również odpowiedzialna za wybór, czy kontynuować wykonanie do punktu złączenia (JoinPointu), czy też skrócić wykonanie zalecanej metody poprzez zwrócenie własnej wartości lub rzucenie wyjątku.</li>
</ul>
<hr />
<h2><h2 id="Mechanizm Proxy"> <a href="#Mechanizm Proxy"><span class="dashicons dashicons-admin-links"></span></a>Mechanizm Proxy</h2></h2>
<p>Spring AOP do utworzenia proxy dla danego obiektu docelowego używa albo:</p>
<ul>
<li>dynamicznych proxy JDK</li>
<li>albo CGLIB</li>
</ul>
<p>Dynamiczne proxy JDK są wbudowane w JDK, podczas gdy CGLIB jest powszechną biblioteką definicji klas o otwartym kodzie źródłowym (przepakowaną do spring-core).</p>
<p>Jeśli obiekt docelowy, który ma być <em>proxowany</em>, implementuje przynajmniej jeden interfejs, używane jest dynamiczne proxy JDK.  Natomiast jeżeli obiekt docelowy nie implementuje żadnych interfejsów, tworzone jest proxy przez CGLIB.</p>
<p><a href="https://www.bdabek.pl/spring-aop/aspekty-04/" rel="attachment wp-att-3002"><img decoding="async" class="aligncenter size-full wp-image-3002" src="https://www.bdabek.pl/wp-content/uploads/2022/05/aspekty-04.webp" alt="" width="1279" height="630" srcset="https://www.bdabek.pl/wp-content/uploads/2022/05/aspekty-04.webp 1279w, https://www.bdabek.pl/wp-content/uploads/2022/05/aspekty-04-300x148.webp 300w, https://www.bdabek.pl/wp-content/uploads/2022/05/aspekty-04-1024x504.webp 1024w, https://www.bdabek.pl/wp-content/uploads/2022/05/aspekty-04-768x378.webp 768w" sizes="(max-width: 1279px) 100vw, 1279px" /></a></p>
<p>&nbsp;</p>
<hr />
<h2><h2 id="Przykład użycia"> <a href="#Przykład użycia"><span class="dashicons dashicons-admin-links"></span></a>Przykład użycia</h2></h2>
<p>Zaczynamy od napisania Join Pointu &#8211; czyli <strong>w</strong> <strong>przypadku springa będzie to jakaś metoda</strong>.</p><pre class="crayon-plain-tag">@Component
public class BusinessClass{
    public void validateTransaction() {
        System.out.println("...validating");
    }
}</pre><p>Definijuemy Aspect, Pointcuty oraz Advice&#8217;y. Pointcuty można definiować oddzielnie a później wykorzystywać jako <em>&#8217;metodę&#8217; </em>w Advice.</p><pre class="crayon-plain-tag">@Aspect
@Component
public class LoggingAspect {

    @Pointcut("execution(* BusinessClass.validateTransaction(..))")
    public void logAfter() {
        //pointcut
    }

    @Before("execution(* BusinessClass.validateTransaction())")     //point-cut expression
    public void logBefore(JoinPoint joinPoint) {
        System.out.println("BusinessClass.logBefore() : " + joinPoint.getSignature().getName());
    }

    @AfterReturning(pointcut = "logAfter()")
    public void logujWyjscieZUslugi(JoinPoint joinPoint) {
        System.out.println("BusinessClass.afterRetuning() : " + joinPoint.getSignature().getName());
    }
}</pre><p>Po wywołaniu metody, na którą Aspekt był założony wynik naszego programu jest następujący:</p><pre class="crayon-plain-tag">BusinessClass.logBefore() : validateTransaction
...validating
BusinessClass.afterRetuning() : validateTransaction</pre><p></p>
<hr />
<h2>Podsumowanie</h2>
<p><a href="https://www.bdabek.pl/spring-boot-i-logi-ustawienia-logbacka/lightbulb/" rel="attachment wp-att-976" data-slb-active="1" data-slb-asset="1379905354" data-slb-internal="976"><img decoding="async" class="aligncenter wp-image-976 size-thumbnail lazyloaded" src="https://cdn.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_150,h_150/https://www.bdabek.pl/wp-content/uploads/2020/05/Lightbulb-150x150.jpg" alt="" width="150" height="150" data-src="https://cdn.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_150,h_150/https://www.bdabek.pl/wp-content/uploads/2020/05/Lightbulb-150x150.jpg" /></a></p>
<p>Mechanizm AOP z pewnością jest jednym z bardziej zaawansowanych technik programowania, która w pewnym momencie kariery staje się niezbędna. Aspekty pozwalają nam na wszechstronność pisania kodu. Za ich pomocą możemy bezinwazyjnie m.in. dodać logi audytu, lub transakcyjność. Jednak z doświadczeniem przychodzi pewna pokora i chciałbym ustrzec wszystkich podjaranych, że <strong>czytelność i utrzymanie kodu jest ważniejsze</strong> niż kod napisany <em>fajnie</em>. Z tego powodu raczej odradzam dodawanie biznes case&#8217;ów w postaci aspektów. Pamiętaj, ten kod ktoś musi później utrzymać.</p>
<p>Źródła:</p>
<ul>
<li><a href="https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#aop">https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#aop</a></li>
<li><a href="https://howtodoinjava.com/spring-aop-tutorial/">https://howtodoinjava.com/spring-aop-tutorial/</a></li>
<li><a href="https://www.baeldung.com/spring-aop">https://www.baeldung.com/spring-aop</a></li>
<li><a href="https://blog.allegro.tech/2014/12/aspects-in-spring.html">https://blog.allegro.tech/2014/12/aspects-in-spring.html</a></li>
</ul>
<p>Artykuł <a href="https://www.bdabek.pl/spring-aop/">Aspekty i Spring 👈</a> pochodzi z serwisu <a href="https://www.bdabek.pl">bdabek.pl</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bdabek.pl/spring-aop/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Wyjątki. Czego unikać?</title>
		<link>https://www.bdabek.pl/wyjatki-czego-unikac/</link>
					<comments>https://www.bdabek.pl/wyjatki-czego-unikac/#comments</comments>
		
		<dc:creator><![CDATA[Bartosz Dąbek]]></dc:creator>
		<pubDate>Wed, 10 Feb 2021 19:04:16 +0000</pubDate>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">https://www.bdabek.pl/?p=2852</guid>

					<description><![CDATA[<p>Java pozwala nam na używanie wyjątków do czego sobie zapragniemy. Jako developerzy wiemy natomiast, że wyjątki służą do sytuacji wyjątkowych i mamy do nich jakiś szacunek. Jednak, kiedy przychodzi do zaprojektowania pewnej części systemu zdarza nam się popełniać wykroczenia. Być może nie kosztują one nas za wiele, ale świadczą o niechlujstwie, co nie jest dobrą&#8230;&#160;<a href="https://www.bdabek.pl/wyjatki-czego-unikac/" rel="bookmark">Dowiedz się więcej &#187;<span class="screen-reader-text">Wyjątki. Czego unikać?</span></a></p>
<p>Artykuł <a href="https://www.bdabek.pl/wyjatki-czego-unikac/">Wyjątki. Czego unikać?</a> pochodzi z serwisu <a href="https://www.bdabek.pl">bdabek.pl</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Java pozwala nam na używanie wyjątków do czego sobie zapragniemy. Jako developerzy wiemy natomiast, że wyjątki służą do <strong>sytuacji wyjątkowych</strong> i mamy do nich jakiś <em>szacunek</em>. Jednak, kiedy przychodzi do zaprojektowania pewnej części systemu zdarza nam się popełniać wykroczenia. Być może nie kosztują one nas za wiele, ale świadczą o niechlujstwie, co nie jest dobrą cechą.</p>
<hr />
<h3>Cześć <img decoding="async" class="emoji" role="img" draggable="false" src="https://s.w.org/images/core/emoji/12.0.0-1/svg/1f642.svg" alt="&#x1f642;" /></h3>
<p>Na wstępie zaznaczę, że nie jest to pełna lista, czego warto unikać przy pracy z wyjątkami. Są to jednak przypadki, które zdarza mi się widzieć w kodzie produkcyjnym, a czasami bywa, że sam dokładam do tego jakąś cegiełkę (z czego nie jestem specjalnie dumny).</p>
<p><strong>Jeżeli masz jakiś pattern do dodania, napisz w komentarzu. Zaktualizuję listę.</strong></p>
<p>W dzisiejszym artykule:</p>
<ul>
<li><a href="#Zbyt szczegółowe informacje"><strong>Zbyt szczegółowe informacje</strong></a></li>
<li><a href="#Przerzucanie wyżej"><strong>Przerzucanie wyżej</strong></a></li>
<li><a href="#Dziesiątki podtypów"><strong>Dziesiątki podtypów</strong></a></li>
<li><a href="#Uciszanie wyjątkowych sytuacji"><strong>Uciszanie wyjątkowych sytuacji</strong></a></li>
<li><a href="#Finally z ostatecznym zdaniem"><strong>Finally z ostatecznym zdaniem</strong></a></li>
</ul>
<hr id="Zbyt szczegółowe informacje" />
<p><h2 id="Zbyt szczegółowe informacje"> <a href="#Zbyt szczegółowe informacje"><span class="dashicons dashicons-admin-links"></span></a>Zbyt szczegółowe informacje</h2></p>
<p>Zdarzyło Ci kiedykolwiek się zobaczyć stack trace błędu aplikacji tam, gdzie nie powinno go być? A może sam napisałeś kod, który podobne bagienko wyrzucał na zewnątrz?</p>
<p><a href="https://www.bdabek.pl/wyjatki-czego-unikac/stacktrace/" rel="attachment wp-att-2858"><img decoding="async" class="aligncenter size-full wp-image-2858" src="https://www.bdabek.pl/wp-content/uploads/2021/02/stacktrace.png" alt="" width="1338" height="700" srcset="https://www.bdabek.pl/wp-content/uploads/2021/02/stacktrace.png 1338w, https://www.bdabek.pl/wp-content/uploads/2021/02/stacktrace-300x157.png 300w, https://www.bdabek.pl/wp-content/uploads/2021/02/stacktrace-1024x536.png 1024w, https://www.bdabek.pl/wp-content/uploads/2021/02/stacktrace-768x402.png 768w" sizes="(max-width: 1338px) 100vw, 1338px" /></a></p>
<p>Jestem przekonany, że się z tym spotkałeś. Pamiętaj aby <strong>nie dawać końcowym użytkownikom zbyt szczegółowych informacji, gdy nie powinni mieć do niej dostępu</strong>. Co to znaczy nie powinni mieć dostępu?</p>
<p>Pisząc oprogramowanie, np. dla instytucji finansowej, na 100% nie chcesz zdradzać używanych technologii i frameworków. Nie jest jasne dlaczego wystąpił błąd (w teorii takie sytuacje przecież nie powinny się wydarzyć bo to wyjątki) i kto go spowodował. Być może ktoś właśnie przeprowadza atak i zbiera dodatkowe informacje. Ujawienie zbyt wielu szczegółów otwiera nowe wektory ataku &#8211; można wnioskować które wersje bibliotek są używane i szukać pod nie payload&#8217;ów.</p>
<hr id="Przerzucanie wyżej" />
<p><h2 id="Przerzucanie wyżej"> <a href="#Przerzucanie wyżej"><span class="dashicons dashicons-admin-links"></span></a>Przerzucanie wyżej</h2></p>
<p>Kolejnym często spotyknanym <em>mechanizmem</em> jest wyrzucanie wyjątków warstwę wyżej. Celowo użyłem słowa <strong>mechanizm</strong>, zamiast <em>błąd</em>. Ile razy zdarzyło Ci się widzieć jakiś <strong>Checked Exception</strong> (nie pasuje mi tu spolszczenie tego słowa), definiowany na poziomie metody w jakimś serwisie a następnie propagowanym w górę? A właściwie to wyżej i wyżej i tak aż do samego kontrolera.. który, też próbuje wyrzucić to warstwę wyżej.</p><pre class="crayon-plain-tag">class Controller {
  public Response serwis() throws Exception {
    return Response.of(new Service().metodaSerwisowa());
  }
}

class Service {
  public String metodaSerwisowa() throws Exception {
    return prywatnaMetodaSerwisowa();
  }

  private String prywatnaMetodaSerwisowa() throws Exception {
    // logika wyrzucająca Exception
    return "Nie istotne";
  }
}</pre><p><strong>Łap wyjątki jak najszybciej. </strong>Wacham się, żeby to napisać, bo wszystko zależy od kontekstu, <strong>ALE</strong> jeżeli nie wiesz jak obsłużyć ten wyjątek (nie jesteś pewny czy ktokolwiek powinien go łapać), zamień go na <strong>Runtime Exception</strong>. W przypadku błędu skończysz właściwie z tym samym.</p>
<hr id="Dziesiątki podtypów" />
<p><h2 id="Dziesiątki podtypów"> <a href="#Dziesiątki podtypów"><span class="dashicons dashicons-admin-links"></span></a>Dziesiątki podtypów</h2></p>
<p>Zdarzyło Ci się widzieć lub definiować specyficzne wyjątki dla poszczególnych case&#8217;ów tylko po to aby łatwiej móc zdiagnozować jego wystąpienie?</p>
<p><a href="https://www.bdabek.pl/wyjatki-czego-unikac/exceptions/" rel="attachment wp-att-2862"><img decoding="async" class="aligncenter size-full wp-image-2862" src="https://www.bdabek.pl/wp-content/uploads/2021/02/exceptions.png" alt="" width="339" height="165" srcset="https://www.bdabek.pl/wp-content/uploads/2021/02/exceptions.png 339w, https://www.bdabek.pl/wp-content/uploads/2021/02/exceptions-300x146.png 300w" sizes="(max-width: 339px) 100vw, 339px" /></a></p>
<p>Jest mi głupio, bo sam w to brnąłem. Tworzyłem nowe <em>wyspecjalizowane</em> wyjątki, których nie miałem zamiaru obsługiwać. <strong>Definiujesz customowy wyjątek</strong>? <strong>Rób to tylko i wyłącznie w przypadku, gdy wiesz, że będziesz go obsługiwał</strong>!</p>
<hr id="Uciszanie wyjątkowych sytuacji" />
<p><h2 id="Uciszanie wyjątkowych sytuacji"> <a href="#Uciszanie wyjątkowych sytuacji"><span class="dashicons dashicons-admin-links"></span></a>Uciszanie wyjątkowych sytuacji</h2></p>
<p>Co powiesz o takim kodzie? Zdarzyło Ci się widzieć lub napisać coś takiego?</p><pre class="crayon-plain-tag">public String doSmth() {
  try {
    businessMethodThatThrowsException();
  } catch(Exception e) {
    // TODO:
  }
}</pre><p><strong>Skoro już obsługujesz wyjątek, to zostaw po nim ślad!</strong> Unikaj łapania i wygłuszania wyjątków! Sama nazwa wyjątków mówi, że są to sytuacje wyjątkowe. Jeżeli już wydarzyła się ta wyjątkowa sytuacja, lepiej niech poleci jakakolwiek informacja na stdout. Dlaczego? Będziesz mieć więcej informacji o systemie z jakim pracujesz! Jeżeli będzie to bardzo uciążliwe, to ktoś się tym na pewno zajmie.</p>
<hr id="Finally z ostatecznym zdaniem" />
<p><h2 id="Finally z ostatecznym zdaniem"> <a href="#Finally z ostatecznym zdaniem"><span class="dashicons dashicons-admin-links"></span></a>Finally z ostatecznym zdaniem</h2></p>
<p>Java działa w taki sposób, że to blok finally ma ostateczne zdanie. Jeżeli kod wyrzuca wyjątek w bloku <em>try</em>, a następnie również w <em>finally</em>, to ostatecznie ten drugi będzie propagowany. Rozważ taki przykład, jak myślisz, co zostanie wyrzucone?</p><pre class="crayon-plain-tag">public String doSmth() {
  try {
    throw new IllegalArgumentException("try");
  } catch (RuntimeException e) {
    throw new IllegalStateException("catch", e);
  } catch (Exception e) {
    // nigdy się nie wykona
    System.out.println("oo?");
  }
  finally {
    throw new RuntimeException("finally");
  }
}</pre><p>Jeżeli powiedziałeś <em>RuntimeException</em>, to masz rację. Spójrz, jaki jest tutaj problem. <strong>Straciłeś informację o prawdziwym problemie</strong>. Pamiętaj, blok <em>finally</em> <strong>ZAWSZE</strong> ma ostatnie zdanie!</p>
<hr />
<h2>Podsumowanie</h2>
<p><a href="https://www.bdabek.pl/spring-boot-i-logi-ustawienia-logbacka/lightbulb/" rel="attachment wp-att-976" data-slb-active="1" data-slb-asset="1379905354" data-slb-internal="976"><img decoding="async" class="aligncenter wp-image-976 size-thumbnail lazyloaded" src="https://cdn.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_150,h_150/https://www.bdabek.pl/wp-content/uploads/2020/05/Lightbulb-150x150.jpg" alt="" width="150" height="150" data-src="https://cdn.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_150,h_150/https://www.bdabek.pl/wp-content/uploads/2020/05/Lightbulb-150x150.jpg" /></a></p>
<p>Nie jest to może za obszerny artykuł, natomiast są to sytuacje, które zdarza nam się widzieć i czasami popełniać. Jeżeli masz jakieś inne patterny do dodania, to dziel się śmiało :).</p>
<p>Źródła:</p>
<ul>
<li><strong><a href="https://youtu.be/LRwCE7GreSM">Victor Rentea &#8211; The Definitive Guide to Working with Exceptions in Java</a></strong></li>
<li><a href="http://victorrentea.ro/blog/presenting-exceptions-to-users/"><strong>Presenting Exceptions to Users</strong></a></li>
<li><a href="http://victorrentea.ro/blog/exception-handling-guide-in-java/"><strong>Exception Handling Guide in Java</strong></a></li>
</ul>
<p>Artykuł <a href="https://www.bdabek.pl/wyjatki-czego-unikac/">Wyjątki. Czego unikać?</a> pochodzi z serwisu <a href="https://www.bdabek.pl">bdabek.pl</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bdabek.pl/wyjatki-czego-unikac/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>Certyfikacja z Javy. Egzamin OCA i Moje Wnioski</title>
		<link>https://www.bdabek.pl/certyfikacja-z-javy/</link>
					<comments>https://www.bdabek.pl/certyfikacja-z-javy/#comments</comments>
		
		<dc:creator><![CDATA[Bartosz Dąbek]]></dc:creator>
		<pubDate>Thu, 28 Jan 2021 11:00:40 +0000</pubDate>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">https://www.bdabek.pl/?p=2797</guid>

					<description><![CDATA[<p>Istnieją różne sposoby na poszerzanie wiedzy w zakresie języka programowania: własna aplikacja, udział w projektach open source, kursy, szkolenia. Większość z tych metod nie wydaje jednak poświadczenia, że faktycznie umiemy, to co umiemy. Na kursie czy szkoleniu mogliśmy przecież tylko być&#8230; Jak zatem potwierdzić, że faktycznie umiemy, to co deklarujemy? Jeżeli chodzi o poświadczenie wiedzy&#8230;&#160;<a href="https://www.bdabek.pl/certyfikacja-z-javy/" rel="bookmark">Dowiedz się więcej &#187;<span class="screen-reader-text">Certyfikacja z Javy. Egzamin OCA i Moje Wnioski</span></a></p>
<p>Artykuł <a href="https://www.bdabek.pl/certyfikacja-z-javy/">Certyfikacja z Javy. Egzamin OCA i Moje Wnioski</a> pochodzi z serwisu <a href="https://www.bdabek.pl">bdabek.pl</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Istnieją różne sposoby na poszerzanie wiedzy w zakresie języka programowania: własna aplikacja, udział w projektach open source, kursy, szkolenia. Większość z tych metod nie wydaje jednak poświadczenia, że faktycznie umiemy, to co umiemy. Na kursie czy szkoleniu mogliśmy przecież tylko być&#8230; Jak zatem potwierdzić, że faktycznie umiemy, to co deklarujemy?</p>
<hr />
<p>Jeżeli chodzi o poświadczenie wiedzy w zakresie Javy, to dobrą metodą jest uzyskanie certyfikatu. Aby otrzymać certyfikat, trzeba zaliczyć egzamin na odpowiednim poziomie — obecnie jest to 65% poprawnych odpowiedzi. Każde podejście to koszt około 1050 złotych (245$). Czy jest to najlepsza forma? Zapewne nie. Szczególnie dlatego, że sam egzamin nie pokazuje tego jak myślimy, a jedynie sprawdza naszą znajomość języka i jego specyfikacji, ale o tym w dalszej części artykułu.</p>
<p>Osobiście mam przeświadczenie, że niewiele osób decyduje się na pozyskiwanie certyfikatów (szczególnie w świecie Javy). Wydaje mi się, że jednym z głównych powodów jest rozpowszechnione myślenie, że certyfikaty niczego nie dają. Dają czy nie dają? Do tego wrócimy jeszcze we wnioskach&#8230;</p>
<p>W artykule będę zamiennie używał słów certyfikat / egzamin. Oba terminy odnoszą się po prostu do podjęcia próby zaliczenia egzaminu, czy też jego konsekwencji — uzyskania certyfikatu.</p>
<p>W dzisiejszym artykule:</p>
<ul>
<li><a href="#Ścieżki certyfikatów"><strong>Ścieżki certyfikatów &#8211; OCA, OCP. Co to?</strong></a></li>
<li><a href="#Przygotowania"><strong>Przygotowania do egzaminu OCA</strong></a></li>
<li><a href="#Zapis na egzamin"><strong>Zapis na egzamin</strong></a></li>
<li><a href="#Przebieg egzaminu"><strong>Przebieg egzaminu</strong></a></li>
</ul>
<hr id="Ścieżki certyfikatów" />
<h2><span style="color: #ff6600;">Ścieżki certyfikatów &#8211; OCA, OCP. Co to?</span></h2>
<p>Certyfikacja z Javy posiada <a href="https://en.wikipedia.org/wiki/Oracle_Certification_Program">kilka możliwych ścieżek</a>. Wybór zależy od potrzeby — naszej lub naszych przełożonych. Nie zawsze jednak<strong> <span style="color: #ff6600;">możemy</span></strong> ot, tak wybrać dowolną ścieżkę certyfikacyjną. Niektóre z egzaminów wymagają spełnienia pewnych warunków wstępnych. Informacje na temat warunków znajdziesz np. na platformie edukacyjnej Oracle&#8217;a lub na stronie konkretnego egzaminu (wpisz nazwę egzaminu — requirements).</p>
<p>Jaka jest różnica między OCA a OCP?</p>
<ul>
<li><a href="https://education.oracle.com/es/java-se-8-programmer-ii/pexam_1Z0-808"><strong>OCA</strong> </a>jest skrótem od <span style="color: #ff6600;"><strong>Oracle Certified Associate.</strong></span> W świecie certyfikacji jest to egzamin identyfikujący się pod nazwą: <span style="color: #ff6600;"><strong>1Z0-808 &#8211; Java SE 8 Programmer I</strong></span>. Obecnie (lipiec, 2022) egzamin składa się z 70 pytań, trwa 150 minut, kosztuje 245$ i aby go zaliczyć, trzeba poprawnie odpowiedzieć na 65% pytań.</li>
<li><a href="https://education.oracle.com/es/java-se-8-programmer-ii/pexam_1Z0-809"><strong>OCP</strong></a>, to skrót od <span style="color: #ff6600;"><strong>Oracle Certified Professional</strong></span>. Jego nazwa w systemie certyfikującym to <span style="color: #ff6600;"><strong>1Z0-809 &#8211; Java SE 8 Programmer II</strong></span>. Na lipiec 2022 egzamin posiada takie same parametry jak OCA, z wyjątkiem liczby pytań,<span style="color: #ff6600;"><strong> która wynosi 85</strong></span>!</li>
</ul>
<p>Zarówno OCA, jak i OCP są egzaminami sprawdzającymi naszą wiedzę w zakresie języka Java. Mają one jasno <span style="color: #ff6600;"><strong>zdefiniowane bloki tematyczne</strong></span>, wokół których możemy się spodziewać pytań. Nie jest więc tak, że zapisując się na egzamin, musimy znać Javę od A do Z. Moim zdaniem egzaminy OCA oraz OCP są najbardziej wiarygodnym poświadczeniem wiedzy w zakresie znajomości języka.</p>
<p>Ścieżka certyfikacji z Javy prezentuje się w sposób pokazany na obrazku poniżej. Jest to zdjęcie z jednego z <a href="https://enthuware.com/">popularniejszych serwisów</a> dających dostęp do zestawów testowych (<em>oczywiście za odpowiednią opłatą</em>).</p>
<p><figure id="attachment_2805" aria-describedby="caption-attachment-2805" style="width: 880px" class="wp-caption aligncenter"><a href="https://enthuware.com/" target="_blank" rel="attachment noopener wp-att-2805"><img decoding="async" class="wp-image-2805 size-full" src="https://www.bdabek.pl/wp-content/uploads/2021/01/java-certification-path-1z0-819.png" alt="" width="880" height="608" srcset="https://www.bdabek.pl/wp-content/uploads/2021/01/java-certification-path-1z0-819.png 880w, https://www.bdabek.pl/wp-content/uploads/2021/01/java-certification-path-1z0-819-300x207.png 300w, https://www.bdabek.pl/wp-content/uploads/2021/01/java-certification-path-1z0-819-768x531.png 768w" sizes="(max-width: 880px) 100vw, 880px" /></a><figcaption id="caption-attachment-2805" class="wp-caption-text">Zdjęcie z serwisu enthuware.com</figcaption></figure></p>
<hr id="Przygotowania" />
<h2><span style="color: #ff6600;">Przygotowania do egzaminu OCA</span></h2>
<p>Cały etap przygotowań podzieliłem na trzy sekcje: <strong><span style="color: #ff6600;">analiza</span>, </strong><strong><span style="color: #ff6600;">teoria</span> </strong>oraz <span style="color: #ff6600;"><strong>praktyka</strong></span></p>
<h3><span style="color: #ff6600;"><strong>Analiza</strong></span></h3>
<p>Na tym etapie nie wiedziałem jeszcze nic, o tym, jak wygląda ścieżka certyfikacyjna. Czym są poszczególne egzaminy, czego się spodziewać, od czego zacząć, jak i na który egzamin się zapisać.</p>
<p>Przed podejściem do egzaminu lepiej mieć wiedzę w tym zakresie. Pozwoli to prawidłowo zaplanować, co musimy powtórzyć, czego musimy się nauczyć, jak zapisać się na egzamin, co mieć ze sobą itp. Na całe szczęście nie trzeba wiedzieć aż tak dużo. Wybierając standardową drogę:</p>
<ol>
<li>Musisz wiedzieć, czym jest OCA, a czym OCP</li>
<li>Jaki jest zakres zagadnień poszczególnych egzaminów</li>
<li>Z jakich materiałów teoretycznych będziesz korzystać (więcej o tym w sekcji Teoria)</li>
<li>Z jakich materiałów praktycznych będziesz korzystać (więcej o tym w sekcji Praktyka)</li>
<li>Jak zapisać się na egzamin</li>
<li>Jak przygotować się do egzaminu online (nie omawiam tego w tym artykule, ale jeżeli jesteś ciekawy/a, daj znać)</li>
</ol>
<p>Jeżeli masz kogoś znajomego, kto przechodził podobną drogę, porozmawiaj z nim! W moim przypadku, kiedy podchodziłem do egzaminu, nie miałem nikogo, kto by przetarł przede mną drogę. Zatem, każdy z tych kroków musiałem eksplorować sam. Dzięki Bogu w Internecie jest ogrom informacji i znając język angielski (a podchodząc do egzaminu, powinieneś znać ten język) bez problemu znajdiesz odpowiedzi na większość pytań.</p>
<h3><span style="color: #ff6600;"><strong>Teoria</strong></span></h3>
<p>Na tym etapie trzeba zapoznać się z materiałem obowiązującym na egzaminie. Może to być przeczytanie książki, która przygotowuje do konkretnego egzaminu lub kurs online. Ja zachęcam do <span style="color: #ff6600;"><strong>wybrania książki</strong></span>! Jeżeli sami przeczytamy i przerobimy zadania, to więcej zostanie w głowie niż po obejrzeniu kursu.</p>
<p>Należy pamiętać, egzamin a programowanie na co dzień, to <span style="color: #ff6600;"><strong>dwa różne światy</strong></span>. Egzamin zawiera pytania pułapki i sprawdzi Twoją znajomość języka oraz składni. Pokusiłbym się nawet o takie stwierdzenie: egzamin postawi Cię w roli <span style="color: #ff6600;"><strong>kompilatora</strong></span>.</p>
<p>Natomiast bez obaw! Egzaminy są przeprowadzane od wielu lat i, pomimo że pytania się zmieniają, to struktura egzaminu <span style="color: #ff6600;"><strong>NIE</strong></span>! I dlatego na przestrzeni lat powstało kilka dobrych materiałów do nauki. Z mojej strony polecę Ci książkę, z której sam korzystałem i jestem zadowolony: <a href="https://amzn.to/3oaWl1m">OCA: Oracle Certified Associate Java SE 8 Programmer I Study Guide: Exam 1Z0-808</a>. Książka typowo pod egzamin. Autorzy dają wiele<span style="color: #ff6600;"><strong> wskazówek</strong> </span>odnośnie do samego egzaminu. Piszą, na co zwracać uwagę i jakich <em>pytań pułapek</em> można się spodziewać. Co więcej, dla każdego z rozdziałów (jest ich 6), <span style="color: #ff6600;"><strong>przygotowany jest zestaw pytań</strong></span>, sprawdzający w praktyce przeczytaną wiedzę. Dla osoby z kilkuletnim doświadczeniem książka wchodzi lekką ręką <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p><a href="https://www.amazon.de/-/pl/dp/1118957407?__mk_pl_PL=%C3%85M%C3%85%C5%BD%C3%95%C3%91&amp;dchild=1&amp;keywords=OCA&amp;qid=1611416356&amp;sr=8-1&amp;linkCode=li3&amp;tag=dabek-21&amp;linkId=3ad8a75f8424a2c08e7384fd4b8c30c8&amp;language=pl_PL&amp;ref_=as_li_ss_il" target="_blank" rel="noopener"><img decoding="async" class="aligncenter" src="//ws-eu.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;ASIN=1118957407&amp;Format=_SL250_&amp;ID=AsinImage&amp;MarketPlace=DE&amp;ServiceVersion=20070822&amp;WS=1&amp;tag=dabek-21&amp;language=pl_PL" border="0" /></a></p>
<p>Inną, również polecaną przez wielu lekturą jest <a href="https://amzn.to/3qMiLaU">OCA Java SE 8 Programmer I Certification Guide by Mala Gupta</a>. Nie czytałem, więc nie mogę z czystym sercem polecić, ale patrząc na recenzje, uważam, że będzie równie wartościowa.</p>
<p><a href="https://www.amazon.de/-/pl/dp/1617293253?__mk_pl_PL=%C3%85M%C3%85%C5%BD%C3%95%C3%91&amp;dchild=1&amp;keywords=oca+java+se+8+programmer+i+certification+guide&amp;qid=1611416931&amp;sr=8-1&amp;linkCode=li3&amp;tag=dabek-21&amp;linkId=0e2212ea23e8ac57f5eb3bf63d964ccb&amp;language=pl_PL&amp;ref_=as_li_ss_il" target="_blank" rel="noopener"><img decoding="async" class="aligncenter" src="//ws-eu.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;ASIN=1617293253&amp;Format=_SL250_&amp;ID=AsinImage&amp;MarketPlace=DE&amp;ServiceVersion=20070822&amp;WS=1&amp;tag=dabek-21&amp;language=pl_PL" alt="" width="200" height="250" border="0" /></a><img decoding="async" style="border: none !important; margin: 0px !important;" src="https://ir-de.amazon-adsystem.com/e/ir?t=dabek-21&amp;language=pl_PL&amp;l=li3&amp;o=3&amp;a=1617293253" alt="" width="1" height="1" border="0" /></p>
<p><img decoding="async" style="border: none !important; margin: 0px !important;" src="https://ir-de.amazon-adsystem.com/e/ir?t=dabek-21&amp;language=pl_PL&amp;l=li3&amp;o=3&amp;a=1118957407" alt="" width="1" height="1" border="0" /></p>
<h3><span style="color: #ff6600;"><strong>Praktyka</strong></span></h3>
<p><span style="color: #ff6600;"><strong>Sekcja praktyczna</strong></span>, czyli rozwiązywanie zadań i przykładowych egzaminów próbnych.</p>
<p>Dzięki temu, że kupiłem wcześniej polecaną książkę (<a href="https://amzn.to/3oaWl1m">tą</a>), miałem dostęp do strony z testami. Są tam trzy próbne testy (60 pytań każdy), dodatkowo są tam też testy dla każdego z poszczególnych podrozdziałów książki.</p>
<p>Jednak to nie wydawało mi się to wystarczające i bałem się podchodzić do egzaminu wartego 1050 zł bez większej praktyki. W fazie analizy znalazłem kilka polecanych źródeł z przykładowymi testami. Najpopularniejszymi serwisami z pytaniami są:</p>
<ul>
<li><a href="https://enthuware.com/">Enthuware</a></li>
<li><a href="https://shrsl.com/2r6f2">Whizlabs</a>.</li>
</ul>
<p>Oba są relatywnie tanie — cena około 10$ za 400-500 różnorodnych pytań. Ja zdecydowałem się na <a href="https://shrsl.com/2r6f2">Whizlabs</a>. Testy na <a href="https://shrsl.com/2r6f2">Whizlabs</a> są ok. Nie mam niestety porównania z Enthuware. Na pewno plusem Whizlabs jest to, że korzystamy z przeglądarki internetowej + do każdego pytania są krótkie wyjaśnienia, dlaczego powinniśmy wybrać daną odpowiedź a inne odrzucić. Choć przyznam, że wyjaśnienia te czasami bywają bezwartościowe. Podam przykład, spolszczając co nieco i dodając szczyptę ironii: <em>odpowiedź A jest błędna, ponieważ nie można tak robić</em>. Mało wyjaśniający tekst, bo bardziej mnie interesowało, dlaczego tak nie można. Całe szczęście takich bezsensownych odpowiedzi nie jest wiele :). <span style="color: #ff6600;"><strong>Po przeczytaniu wcześniej polecanej książki i przerobieniu pytań na Whizlabs zaliczyłem egzamin na 95%</strong></span>, więc moim zdaniem były to wartościowe źródła.</p>
<p>Inne materiały, nad którymi się zastanawiałem, podaję poniżej. Jednak ze względu na ich cenę, postanowiłem, że wolę odpuścić.</p>
<ul>
<li><a href="https://www.certification-questions.com/practice-exam/java/1z0-808">certification-questions.com</a></li>
<li><a href="https://www.certleader.com/1z0-808-dumps.html">certleader.com</a></li>
</ul>
<hr id="Zapis na egzamin" />
<h2><span style="color: #ff6600;">Zapis na egzamin</span></h2>
<p><span style="color: #ff6600;"><strong>TL;DR</strong></span></p>
<p>Zapis na egzamin w styczniu 2021 w moim przypadku był uciążliwy. Pojawiło się kilka przeszkód, ale ostatecznie udało mi się zapisać&#8230; siedząc na słuchawce z konsultantem z UK (a po akcencie wnioskując to z Indii).</p>
<hr />
<p>Znane mi opcje do zapisu były dwie:</p>
<ol>
<li>kupuję voucher/egzamin na stronie Oracle, a następnie wykorzystuję w systemie certyfikującym (<a href="https://home.pearsonvue.com/oracle/onvue">pearson vue</a>)</li>
<li>kupuję egzamin bezpośrednio w systemie certyfikującym (<a href="https://home.pearsonvue.com/oracle/onvue">pearson vue</a>)</li>
</ol>
<p>Pomyślałem, że skoro to egzamin Oracle&#8217;owy, to kupię egzamin ze strony Oracle&#8217;a. Problemy zaczęły się już przy uzupełnianiu profilu&#8230; pola walidujące (imię, nazwisko, adres itp.) <span style="color: #ff6600;"><strong>to porażka</strong></span>. Masz wszystko uzupełnione, wciskasz <em>ok </em>i dostajesz błąd walidacji. Mało tego, pole walidujące numer telefonu posiada wejście na 10 cyfr (pomijając prefiks, który jest wykrywany automatycznie na podstawie wcześniej wprowadzonych pól) i jeżeli podamy mniej (a polskie numery są 9-cyfrowe), to co się dzieje? Oczywiście mamy błąd walidacji! Mocno mnie to zirytowało i aż napisałem do supportu Oracle&#8217;a, jak mam uzupełnić to dziadostwo. Rozwiązanie, jakie podali: <span style="color: #ff6600;"><strong>proszę wprowadzić 0 (zero) jako pierwszą cyfrę</strong></span>.</p>
<p>Przeszliśmy już przez wszystkie pola walidujące, mamy nasz voucher i kierujemy się do płatności. Na ten moment (przypominam, styczeń 2021) są tam 4 metody płatności — najwygodniejsza to oczywiście płatność kartą i tylko taką byłem zainteresowany, więc nie mogę opisać swoich wrażeń z pozostałymi. Wybrałem płatność kartą, uzupełniłem dane karty i aby móc przejść do samego zakupu, trzeba było potwierdzić kartę (lub to, że jest się jej właścicielem, nie wiem). Ogólnie to przenosi mnie na stronę banku, loguję się, widzę płatność dla Oracle&#8217;a na 1 zł (!), potwierdzam płatność na telefonie. Strona banku reaguje, że wszystko się udało i za chwilę powrócę do dalszych zakupów i&#8230; BAAAM, wywaliło mnie na pustą kartę. W pasku URL widzę tylko dziwny adres jakiegoś API i w zasadzie tyle.</p>
<p><span style="color: #ff6600;"><strong>Nic nie mogę zrobić</strong></span>. Na karcie widzę obciążenie na złotówkę (wisiało tak przez około tydzień) i tyle. Spróbowałem powtórzyć proces jeszcze 3x na innych przeglądarkach (nawet na wspaniałym IE!). Na żadnej się nie udało. Ale taki mały tip, że w zależności od przeglądarki, pola walidacyjne działały lepiej (tam, gdzie obsługa flasha była włączona, tam działało to trochę lepiej). O łał&#8230; Trochę ponarzekałem, a dopiero przechodzimy do samego systemu certyfikującego — perason vue. Postaram się bardziej streszczać.</p>
<p>W tym przypadku, pola walidacyjne, wprowadzanie numeru telefonu, itp. było o niebo prostsze! Niestety, był ten sam problem z płatnością. Potwierdzasz płatność i dostajesz przekierowanie na pustą stronę. Byłem już zirytowany tym wszystkim i napisałem maila do supportu, jak mam się zapisać na ten egzamin, <span style="color: #ff6600;"><strong>bo sam nie umiem</strong></span>. Powiedzieli, aby kontaktować się z ich obsługą, podali numer telefonu (numer w UK, bo nie mają wsparcia w Polsce) i godziny pracy. <span style="color: #ff6600;"><strong>Dzwonię</strong></span>&#8230; Standardowa infolinia, automat coś gada i wybieram odpowiednie przyciski. Po kilku wciśnięciach i kolejnych kilku minutach oczekiwania w kolejce w końcu łączy mnie z jednym z konsultantów wspierających sekcje Oracle.</p>
<p><span style="color: #ff6600;"><strong>Udało mi się zapisać na ten egzamin za 5 telefonem</strong></span>. Ogólnie całe flow polega na tym, że podajesz swoje dane i mówisz, co chcesz, dlaczego nie możesz sam tego zrobić i oni wprowadzają wszystkie dane za Ciebie. Ale dobra&#8230; dlaczego dopiero za 5 razem?? <span style="color: #ff6600;"><strong>Jeżeli coś im nie działało w systemie,</strong> <strong>to się rozłączali!</strong></span> Przykład: przeszedłem z gościem przez całe flow, doszliśmy do płatności. Gościu mi mówi, że system akurat im leży, żebym poczekał 4-5 minut i wtedy spróbujemy. Po 5 minutach odezwał się, że dalej nie działa i żebyśmy jeszcze chwilę poczekali. Czekam, czekam&#8230; cała rozmowa trwa już 20 minut i nagle słyszę <span style="color: #ff6600;"><strong>BIP</strong></span>, gościu się rozłączył. A tylko przypomnę, że to rozmowa z numerem z UK, która nie jest specjalnie za tania&#8230;</p>
<p><span style="color: #ff6600;"><b>Dobra rada </b></span>dla każdego, kto musi dzwonić za granicę. Używajcie Skype&#8217;a, wychodzi o wiele taniej (lub za darmo, jak się w dobrą promocję trafi).</p>
<hr id="Przebieg egzaminu" />
<h2><span style="color: #ff6600;">Przebieg egzaminu</span></h2>
<p>Ten artykuł i tak wyszedł spory, więc w tej sekcji postaram się pisać krótko i zwięźle. Ja podchodziłem do egzaminu online, więc naturalnie ten proces będę opisywać.</p>
<p>Wszystkie przydatne informacje co do samego egzaminu można było znaleźć na tej <a href="https://home.pearsonvue.com/oracle/onvue">stronie</a>. Mnie ciekawił bardziej proces weryfikacji przed przystąpieniem do egzaminu i jak to przebiega. Na oficjalnych stronach nie mogłem nic znaleźć, ale jest YouTube :). Poniżej podsyłam video, które przedstawia, jak wygląda proces weryfikacji.</p>
<p>W kwesti samego egzaminu nie było tu nic nadzwyczajnego. Dostajesz pytania i je rozwiązujesz. Egzamin posiada różne typy odpowiedzi — <strong><span style="color: #ff6600;">jednokrotnego</span> </strong>lub <strong><span style="color: #ff6600;">wielokrotnego</span> </strong>wyboru. Jeżeli pytania są wielokrotnego wyboru, to <span style="color: #ff6600;"><strong>w pytaniu jest jasno określona ilość poprawnych odpowiedzi</strong></span> (nie da się zaznaczyć większej ilości). <span style="color: #ff6600;"><strong>Wszystkie pytania są zamknięte</strong></span>.</p>
<p>Kończąc egzamin, nasz wynik (procent poprawnych odpowiedzi), jest przedstawiony zaraz po zakończeniu. A więc wciskasz <em>Finish</em> i za 10 sekund wiesz, czy egzamin jest zaliczony, czy nie.</p>
<div class="nv-iframe-embed"><iframe loading="lazy" title="EXAM DAY: Process of using onVUE App (Pearsonvue Online Exam Application) at Home or Office" width="1200" height="675" src="https://www.youtube.com/embed/otw3uO3KXpA?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>
<hr />
<h2><span style="color: #ff6600;">Podsumowanie</span></h2>
<p><a href="https://www.bdabek.pl/spring-boot-i-logi-ustawienia-logbacka/lightbulb/" rel="attachment wp-att-976" data-slb-active="1" data-slb-asset="1379905354" data-slb-internal="976"><img decoding="async" class="aligncenter wp-image-976 size-thumbnail lazyloaded" src="https://cdn.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_150,h_150/https://www.bdabek.pl/wp-content/uploads/2020/05/Lightbulb-150x150.jpg" alt="" width="150" height="150" data-src="https://cdn.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_150,h_150/https://www.bdabek.pl/wp-content/uploads/2020/05/Lightbulb-150x150.jpg" /></a></p>
<p>Egzamin zaliczyłem z wynikiem 95% &#8211; myślę, że to jest całkiem ok. Czy warto było wydawać pieniądze na egzamin? W moim przypadku przenosiło się to bezpośrednio na wynagrodzenie, więc <span style="color: #ff6600;"><strong>dla mnie było warto</strong></span>. Oprócz tego bardzo często firmy oferują pokrycie kosztów, więc czemu by nie spróbować za pieniądze pracodawcy? Dodatkowo mam certyfikat, który dla ewentualnych, przyszłych klientów już coś mówi (co prawda samym OCA może lepiej się nie chwalić, ale lepszy rydz niż nic). Mogę też wpisać coś dodatkowego do CV (o ile potrzebuję). <span style="color: #ff6600;"><strong>Oprócz kwestii biznesowych</strong></span>, przygotowanie do egzaminu pozwoliło <span style="color: #ff6600;"><strong>powtórzyć i utrwalić podstawy</strong></span>.</p>
<p>Artykuł <a href="https://www.bdabek.pl/certyfikacja-z-javy/">Certyfikacja z Javy. Egzamin OCA i Moje Wnioski</a> pochodzi z serwisu <a href="https://www.bdabek.pl">bdabek.pl</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bdabek.pl/certyfikacja-z-javy/feed/</wfw:commentRss>
			<slash:comments>20</slash:comments>
		
		
			</item>
		<item>
		<title>Redis. Wprowadzenie Dla Początkujących</title>
		<link>https://www.bdabek.pl/redis-wprowadzenie/</link>
					<comments>https://www.bdabek.pl/redis-wprowadzenie/#comments</comments>
		
		<dc:creator><![CDATA[Bartosz Dąbek]]></dc:creator>
		<pubDate>Wed, 20 Jan 2021 11:00:02 +0000</pubDate>
				<category><![CDATA[Programowanie]]></category>
		<guid isPermaLink="false">https://www.bdabek.pl/?p=2724</guid>

					<description><![CDATA[<p>Redis jest popularnym projektem open sourcowym, który od roku 2013 zyskuje coraz to większą i większą rozpoznawalność w światku IT. Dziś, w roku 2021, Redis jest znany jako NoSQL-owa baza danych klucz-wartość działająca w pamięci, a jej najpopularniejsze wykorzystanie to cache. Natomiast nie są to wszystkie zalety Redisa, ale o tym dowiesz się w dalszej&#8230;&#160;<a href="https://www.bdabek.pl/redis-wprowadzenie/" rel="bookmark">Dowiedz się więcej &#187;<span class="screen-reader-text">Redis. Wprowadzenie Dla Początkujących</span></a></p>
<p>Artykuł <a href="https://www.bdabek.pl/redis-wprowadzenie/">Redis. Wprowadzenie Dla Początkujących</a> pochodzi z serwisu <a href="https://www.bdabek.pl">bdabek.pl</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Redis jest popularnym projektem open sourcowym, który od roku 2013 zyskuje coraz to większą i większą rozpoznawalność w światku IT. Dziś, w roku 2021, Redis jest znany jako NoSQL-owa baza danych klucz-wartość działająca w pamięci, a jej najpopularniejsze wykorzystanie to cache. Natomiast nie są to wszystkie zalety Redisa, ale o tym dowiesz się w dalszej części tego artykułu.</p>
<hr />
<h3>Cześć <img decoding="async" class="emoji" role="img" draggable="false" src="https://s.w.org/images/core/emoji/12.0.0-1/svg/1f642.svg" alt="&#x1f642;" /></h3>
<p>W dzisiejszym artykule:</p>
<ul>
<li><a href="#Czym jest Redis"><strong>Czym jest Redis</strong></a></li>
<li><a href="#Dlaczego warto używać?"><strong>Dlaczego warto używać Redisa?</strong></a></li>
<li><a href="#Do czego stosować?"><strong>Do czego stosować?</strong></a></li>
<li><a href="#Let's play it"><strong>Let&#8217;s play it</strong></a></li>
</ul>
<hr id="Czym jest Redis" />
<p><h2 id="Czym jest Redis"> <a href="#Czym jest Redis"><span class="dashicons dashicons-admin-links"></span></a>Czym jest Redis</h2></p>
<p><a href="https://www.bdabek.pl/?attachment_id=2788" rel="attachment wp-att-2788"><img decoding="async" class="aligncenter wp-image-2788" src="https://www.bdabek.pl/wp-content/uploads/2021/01/redis.png" alt="" width="524" height="175" srcset="https://www.bdabek.pl/wp-content/uploads/2021/01/redis.png 1200w, https://www.bdabek.pl/wp-content/uploads/2021/01/redis-300x100.png 300w, https://www.bdabek.pl/wp-content/uploads/2021/01/redis-1024x342.png 1024w, https://www.bdabek.pl/wp-content/uploads/2021/01/redis-768x257.png 768w" sizes="(max-width: 524px) 100vw, 524px" /></a></p>
<blockquote><p>Redis is an open source (BSD licensed), in-memory <strong>data structure store</strong>, used as a database, cache, and message broker. Redis provides data structures such as <a href="https://redis.io/topics/data-types-intro#strings">strings</a>, <a href="https://redis.io/topics/data-types-intro#hashes">hashes</a>, <a href="https://redis.io/topics/data-types-intro#lists">lists</a>, <a href="https://redis.io/topics/data-types-intro#sets">sets</a>, <a href="https://redis.io/topics/data-types-intro#sorted-sets">sorted sets</a> with range queries, <a href="https://redis.io/topics/data-types-intro#bitmaps">bitmaps</a>, <a href="https://redis.io/topics/data-types-intro#hyperloglogs">hyperloglogs</a>, <a href="https://redis.io/commands/geoadd">geospatial indexes</a>, and <a href="https://redis.io/topics/streams-intro">streams</a>. Redis has built-in <a href="https://redis.io/topics/replication">replication</a>, <a href="https://redis.io/commands/eval">Lua scripting</a>, <a href="https://redis.io/topics/lru-cache">LRU eviction</a>, <a href="https://redis.io/topics/transactions">transactions</a>, and different levels of <a href="https://redis.io/topics/persistence">on-disk persistence</a>, and provides high availability via <a href="https://redis.io/topics/sentinel">Redis Sentinel</a> and automatic partitioning with <a href="https://redis.io/topics/cluster-tutorial">Redis Cluster</a>.</p></blockquote>
<p>Jest to opis wzięty z <a href="https://redis.io/topics/introduction">oficjalnej strony</a> autorów oprogramowania. Jak wspomniano, Redis przechowuje dane w pamięci. Nie są one zapisywane na dysku, co zapewnia <strong>niezwykle szybki dostęp</strong>. Z tego też powodu, Redis jest właśnie często używany jako pamięć podręczna (cache), i/lub pomocnicza baza danych (secondary database).</p>
<p>Z racji, że pamięć jest ulotna, a może się zdarzyć, że nasza aplikacja ulegnie awarii, Redis pozwala podjąć pewne środki zaradcze, poprzez zapisywanie danych na dysku. Możliwość persystencji danych jest jego <a href="https://www.imaginarycloud.com/blog/redis-vs-memcached/#:~:text=When%20deciding%20whether%20to%20use,cache%20and%20it%20is%20volatile.">ogromną zaletą</a> w porównaniu do innych providerów zapewniających cache&#8217;owanie.</p>
<p>Podsumowując to prostym językiem &#8211; <strong>Redis to działająca w pamięci baza klucz-wartość</strong>. Sama nazwa, <em>Redis</em> jest akronimem słów Remote (<strong>RE</strong>) Dictionary (<strong>DI</strong>) Server (<strong>S</strong>).</p>
<hr id="Dlaczego warto używać?" />
<p><h2 id="Dlaczego warto używać?"> <a href="#Dlaczego warto używać?"><span class="dashicons dashicons-admin-links"></span></a>Dlaczego warto używać Redisa?</h2></p>
<p><a href="https://www.bdabek.pl/?attachment_id=2786" rel="attachment wp-att-2786"><img decoding="async" class="aligncenter size-full wp-image-2786" src="https://www.bdabek.pl/wp-content/uploads/2021/01/redis-cache-cluster.png" alt="" width="800" height="470" srcset="https://www.bdabek.pl/wp-content/uploads/2021/01/redis-cache-cluster.png 800w, https://www.bdabek.pl/wp-content/uploads/2021/01/redis-cache-cluster-300x176.png 300w, https://www.bdabek.pl/wp-content/uploads/2021/01/redis-cache-cluster-768x451.png 768w" sizes="(max-width: 800px) 100vw, 800px" /></a></p>
<p>Każde oprogramowanie, jakie by nie było będzie mieć <strong>wady</strong> i <strong>zalety</strong>. Jako świadomi programiści, architekci czy inne osoby podejmujące decyzje techniczne, zanim zdecydujemy się na wybór konkretnego dostawcy oprogramowania powinniśmy rozważyć powody za i przeciw jego użyciu. W Internecie znajdziesz kilka artykułów opisujących wady i zalety Redisa [<a href="https://medium.com/weekly-webtips/redis-what-and-why-pros-cons-ae2f5bc750fd">1</a>,<a href="https://www.trustradius.com/products/redis/reviews?qs=pros-and-cons">2</a>] z którymi warto się zapoznać przed podjęciem decyzji. Dobrze byłoby również porozmawiać z innymi osobami, które takiego rozwiązania już używają i wyciągnąć od nich informacje/wskazówki.</p>
<p>W tym artykule przedstawię Ci kilka, moim zdaniem istotnych zalet Redisa.</p>
<h4>Wydajność</h4>
<p>Redis pozwala nawet na 120 000 żądań na sekundę! Więcej o benchmarkach można poczytać na <a href="https://redis.io/topics/benchmarks">ich stronie</a>.</p>
<h4>Wysoka dostępność i skalowalność</h4>
<p>Redis oferuje architekturę typu primary-replica w pojedynczym węźle lub w topologii klastrowej. Pozwala to na tworzenie wysoce dostępnych rozwiązań zapewniających stałą wydajność i niezawodność. W przypadku konieczności dostosowania rozmiaru klastra, dostępne są również różne opcje skalowania i powiększania lub zmniejszania. Pozwala to na rozwój klastra wraz z potrzebami.</p>
<h4>Replikacja i Trwałość (Durability)</h4>
<p id="591f" class="kf kg gp av kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz la lb lc ex">Redis obsługuje replikację asynchroniczną, w której dane mogą być replikowane na wielu serwerach replik. Zapewnia to lepszą wydajność odczytu (ponieważ żądania mogą być dzielone między serwery) i szybsze odzyskiwanie w przypadku awarii serwera głównego. W celu zachowania trwałości Redis obsługuje kopie zapasowe w określonym momencie (kopiowanie danych na dysk).</p>
<h4>Prostota i łatwość obsługi</h4>
<p>Redis upraszcza kod, umożliwiając zapisanie mniejszej ilości linii kodu do przechowywania, dostępu i korzystania z danych w aplikacjach. Posiada natywne struktury danych i wiele opcji do manipulacji i interakcji z danymi. Obsługuje wiele języków oprogramowania, m.in: Java, Python, PHP, C, C++, C#, JavaScript, Node.js, Ruby, R, Go i wiele innych. Również popularne frameworki wspierają prostą integrację z Redisem.</p>
<h4>Rozszerzalność</h4>
<p>Redis jest projektem <a href="https://github.com/redis/redis"><em>open source</em></a>. Jest oparty na standardach, obsługuje różne formaty danych i posiada bogaty <a href="https://redis.io/clients">zestaw klientów</a>.</p>
<hr id="Do czego stosować?" />
<p><h2 id="Do czego stosować?"> <a href="#Do czego stosować?"><span class="dashicons dashicons-admin-links"></span></a>Do czego stosować?</h2></p>
<p><a href="https://www.bdabek.pl/?attachment_id=2787" rel="attachment wp-att-2787"><img decoding="async" class="aligncenter size-full wp-image-2787" src="https://www.bdabek.pl/wp-content/uploads/2021/01/topredisuses.png" alt="" width="517" height="266" srcset="https://www.bdabek.pl/wp-content/uploads/2021/01/topredisuses.png 517w, https://www.bdabek.pl/wp-content/uploads/2021/01/topredisuses-300x154.png 300w" sizes="(max-width: 517px) 100vw, 517px" /></a></p>
<p>Spora część czytelników zapewne odpowie, że Redisa wykorzystujemy jako pamięć cache i kropka. Sam bym tak odpowiedział gdybym nie pisał tego artykułu :). Jednak Redis może być wykorzystany szerzej. Jasne, wykorzystanie go jako cache jest ogromną zaletą, ale poznajmy też inne możliwości, aby w przyszłości móc rozważyć użycie Redisa również w innych aspektach.</p>
<h4 id="Caching" class="lb-txt-bold lb-txt-18 lb-h3 lb-title">Caching</h4>
<p>Redis jest doskonałym wyborem do implementacji wysoce dostępnej pamięci podręcznej w celu zmniejszenia opóźnień w dostępie do danych oraz odciążenia bazy danych i aplikacji. Może obsługiwać często wymagane elementy w czasie krótszym niż milisekunda i umożliwia łatwe skalowanie dla większych obciążeń bez zwiększania kosztu backendu.</p>
<h4 id="Chat.2C_messaging.2C_and_queues" class="lb-txt-bold lb-txt-none lb-txt-18 lb-h3 lb-title">Chat, messaging, and queues</h4>
<p>Redis obsługuje wzorzec Pub/Sub i różne struktury danych, takie jak listy, posortowane zbiory i hashe. Dzięki temu Redis może obsługiwać wysokowydajne czaty, strumienie komentarzy w czasie rzeczywistym, kanały mediów społecznościowych i komunikację między serwerami. Listy ułatwiają również wdrożenie kolejek. Oferują zarówno operacje atomowe, jak i możliwości blokowania, dzięki czemu nadają się do różnych zastosowań, które wymagają niezawodnego brokera wiadomości.</p>
<h4 id="Gaming_leaderboards" class="lb-txt-bold lb-txt-18 lb-h3 lb-title">Gaming leaderboards</h4>
<p>Redis wykonuje niesamowitą pracę w inkrementacji i dekrementacji, ponieważ jest w pamięci. Zbiory (Sets) i posortowane zbiory (Sorted Sets) ułatwiają nam również życie, gdy próbujemy wykonywać tego typu operacje, a tak się składa, że Redis oferuje obie te struktury danych. Przykładowo aby wyciągnąć 10 najlepszych użytkowników z posortowanego zestawu &#8211; nazwiemy go &#8222;user_scores&#8221; &#8211; można po prostu uruchomić następujące polecenie:</p><pre class="crayon-plain-tag">ZRANGE user_scores 0 10</pre><p></p>
<h4 id="Rich_media_streaming" class="lb-txt-bold lb-txt-none lb-txt-18 lb-h3 lb-title">Rich media streaming</h4>
<p>Redis może być używany do przechowywania metadanych o profilach użytkowników i ich historii przeglądania, informacji uwierzytelniających/tokenów dla milionów użytkowników, plików manifestów aby umożliwić CDN-om strumieniowe przesyłanie wideo do milionów użytkowników mobilnych i webowych w tym samym czasie.</p>
<hr id="Let's play it" />
<p><h2 id="Let&#039;s play it"> <a href="#Let&#039;s play it"><span class="dashicons dashicons-admin-links"></span></a>Let&#8217;s play it</h2></p>
<p>Ok. Przeszliśmy przez sekcje teoretyczne. Teraz czas na trochę zabawmy z samym Redisem z poziomu klienta. W świecie rzeczywistym raczej rzadko (o ile w ogóle) będziesz używał klienta z poziomu konsoli. Częściej będzie to zwyczajnie klient, w języku programowania w jakim rozwijasz aplikacje.</p>
<p><a href="https://www.bdabek.pl/?attachment_id=2791" rel="attachment wp-att-2791"><img decoding="async" class="aligncenter size-full wp-image-2791" src="https://www.bdabek.pl/wp-content/uploads/2021/01/redis-start.png" alt="" width="917" height="594" srcset="https://www.bdabek.pl/wp-content/uploads/2021/01/redis-start.png 917w, https://www.bdabek.pl/wp-content/uploads/2021/01/redis-start-300x194.png 300w, https://www.bdabek.pl/wp-content/uploads/2021/01/redis-start-768x497.png 768w" sizes="(max-width: 917px) 100vw, 917px" /></a></p>
<p>Chcąć pobawić się Redisem, mamy dwie opcje:</p>
<ol>
<li style="list-style-type: none;">
<ol>
<li><strong>Używamy wersji webowej</strong> &#8211; <a href="https://try.redis.io/">Try Redis</a></li>
<li><strong>Stawiamy kontener dockerowy</strong></li>
</ol>
</li>
</ol>
<p>Opcja 1 jest prosta, wystarczy wejść w link i można wprowadzać komendy. Opcja 2 wymaga nieco większego wysiłku. Po pierwsze, trzeba mieć zainstalowanego dockera a następnie należy wprowadzić dwa polecenia. Pierwsze, uruchamiające Redisa:</p><pre class="crayon-plain-tag">docker run --rm -it --name local-redis -p 6379:6379 redis</pre><p></p>
<p class="highlight plaintext">oraz drugie, odpalające klienta:</p>
<p></p><pre class="crayon-plain-tag">docker run -it --link local-redis:redis --rm redis redis-cli -h redis -p 6379</pre><p></p>
<p class="highlight plaintext">Teraz w kliencie śmiało można uruchamiać komendy, co będzie miało taki sam rezultat jak byśmy używali wersji webowej.</p>
<p class="highlight plaintext">Redis zapewnia kilka <a href="https://redis.io/topics/data-types">struktur danych</a> oraz <a href="https://redis.io/commands">zbiór komend</a> ułatwiających manipulację na danych. Aby lepiej poznać jego możliwości przejdźmy przez podstawowe. <strong>Polecam wklepać komendy do konsoli i obserwować rezultaty</strong>. Niby dużo to nie daje, ale coś w głowie zostanie <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<h4>Strings</h4>
<p>Stringi są najbardziej podstawową strukturą danych. Są binarnie bezpieczne, to znaczy, że mogą zawierać dowolny rodzaj danych, na przykład obraz JPEG lub serializowany obiekt Rubiego. Wartość String może mieć długość maksymalnie 512 megabajtów.</p><pre class="crayon-plain-tag">SET name &quot;John&quot;                         
GET name

EXISTS name                            // Check existence of key
DEL name                               // Delete key 
EXPIRE name 5                          // Delete key when expired

SET counter 100
INCRBY counter 25                      // Increments by 25
DECR counter                           // Decrements by 1  

MSET a 10 b 20                         // Multiple SET
MGET a b                               // Multiple GET</pre><p></p>
<h4>Lists</h4>
<p>Listy to po prostu listy stringów, posortowane według kolejności wstawiania. Możliwe jest dodawanie nowych elementów na początek listy (head) lub na jej końcu (tail). Maksymalna długość listy wynosi (2^32) &#8211; 1 elementów (4294967295, ponad 4 miliardy elementów na listę).</p><pre class="crayon-plain-tag">LPUSH myList 10                        // Add from left to head
RPUSH myList &quot;str&quot;                     // Add from right to tail

LRANGE myList 0 -1                     // Range from 0 to -1
LTRIM myList 0 1                       // To keep latest elements
RPOP myList                            // Pop last element</pre><p></p>
<h4>Hashes</h4>
<p>Hashes to mapy pomiędzy polami i wartościami string. Są one idealnym typem danych do reprezentowania obiektów (np. użytkownik z wieloma polami takimi jak imię, nazwisko, wiek itp.)</p><pre class="crayon-plain-tag">HMSET user id 100 name &quot;Smith&quot; age 50 // Setup hash with key &quot;user&quot;
HGET user id // Only 'id' field returned 
HGETALL user</pre><p></p>
<h4>Sets</h4>
<p>Zbiory to nieuporządkowana kolekcja stringów. Możliwe jest dodawanie, usuwanie i sprawdzanie istniejących wartości w stałym czasie (O(1)) niezależnie od ilości elementów zawartych w zbiorze. Maksymalna wielkość zbioru jest taka sama jak w przypadku listy.</p><pre class="crayon-plain-tag">SADD mySet 10 45 12 // Add elements to set
SMEMBERS mySet // Get all members of the set
SISMEMBER mySet 10 // Returns whether value exists</pre><p></p>
<h4>Sorted Sets</h4>
<p>Posortowane zbiory, podobnie jak zwykłe zbiory są niepowtarzającymi się kolekcjami stringów. Różnica polega na tym, że każdy element posortowanego zbioru ma przypisany wynik (score), który jest używany w celu uporządkowania zestawu, od najmniejszego do największego wyniku. Podczas gdy elementy w zbiorze są unikalne, wyniki (score) mogą się powtarzać!</p><pre class="crayon-plain-tag">ZADD children 1992 &quot;Sam&quot;             // Birth-year acts as score
ZADD children 1997 &quot;Tom&quot;

ZRANGE children 0 -1                 // Returns all in order
ZREVRANGE children 0 -1 withScores   // Reverse order of ZRANGE

ZRANGEBYSCORE children -inf 1995     // Scores until 1993
ZREMRANGEBYSCORE children 1990 1995  // Remove from sorted set
ZRANK children &quot;Tom&quot;                 // Score rank of 'Tom'</pre><p></p>
<hr />
<h2>Podsumowanie</h2>
<p><a href="https://www.bdabek.pl/spring-boot-i-logi-ustawienia-logbacka/lightbulb/" rel="attachment wp-att-976" data-slb-active="1" data-slb-asset="1379905354" data-slb-internal="976"><img decoding="async" class="aligncenter wp-image-976 size-thumbnail lazyloaded" src="https://cdn.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_150,h_150/https://www.bdabek.pl/wp-content/uploads/2020/05/Lightbulb-150x150.jpg" alt="" width="150" height="150" data-src="https://cdn.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_150,h_150/https://www.bdabek.pl/wp-content/uploads/2020/05/Lightbulb-150x150.jpg" /></a></p>
<p>Redis jako oprogramowanie z pewnością jest warte użycia. Korzyści płynące z wydajności wydają się jednym z głównych powodów dlaczego miałbyś użyć właśnie tego rozwiązania. Dodatkowy fakt, że jest to projekt open-source, posiadający aktywne community i mający wiele klientów w różnych językach programowania również przemawia.</p>
<p>Na tę chwilę (na całe szczęście) nie mam żadnych nieprzyjemnych doświadczeń z Redisem. Jeżeli masz jakieś, podziel się tym w komentarzu. Na pewno jest to ciekawy temat do eksploracji, aby zastanowić się jak używać, czego próbowali inni i na co uważać na przyszłość.</p>
<p>Źródła:</p>
<ul>
<li><a href="https://chathuranga94.medium.com/introduction-to-redis-348d9ccbfd0d"><strong>Introduction to Redis</strong></a></li>
<li><strong><a href="https://aws.amazon.com/redis/">Redis</a></strong></li>
</ul>
<p>Artykuł <a href="https://www.bdabek.pl/redis-wprowadzenie/">Redis. Wprowadzenie Dla Początkujących</a> pochodzi z serwisu <a href="https://www.bdabek.pl">bdabek.pl</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bdabek.pl/redis-wprowadzenie/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
	</channel>
</rss>
