diff --git a/src/main/java/com/njcn/middle/cache/template/RedisCacheEnhanceTemplate.java b/src/main/java/com/njcn/middle/cache/template/RedisCacheEnhanceTemplate.java index b6f42fa..07ba6a5 100644 --- a/src/main/java/com/njcn/middle/cache/template/RedisCacheEnhanceTemplate.java +++ b/src/main/java/com/njcn/middle/cache/template/RedisCacheEnhanceTemplate.java @@ -53,8 +53,9 @@ public class RedisCacheEnhanceTemplate { public void set(String key, Object value, long ttlSeconds) { requirePositiveTtl(ttlSeconds); - redis.opsForValue().set(keyBuilder.build(key), codec.encode(value), - applyJitter(ttlSeconds), TimeUnit.SECONDS); + // 空值(写入空标记)按短 null-ttl 处理,与回源 null 一致,避免空标记长期占位 + long ttl = (value == null) ? props.getNullTtlSeconds() : applyJitter(ttlSeconds); + redis.opsForValue().set(keyBuilder.build(key), codec.encode(value), ttl, TimeUnit.SECONDS); } // ---- 读 ---- diff --git a/src/test/java/com/njcn/middle/cache/template/RedisCacheEnhanceTemplateTest.java b/src/test/java/com/njcn/middle/cache/template/RedisCacheEnhanceTemplateTest.java index 6f4ab8c..093293e 100644 --- a/src/test/java/com/njcn/middle/cache/template/RedisCacheEnhanceTemplateTest.java +++ b/src/test/java/com/njcn/middle/cache/template/RedisCacheEnhanceTemplateTest.java @@ -339,4 +339,14 @@ class RedisCacheEnhanceTemplateTest { when(valueOps.get("cache:user:1")).thenReturn(null); assertFalse(template.exists("user:1")); } + + // ---- #9: 公共 set(key,null) 用短 null-ttl(与回源空值一致) ---- + + @Test + void setNullUsesNullTtlNotDataTtl() { + props.setJitterRatio(0); + template.set("user:1", null, 3600); // 传入数据 TTL,但写空标记应改用短 null-ttl + verify(valueOps).set("cache:user:1", CacheConstant.NULL_SENTINEL, + props.getNullTtlSeconds(), TimeUnit.SECONDS); + } }