Class ProtectedCache<K,V>

java.lang.Object
cloud.opencode.base.cache.ProtectedCache<K,V>
Type Parameters:
K - key type | 键类型
V - value type | 值类型

Features | 主要功能:

  • BloomFilter for negative lookup tracking - 布隆过滤器跟踪未命中查找
  • SingleFlight for load deduplication - SingleFlight 合并并发加载
  • Negative cache with TTL - 带 TTL 的负缓存
  • Cache penetration prevention - 缓存穿透防护

Security | 安全性:

  • Thread-safe: Yes - 线程安全: 是
  • Null-safe: Yes - 空值安全: 是
All Implemented Interfaces:
Cache<K,V>, AutoCloseable

public final class ProtectedCache<K,V> extends Object implements Cache<K,V>, AutoCloseable
Protected Cache - Auto-integrates BloomFilter and SingleFlight protection 保护缓存 - 自动集成布隆过滤器和单次加载保护

Wraps an existing cache to automatically apply protection mechanisms:

包装现有缓存以自动应用保护机制:

  • BloomFilter - Prevents cache penetration by tracking negative lookups | 通过跟踪未命中来防止缓存穿透
  • SingleFlight - Prevents thundering herd by deduplicating concurrent loads | 通过合并并发加载来防止惊群效应

Usage Examples | 使用示例:

// Create protected cache with defaults
Cache<String, User> cache = OpenCache.getOrCreate("users");
ProtectedCache<String, User> protected = ProtectedCache.wrap(cache).build();

// With custom configuration
ProtectedCache<String, User> protected = ProtectedCache.wrap(cache)
    .bloomFilter(1_000_000, 0.01)  // 1M expected, 1% false positive
    .singleFlight(true)
    .negativeCache(Duration.ofMinutes(5))  // Cache misses for 5 min
    .build();

