@@ -233,12 +233,7 @@ class SimpleRedisCacheImpl<K : Any, V : Any>(
233233 }
234234
235235 val bucket = api.redissonReactive.getBucket<String >(redisKey, StringCodec )
236- val raw = bucket.get().awaitSingleOrNull()
237-
238- if (raw == null ) {
239- nearCache.put(localKey, CacheEntry .Null )
240- return null
241- }
236+ val raw = bucket.get().awaitSingleOrNull() ? : return null
242237
243238 bucket.expire(ttl.toJavaDuration()).awaitSingleOrNull()
244239 refreshTtl(localKey, redisKey)
@@ -293,15 +288,38 @@ class SimpleRedisCacheImpl<K : Any, V : Any>(
293288 cacheNull : Boolean ,
294289 loader : suspend () -> V ?
295290 ): V ? {
296- val existing = getCached(key)
297- if (existing != null ) return existing
298- if (nearCache.getIfPresent(localKey(key)) == CacheEntry .Null ) return null
291+ val localKey = localKey(key)
292+
293+ when (val entry = nearCache.getIfPresent(localKey)) {
294+ is CacheEntry .Value -> return entry.value
295+ CacheEntry .Null -> return null
296+ null -> Unit
297+ }
298+
299+
300+ val redisKey = redisKey(key)
301+ val bucket = api.redissonReactive.getBucket<String >(redisKey, StringCodec )
302+ val raw = bucket.get().awaitSingleOrNull()
303+
304+ if (raw != null ) {
305+ bucket.expire(ttl.toJavaDuration()).awaitSingleOrNull()
306+ refreshTtl(localKey, redisKey)
307+ return if (raw == NULL_MARKER ) {
308+ nearCache.put(localKey, CacheEntry .Null )
309+ null
310+ } else {
311+ val value = api.json.decodeFromString(serializer, raw)
312+ nearCache.put(localKey, CacheEntry .Value (value))
313+ value
314+ }
315+ }
299316
300317 val loaded = loader()
301318 when {
302319 loaded != null -> put(key, loaded)
303320 cacheNull -> putNull(key)
304321 }
322+
305323 return loaded
306324 }
307325
0 commit comments