Class TaggedCache<K,V>
- Type Parameters:
K- the type of keys | 键类型V- the type of values | 值类型
- All Implemented Interfaces:
Cache<K,V>
Allows associating cache entries with one or more tags, and invalidating all entries associated with a given tag in a single operation.
允许将缓存条目与一个或多个标签关联,并在单次操作中失效给定标签下的所有条目。
Features | 主要功能:
- Tag-based batch invalidation - 基于标签的批量失效
- Multi-tag support per entry - 每个条目支持多标签
- Bidirectional tag-key index - 双向标签-键索引
- Automatic index cleanup on invalidation - 失效时自动清理索引
- Thread-safe concurrent operations - 线程安全的并发操作
Usage Examples | 使用示例:
// Create tagged cache
Cache<String, String> base = OpenCache.<String, String>builder()
.maximumSize(1000)
.build();
TaggedCache<String, String> cache = TaggedCache.wrap(base);
// Put with tags
cache.put("user:1", "Alice", "role:admin", "dept:eng");
cache.put("user:2", "Bob", "role:user", "dept:eng");
cache.put("user:3", "Carol", "role:admin", "dept:hr");
// Query by tag
Set<String> admins = cache.getKeysByTag("role:admin"); // [user:1, user:3]
Set<String> tags = cache.getTags("user:1"); // [role:admin, dept:eng]
// Invalidate by tag — removes all entries tagged with "dept:eng"
cache.invalidateByTag("dept:eng"); // removes user:1 and user:2
// Invalidate by multiple tags
cache.invalidateByTags("role:admin", "role:user");
Performance | 性能特性:
- put/get/invalidate: O(1) delegate + O(tags) index maintenance - O(1) 委托 + O(标签数) 索引维护
- invalidateByTag: O(keys in tag) - O(标签下的键数)
- Memory overhead: two ConcurrentHashMap indexes - 内存开销: 两个 ConcurrentHashMap 索引
Security | 安全性:
- Thread-safe: Yes (ConcurrentHashMap + atomic operations) - 线程安全: 是(ConcurrentHashMap + 原子操作)
- Null-safe: Rejects null tags - 空值安全: 拒绝 null 标签
- Since:
- JDK 25, opencode-base-cache V1.0.3
- Author:
- Leon Soo www.LeonSoo.com
- See Also:
-
Method Summary
Modifier and TypeMethodDescriptionvoidAdd tags to a key in the tag index 给键追加标签到标签索引asMap()Get a concurrent map view of this cache 获取 ConcurrentMap 视图AsyncCache<K, V> async()Get async view of this cache 获取异步视图voidcleanUp()Perform cleanup (expired entries, etc.)Compute a new value for the key 计算键的新值computeIfPresent(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction) Compute a new value if key is present 如果键存在则计算新值booleancontainsKey(K key) Check if key exists 检查键是否存在entries()Get snapshot of all entries 获取所有条目的快照longGet estimated entry count (fast) 获取估算条目数(快速)Get value by key, returns null if not present 根据键获取值,不存在返回 nullGet value by key, load using loader if not present 根据键获取值,不存在时通过 loader 加载Get all values for given keys, returns only existing entries 批量获取,仅返回存在的条目Get all values, load missing keys using loader 批量获取,缺失的键通过 loader 加载Get all known tags 获取所有已知标签getAndRemove(K key) Get value and remove the entry atomically 原子地获取值并删除条目getKeysByTag(String tag) Get all keys associated with a tag 获取标签下所有键Get all tags associated with a key 获取键的所有标签intgetTagSize(String tag) Get the count of entries associated with a tag 获取标签下的条目数voidinvalidate(K key) Invalidate a single key 使单个键失效voidInvalidate all entries 清空所有缓存voidinvalidateAll(Iterable<? extends K> keys) Invalidate multiple keys 批量失效voidinvalidateByTag(String tag) Invalidate all entries associated with the given tag 按标签批量失效所有关联条目voidinvalidateByTags(String... tags) Invalidate all entries associated with any of the given tags 按多个标签批量失效所有关联条目keys()Get snapshot of all keys 获取所有键的快照metrics()Get detailed cache metrics with latency percentiles 获取带延迟百分位数的详细缓存指标name()Get cache name 获取缓存名称voidPut a key-value pair into cache 放入键值对voidPut a key-value pair with associated tags 放入带标签的键值对voidPut all key-value pairs into cache 批量放入voidputAllWithTtl(Map<? extends K, ? extends V> map, Duration ttl) Put all entries with custom TTL 批量放入并指定自定义 TTLbooleanputIfAbsent(K key, V value) Put if the key is absent, returns true if successful 不存在时放入,成功返回 truebooleanputIfAbsentWithTtl(K key, V value, Duration ttl) Put if absent with custom TTL 不存在时放入并指定自定义 TTLvoidputWithTtl(K key, V value, Duration ttl) Put a key-value pair with custom TTL (overrides default expiration) 放入键值对并指定自定义 TTL(覆盖默认过期时间)voidputWithTtl(K key, V value, Duration ttl, String... tags) Put a key-value pair with TTL and associated tags 放入带 TTL 和标签的键值对Replace value only if key is present 仅在键存在时替换值booleanReplace value only if current value equals expected value 仅在当前值等于期望值时替换longsize()Get exact entry count (may be slow) 获取精确条目数(可能较慢)stats()Get cache statistics 获取缓存统计信息values()Get snapshot of all values 获取所有值的快照static <K,V> TaggedCache <K, V> Wrap an existing cache with tag support 用标签支持包装现有缓存Methods inherited from class Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface Cache
clear, computeIfAbsent, computeIfMatch, containsValue, entryIterator, entryParallelStream, entryStream, forEach, forEachKey, forEachValue, getByPattern, getIfPresent, getOptional, getOrDefault, getOrNull, invalidateByPattern, invalidateByValue, invalidateIf, isEmpty, keyIterator, keyParallelStream, keyStream, merge, putAllIfAbsent, putIfPresent, removeIfEquals, removeIfPresent, replaceAll, replaceIf, resetStats, updateAll, updateTtl, updateTtl, updateTtlAll, valueParallelStream, valueStream
-
Method Details
-
wrap
Wrap an existing cache with tag support 用标签支持包装现有缓存- Type Parameters:
K- key type | 键类型V- value type | 值类型- Parameters:
cache- the cache to wrap | 要包装的缓存- Returns:
- tagged cache decorator | 标签缓存装饰器
-
put
-
putWithTtl
-
addTags
Add tags to a key in the tag index 给键追加标签到标签索引Tags are always added to the index. If the key is not currently in the cache, stale tag entries will be cleaned up automatically during the next
invalidate(K)orinvalidateByTag(String)operation.标签始终会被添加到索引中。如果键当前不在缓存中,过期的标签条目将在下次
invalidate(K)或invalidateByTag(String)操作时自动清理。- Parameters:
key- the key | 键tags- the tags to add | 要追加的标签
-
getKeysByTag
-
getTags
-
invalidateByTag
Invalidate all entries associated with the given tag 按标签批量失效所有关联条目- Parameters:
tag- the tag | 标签
-
invalidateByTags
Invalidate all entries associated with any of the given tags 按多个标签批量失效所有关联条目- Parameters:
tags- the tags | 标签数组
-
getAllTags
-
getTagSize
Get the count of entries associated with a tag 获取标签下的条目数- Parameters:
tag- the tag | 标签- Returns:
- count of entries | 条目数
-
get
-
get
Description copied from interface:CacheGet value by key, load using loader if not present 根据键获取值,不存在时通过 loader 加载 -
getAll
-
getAll
-
put
-
putAll
-
putIfAbsent
Description copied from interface:CachePut if the key is absent, returns true if successful 不存在时放入,成功返回 true- Specified by:
putIfAbsentin interfaceCache<K,V> - Parameters:
key- the key | 键value- the value | 值- Returns:
- true if put successfully | 成功放入返回 true
-
putWithTtl
Description copied from interface:CachePut a key-value pair with custom TTL (overrides default expiration) 放入键值对并指定自定义 TTL(覆盖默认过期时间)- Specified by:
putWithTtlin interfaceCache<K,V> - Parameters:
key- the key | 键value- the value | 值ttl- the time-to-live for this entry | 此条目的存活时间
-
putAllWithTtl
Description copied from interface:CachePut all entries with custom TTL 批量放入并指定自定义 TTL- Specified by:
putAllWithTtlin interfaceCache<K,V> - Parameters:
map- the key-value pairs | 键值对 Mapttl- the time-to-live for all entries | 所有条目的存活时间
-
putIfAbsentWithTtl
Description copied from interface:CachePut if absent with custom TTL 不存在时放入并指定自定义 TTL- Specified by:
putIfAbsentWithTtlin interfaceCache<K,V> - Parameters:
key- the key | 键value- the value | 值ttl- the time-to-live | 存活时间- Returns:
- true if put successfully | 成功放入返回 true
-
invalidate
-
invalidateAll
-
invalidateAll
public void invalidateAll()Description copied from interface:CacheInvalidate all entries 清空所有缓存- Specified by:
invalidateAllin interfaceCache<K,V>
-
containsKey
-
size
-
estimatedSize
public long estimatedSize()Description copied from interface:CacheGet estimated entry count (fast) 获取估算条目数(快速)- Specified by:
estimatedSizein interfaceCache<K,V> - Returns:
- estimated count | 估算数量
-
keys
-
values
-
entries
-
asMap
-
stats
-
metrics
-
cleanUp
-
async
-
name
-
computeIfPresent
Description copied from interface:CacheCompute 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:
computeIfPresentin interfaceCache<K,V> - Parameters:
key- the key | 键remappingFunction- the function to compute new value | 计算新值的函数- Returns:
- the new value or null if removed/absent | 新值,如果被删除或不存在则返回 null
-
compute
Description copied from interface:CacheCompute 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,则删除条目。
-
replace
-
replace
Description copied from interface:CacheReplace value only if current value equals expected value 仅在当前值等于期望值时替换 -
getAndRemove
-