// Load with protection
User user = protected.get("user:1", key -> userService.findById(key));
// BloomFilter prevents repeated loads for non-existent keys
// SingleFlight deduplicates concurrent loads for same key
Since:
JDK 25, opencode-base-cache V2.0.0
Author:
Leon Soo www.LeonSoo.com
See Also:
  • Method Details

    • wrap

      public static <K,V> ProtectedCache.Builder<K,V> wrap(Cache<K,V> cache)
      Wrap a cache with protection 使用保护包装缓存
      Type Parameters:
      K - key type | 键类型
      V - value type | 值类型
      Parameters:
      cache - cache to wrap | 要包装的缓存
      Returns:
      builder | 构建器
    • get

      public V get(K key)
      Description copied from interface: Cache
      Get value by key, returns null if not present 根据键获取值,不存在返回 null
      Specified by:
      get in interface Cache<K,V>
      Parameters:
      key - the key | 键
      Returns:
      the value or null | 值或 null
    • get

      public V get(K key, Function<? super K, ? extends V> loader)
      Description copied from interface: Cache
      Get value by key, load using loader if not present 根据键获取值,不存在时通过 loader 加载
      Specified by:
      get in interface Cache<K,V>
      Parameters:
      key - the key | 键
      loader - the loader function | 加载函数
      Returns:
      the value | 值
    • getAll

      public Map<K,V> getAll(Iterable<? extends K> keys)
      Description copied from interface: Cache
      Get all values for given keys, returns only existing entries 批量获取,仅返回存在的条目
      Specified by:
      getAll in interface Cache<K,V>
      Parameters:
      keys - the keys | 键集合
      Returns:
      map of existing entries | 存在的条目 Map
    • getAll

      public Map<K,V> getAll(Iterable<? extends K> keys, Function<? super Set<? extends K>, ? extends Map<K,V>> loader)
      Description copied from interface: Cache
      Get all values, load missing keys using loader 批量获取,缺失的键通过 loader 加载
      Specified by:
      getAll in interface Cache<K,V>
      Parameters:
      keys - the keys | 键集合
      loader - the batch loader function | 批量加载函数
      Returns:
      map of all entries | 所有条目 Map
    • put

      public void put(K key, V value)
      Description copied from interface: Cache
      Put a key-value pair into cache 放入键值对
      Specified by:
      put in interface Cache<K,V>
      Parameters:
      key - the key | 键
      value - the value | 值
    • putAll

      public void putAll(Map<? extends K, ? extends V> map)
      Description copied from interface: Cache
      Put all key-value pairs into cache 批量放入
      Specified by:
      putAll in interface Cache<K,V>
      Parameters:
      map - the key-value pairs | 键值对 Map
    • putIfAbsent

      public boolean putIfAbsent(K key, V value)
      Description copied from interface: Cache
      Put if the key is absent, returns true if successful 不存在时放入,成功返回 true
      Specified by:
      putIfAbsent in interface Cache<K,V>
      Parameters:
      key - the key | 键
      value - the value | 值
      Returns:
      true if put successfully | 成功放入返回 true
    • putWithTtl

      public void putWithTtl(K key, V value, Duration ttl)
      Description copied from interface: Cache
      Put a key-value pair with custom TTL (overrides default expiration) 放入键值对并指定自定义 TTL(覆盖默认过期时间)
      Specified by:
      putWithTtl in interface Cache<K,V>
      Parameters:
      key - the key | 键
      value - the value | 值
      ttl - the time-to-live for this entry | 此条目的存活时间
    • putAllWithTtl

      public void putAllWithTtl(Map<? extends K, ? extends V> map, Duration ttl)
      Description copied from interface: Cache
      Put all entries with custom TTL 批量放入并指定自定义 TTL
      Specified by:
      putAllWithTtl in interface Cache<K,V>
      Parameters:
      map - the key-value pairs | 键值对 Map
      ttl - the time-to-live for all entries | 所有条目的存活时间
    • putIfAbsentWithTtl

      public boolean putIfAbsentWithTtl(K key, V value, Duration ttl)
      Description copied from interface: Cache
      Put if absent with custom TTL 不存在时放入并指定自定义 TTL
      Specified by:
      putIfAbsentWithTtl in interface Cache<K,V>
      Parameters:
      key - the key | 键
      value - the value | 值
      ttl - the time-to-live | 存活时间
      Returns:
      true if put successfully | 成功放入返回 true
    • computeIfPresent

      public V computeIfPresent(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)
      Description copied from interface: Cache
      Compute a new value if key is present 如果键存在则计算新值

      If the key is present and the remapping function returns non-null, the value is replaced. If the function returns null, the entry is removed.

      如果键存在且映射函数返回非 null,则替换值。如果函数返回 null,则删除条目。

      Specified by:
      computeIfPresent in interface Cache<K,V>
      Parameters:
      key - the key | 键
      remappingFunction - the function to compute new value | 计算新值的函数
      Returns:
      the new value or null if removed/absent | 新值,如果被删除或不存在则返回 null
    • compute

      public V compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)
      Description copied from interface: Cache
      Compute a new value for the key 计算键的新值

      Atomically computes a new value. If the key is absent and the function returns non-null, a new entry is created. If the key is present and the function returns null, the entry is removed.

      原子地计算新值。如果键不存在且函数返回非 null,则创建新条目。 如果键存在且函数返回 null,则删除条目。

      Specified by:
      compute in interface Cache<K,V>
      Parameters:
      key - the key | 键
      remappingFunction - the function to compute value | 计算值的函数
      Returns:
      the new value or null if removed | 新值,如果被删除则返回 null
    • getAndRemove

      public V getAndRemove(K key)
      Description copied from interface: Cache
      Get value and remove the entry atomically 原子地获取值并删除条目
      Specified by:
      getAndRemove in interface Cache<K,V>
      Parameters:
      key - the key | 键
      Returns:
      the value or null if not present | 值,不存在则返回 null
    • replace

      public V replace(K key, V value)
      Description copied from interface: Cache
      Replace value only if key is present 仅在键存在时替换值
      Specified by:
      replace in interface Cache<K,V>
      Parameters:
      key - the key | 键
      value - the new value | 新值
      Returns:
      the old value or null if not present | 旧值,不存在则返回 null
    • replace

      public boolean replace(K key, V oldValue, V newValue)
      Description copied from interface: Cache
      Replace value only if current value equals expected value 仅在当前值等于期望值时替换
      Specified by:
      replace in interface Cache<K,V>
      Parameters:
      key - the key | 键
      oldValue - the expected current value | 期望的当前值
      newValue - the new value | 新值
      Returns:
      true if replaced | 替换成功返回 true
    • invalidate

      public void invalidate(K key)
      Description copied from interface: Cache
      Invalidate a single key 使单个键失效
      Specified by:
      invalidate in interface Cache<K,V>
      Parameters:
      key - the key to invalidate | 要失效的键
    • invalidateAll

      public void invalidateAll(Iterable<? extends K> keys)
      Description copied from interface: Cache
      Invalidate multiple keys 批量失效
      Specified by:
      invalidateAll in interface Cache<K,V>
      Parameters:
      keys - the keys to invalidate | 要失效的键集合
    • invalidateAll

      public void invalidateAll()
      Description copied from interface: Cache
      Invalidate all entries 清空所有缓存
      Specified by:
      invalidateAll in interface Cache<K,V>
    • containsKey

      public boolean containsKey(K key)
      Description copied from interface: Cache
      Check if key exists 检查键是否存在
      Specified by:
      containsKey in interface Cache<K,V>
      Parameters:
      key - the key | 键
      Returns:
      true if exists | 存在返回 true
    • size

      public long size()
      Description copied from interface: Cache
      Get exact entry count (may be slow) 获取精确条目数(可能较慢)
      Specified by:
      size in interface Cache<K,V>
      Returns:
      entry count | 条目数
    • estimatedSize

      public long estimatedSize()
      Description copied from interface: Cache
      Get estimated entry count (fast) 获取估算条目数(快速)
      Specified by:
      estimatedSize in interface Cache<K,V>
      Returns:
      estimated count | 估算数量
    • keys

      public Set<K> keys()
      Description copied from interface: Cache
      Get snapshot of all keys 获取所有键的快照
      Specified by:
      keys in interface Cache<K,V>
      Returns:
      set of keys | 键集合
    • values

      public Collection<V> values()
      Description copied from interface: Cache
      Get snapshot of all values 获取所有值的快照
      Specified by:
      values in interface Cache<K,V>
      Returns:
      collection of values | 值集合
    • entries

      public Set<Map.Entry<K,V>> entries()
      Description copied from interface: Cache
      Get snapshot of all entries 获取所有条目的快照
      Specified by:
      entries in interface Cache<K,V>
      Returns:
      set of entries | 条目集合
    • asMap

      public ConcurrentMap<K,V> asMap()
      Description copied from interface: Cache
      Get a concurrent map view of this cache 获取 ConcurrentMap 视图
      Specified by:
      asMap in interface Cache<K,V>
      Returns:
      concurrent map view | ConcurrentMap 视图
    • stats

      public CacheStats stats()
      Description copied from interface: Cache
      Get cache statistics 获取缓存统计信息
      Specified by:
      stats in interface Cache<K,V>
      Returns:
      cache statistics | 缓存统计
    • metrics

      public CacheMetrics metrics()
      Description copied from interface: Cache
      Get detailed cache metrics with latency percentiles 获取带延迟百分位数的详细缓存指标
      Specified by:
      metrics in interface Cache<K,V>
      Returns:
      cache metrics or null if not enabled | 缓存指标,未启用则返回 null
    • cleanUp

      public void cleanUp()
      Description copied from interface: Cache
      Perform cleanup (expired entries, etc.) 执行清理(过期条目等)
      Specified by:
      cleanUp in interface Cache<K,V>
    • async

      public AsyncCache<K,V> async()
      Description copied from interface: Cache
      Get async view of this cache 获取异步视图
      Specified by:
      async in interface Cache<K,V>
      Returns:
      async cache view | 异步缓存视图
    • name

      public String name()
      Description copied from interface: Cache
      Get cache name 获取缓存名称
      Specified by:
      name in interface Cache<K,V>
      Returns:
      cache name | 缓存名称
    • getProtectionStats

      public ProtectedCache.ProtectionStats getProtectionStats()
      Get protection statistics 获取保护统计
      Returns:
      protection stats | 保护统计
    • clearNegativeCache

      public void clearNegativeCache()
      Clear negative cache 清除负缓存
    • shutdown

      public void shutdown()
      Shutdown the protected cache and release resources 关闭保护缓存并释放资源
      Since:
      V2.0.3
    • close

      public void close()
      Close this cache, releasing all resources by delegating to shutdown(). 关闭此缓存,通过委托给 shutdown() 释放所有资源。
      Specified by:
      close in interface AutoCloseable
      Since:
      V1.0.3
    • isKeyNegativelyCached

      public boolean isKeyNegativelyCached(K key)
      Check if a key is in the negative cache 检查键是否在负缓存中
      Parameters:
      key - the key to check | 要检查的键
      Returns:
      true if negatively cached | 在负缓存中返回 true
      Since:
      V2.0.1
    • resetProtectionStats

      public void resetProtectionStats()
      Reset protection statistics (clears BloomFilter tracking) 重置保护统计(清除布隆过滤器跟踪)

      Note: This creates a new BloomFilter instance. Use with caution as it may temporarily increase false negatives until the filter is repopulated.

      注意:这会创建新的布隆过滤器实例。谨慎使用,因为在过滤器重新填充前可能会增加假阴性。

      Since:
      V2.0.1
    • mightContainInBloomFilter

      public boolean mightContainInBloomFilter(K key)
      Check if BloomFilter might contain a key (for negative lookup tracking) 检查布隆过滤器是否可能包含某键(用于负查找跟踪)
      Parameters:
      key - the key to check | 要检查的键
      Returns:
      true if might contain (could be false positive) | 可能包含返回 true(可能是假阳性)
      Since:
      V2.0.1