3737import redis .clients .jedis .params .SetParams ;
3838import redis .clients .jedis .resps .ScanResult ;
3939
40+ import org .slf4j .Logger ;
41+ import org .slf4j .LoggerFactory ;
42+
4043import java .time .Duration ;
4144import java .util .List ;
4245import java .util .Optional ;
5558@ Requires (classes = SyncCache .class )
5659public class RedisCache implements SyncCache <JedisPool >, AutoCloseable {
5760
61+ private static final Logger log = LoggerFactory .getLogger (RedisCache .class );
62+
5863 private final JedisPool jedisPool ;
5964 private final ObjectSerializer keySerializer ;
6065 private final ObjectSerializer valueSerializer ;
@@ -133,22 +138,26 @@ public JedisPool getNativeCache() {
133138 @ NonNull
134139 @ Override
135140 public <T > Optional <T > get (@ NonNull Object key , @ NonNull Argument <T > requiredType ) {
141+ log .trace ("Cache '{}' GET key={}" , getName (), key );
136142 byte [] serializedKey = serializeKey (key );
137143 try (Jedis jedis = jedisPool .getResource ()) {
138144 byte [] data = jedis .get (serializedKey );
139145 if (expireAfterAccess != null && data != null ) {
140146 jedis .pexpire (serializedKey , expireAfterAccess );
141147 }
142148 if (data != null ) {
149+ log .trace ("Cache '{}' HIT key={}" , getName (), key );
143150 return valueSerializer .deserialize (data , requiredType );
144151 }
152+ log .trace ("Cache '{}' MISS key={}" , getName (), key );
145153 return Optional .empty ();
146154 }
147155 }
148156
149157 @ NonNull
150158 @ Override
151159 public <T > T get (@ NonNull Object key , @ NonNull Argument <T > requiredType , @ NonNull Supplier <T > supplier ) {
160+ log .trace ("Cache '{}' GET-WITH-SUPPLIER key={}" , getName (), key );
152161 byte [] serializedKey = serializeKey (key );
153162 try (Jedis jedis = jedisPool .getResource ()) {
154163 byte [] data = jedis .get (serializedKey );
@@ -158,11 +167,13 @@ public <T> T get(@NonNull Object key, @NonNull Argument<T> requiredType, @NonNul
158167 if (expireAfterAccess != null ) {
159168 jedis .pexpire (serializedKey , expireAfterAccess );
160169 }
170+ log .trace ("Cache '{}' HIT key={}" , getName (), key );
161171 return deserialized .get ();
162172 }
163173 }
164174 }
165175
176+ log .trace ("Cache '{}' MISS key={}, invoking supplier" , getName (), key );
166177 T value = supplier .get ();
167178 putValue (serializedKey , value );
168179 return value ;
@@ -172,25 +183,30 @@ public <T> T get(@NonNull Object key, @NonNull Argument<T> requiredType, @NonNul
172183 @ Override
173184 @ SuppressWarnings ("unchecked" )
174185 public <T > Optional <T > putIfAbsent (@ NonNull Object key , @ NonNull T value ) {
186+ log .trace ("Cache '{}' PUT-IF-ABSENT key={}" , getName (), key );
175187 byte [] serializedKey = serializeKey (key );
176188 try (Jedis jedis = jedisPool .getResource ()) {
177189 byte [] existingData = jedis .get (serializedKey );
178190 if (existingData != null ) {
191+ log .trace ("Cache '{}' PUT-IF-ABSENT key={} already exists, returning existing value" , getName (), key );
179192 return valueSerializer .deserialize (existingData , Argument .of ((Class <T >) value .getClass ()));
180193 }
194+ log .trace ("Cache '{}' PUT-IF-ABSENT key={} storing new value" , getName (), key );
181195 putValue (serializedKey , value );
182196 return Optional .empty ();
183197 }
184198 }
185199
186200 @ Override
187201 public void put (@ NonNull Object key , @ NonNull Object value ) {
202+ log .trace ("Cache '{}' PUT key={}" , getName (), key );
188203 byte [] serializedKey = serializeKey (key );
189204 putValue (serializedKey , value );
190205 }
191206
192207 @ Override
193208 public void invalidate (@ NonNull Object key ) {
209+ log .trace ("Cache '{}' INVALIDATE key={}" , getName (), key );
194210 byte [] serializedKey = serializeKey (key );
195211 try (Jedis jedis = jedisPool .getResource ()) {
196212 jedis .del (serializedKey );
@@ -199,20 +215,25 @@ public void invalidate(@NonNull Object key) {
199215
200216 @ Override
201217 public void invalidateAll () {
218+ log .trace ("Cache '{}' INVALIDATE-ALL pattern={}" , getName (), getKeysPattern ());
202219 String pattern = getKeysPattern ();
203220 try (Jedis jedis = jedisPool .getResource ()) {
204221 ScanParams params = new ScanParams ()
205222 .match (pattern )
206223 .count (invalidateScanCount .intValue ());
207224 String cursor = ScanParams .SCAN_POINTER_START ;
225+ int totalDeleted = 0 ;
208226 do {
209227 ScanResult <byte []> scanResult = jedis .scan (cursor .getBytes (redisCacheConfiguration .getCharset ()), params );
210228 List <byte []> keys = scanResult .getResult ();
211229 if (!keys .isEmpty ()) {
212230 jedis .del (keys .toArray (new byte [0 ][]));
231+ totalDeleted += keys .size ();
232+ log .trace ("Cache '{}' INVALIDATE-ALL deleted {} keys in this batch" , getName (), keys .size ());
213233 }
214234 cursor = scanResult .getCursor ();
215235 } while (!ScanParams .SCAN_POINTER_START .equals (cursor ));
236+ log .trace ("Cache '{}' INVALIDATE-ALL completed, total keys deleted: {}" , getName (), totalDeleted );
216237 }
217238 }
218239
@@ -263,11 +284,14 @@ protected <T> void putValue(byte[] serializedKey, T value) {
263284 byte [] bytes = serialized .get ();
264285 if (expireAfterWritePolicy != null ) {
265286 long ttl = expireAfterWritePolicy .getExpirationAfterWrite (value );
287+ log .trace ("Cache '{}' storing value with TTL={}ms, size={} bytes" , getName (), ttl , bytes .length );
266288 jedis .psetex (serializedKey , ttl , bytes );
267289 } else {
290+ log .trace ("Cache '{}' storing value without TTL, size={} bytes" , getName (), bytes .length );
268291 jedis .set (serializedKey , bytes );
269292 }
270293 } else {
294+ log .trace ("Cache '{}' value serialization returned empty, deleting key" , getName ());
271295 jedis .del (serializedKey );
272296 }
273297 }
0 commit comments