跳转到正文

Store 重点文件与方法

用于选择数据接口、核对重载和实现扩展。数据示例见数据操作,缓存回源见查询结果缓存,并发控制见锁与限流

本页按重点文件查阅方法;表内方法名可打开源码。重载共享的约束写在表前,差异在各行说明。源码链接固定到核对版本,接入前提见快速开始

StoreTemplate

源码:StoreTemplate

一个模板固定命名空间和 Codec;注入 StoreClient 后创建模板,不要每次请求随机创建命名空间。五类数据使用独立类型空间,Atomic 不使用值 Codec。

方法 / 重载用途、参数与返回值注意事项
namespace()返回当前 StoreNamespace,便于确认键所属应用和模块。同一逻辑键只有在命名空间、类型均相同的情况下才共享数据。
codec()返回 StoreCodec<T>,编码模板中的 T。跨服务读写必须使用兼容的编码协议。
value()返回 ValueStore<T>,存单值。切换接口不会迁移已有数据。
map()返回 MapStore<T>,按 String 字段存值。TTL 属于整个 Map。
set()返回 SetStore<T>,按编码结果去重。不保证迭代顺序。
list()返回 ListStore<T>,按位置存值。下标从 0 开始。
atomic()返回 AtomicStore,读写 long 计数器。独立于 T;缺失值读取为 0。
scanKeys()返回惰性 Iterable<StoreKey>,等价于 scanKeys("*")。只扫描五类数据,不含锁和限流键。
scanKeys(String pattern)按 glob 逐类型扫描;每项给出 type() 和 key()。不是一致性快照,可能重复;应逐项处理,不全量收集到内存。

KeyStore

源码:KeyStore

五类数据接口共同继承的键生命周期契约。key 必须非 null 且非空白;底层 TTL 必须为正 Duration。多个调用不组成事务。

方法 / 重载用途、参数与返回值注意事项
exists(String key)返回当前类型空间是否存在该键。空集合在本地与 Redis 的留键行为不同,判断内容请用 size。
delete(String key)删除整键;删除成功 true,缺失 false。Map 字段、Set/List 成员一并删除;不会删除其他类型的同名键。
expire(String key, Duration ttl)为已有键设置相对有效期;不存在 false。不能通过 expire 创建键;写入后设置过期存在两步之间的失败窗口。
expireAt(String key, Instant deadline)未来时刻转换为 TTL;时间已到时直接 delete。deadline=null 抛 IllegalArgumentException;返回值沿用 expire/delete。
keys(String pattern)返回有限 Set<String>,默认请求 1000 条。仍受 scan-max-results 上限限制,不适合完整导出。
keys(String pattern, int limit)按 glob 返回最多限制数量的逻辑键。limit 需为正数;无排序保证。
scanKeys()惰性扫描全部本类型逻辑键,等价于 "*"。不受 keys 的结果数量上限约束。
scanKeys(String pattern)按 glob 惰性遍历。接口默认抛 UnsupportedOperationException;内置两种后端提供实现,自定义后端需覆盖。

ValueStore

源码:ValueStore

保存非 null 的单值。内置后端的条件删除比较编码字节;同样的业务对象必须编码稳定,才能用于比较。

方法 / 重载用途、参数与返回值注意事项
set(String key, T value)覆盖写入,不设过期。会清除旧 TTL,临时数据应选带 ttl 的重载。
set(String key, T value, Duration ttl)覆盖值并指定有效期。ttl 必须正数;不要把 DataCache 的非法 TTL 规则套到这里。
get(String key)返回解码后的 T;不存在返回 null。读取不续期;解码错误可能向外抛出。
getAndDelete(String key)原子读取并删除,返回旧值或 null。适合临时值一次性领取,不具备消息确认和重投。
compareAndDelete(String key, T expected)仅当存储字节匹配 expected 的编码时删除;返回是否删除。内置后端支持;接口默认不支持。可防止坏缓存清理误删并发新值。

MapStore

源码:MapStore

field 不能空白,值不能 null;整表及字段/值集合是不可写回的结果,修改要调用存储方法。

方法 / 重载用途、参数与返回值注意事项
get(String key)返回全部字段和值;缺失为空 Map。整键一次性加载,无顺序保证。
get(String key, String field)读取单字段;缺失返回 null。不创建键、不续期。
put(String key, String field, T value)新增或覆盖一个字段,无返回值。已有集合 TTL 不主动刷新。
putAll(String key, Map<String,T> values)合并所有字段,同名字段覆盖。不是整表替换;需要替换时显式编排删除与写入,并考虑并发。
remove(String key, String field)删除一个字段,返回实际是否移除。不删除其他字段。
contains(String key, String field)判断字段存在;缺失 false。先 contains 再 put 不是原子条件写入。
size(String key)返回 long 字段数量,缺失 0。数量可能随并发修改变化。
fields(String key)返回字段 Set,缺失为空集合。不能通过修改返回值写回。
values(String key)返回值 Collection,缺失为空集合。不同字段可持有相同值,不去重。

SetStore

源码:SetStore

以编码结果判断成员是否相同。集合无顺序,读取结果不可修改;整集合共享 TTL。

方法 / 重载用途、参数与返回值注意事项
members(String key)返回全部成员 Set<T>,缺失为空。读取开销随成员数增长。
add(String key, T value)新增一个非 null 成员,返回是否新增。重复成员返回 false。
addAll(String key, Collection<T> values)批量新增,返回实际新增 long 数量。输入中的重复值不会增加计数。
contains(String key, T value)判断成员是否存在。不是业务授权判断。
remove(String key, T value)移除单成员,返回是否移除。缺失 false,不报“记录不存在”。
removeAll(String key, Collection<T> values)移除多个成员,返回实际移除数量。不是删除整个键。
size(String key)返回成员 long 数量,缺失 0。跨调用读取不保证同一快照。

ListStore

源码:ListStore

列表下标从 0 开始。range 的边界为左闭右开且必须满足 0 <= from <= to <= size,越界抛 IndexOutOfBoundsException;不按 Redis LRANGE 的负下标或自动截断规则使用。

方法 / 重载用途、参数与返回值注意事项
get(String key)返回全部元素 List<T>;缺失为空列表。结果不可变,列表很大时改用 range。
range(String key, int fromInclusive, int toExclusive)返回指定半开区间。缺失键只有 [0,0) 合法;Redis 长度检查和读取之间可能被并发改变。
get(String key, int index)返回指定位置元素。越界抛异常,不返回 null。
set(String key, int index, T value)替换指定位置元素。不自动扩容或追加;value 非 null。
addFirst(String key, T value)头部追加单值。改变后续所有下标。
addLast(String key, T value)尾部追加单值。不主动刷新旧 TTL。
addAllFirst(String key, Collection<T> values)整批按输入迭代顺序插到头部。[a,b] 得到 a,b,原元素,不是 b,a。
addAllLast(String key, Collection<T> values)按输入顺序追加到尾部。不等于可靠消息入队。
pollFirst(String key)移除并返回头元素,空列表 null。非阻塞,不等待新元素。
pollLast(String key)移除并返回尾元素,空列表 null。消费后没有失败重试。
remove(String key, int index)按下标移除并返回旧值。Integer 类型模板传 int 时优先落入此重载。
remove(String key, T value)移除首个编码相同的值,返回 boolean。删除 Integer 值时使用 Integer.valueOf,避免误选下标重载。
contains(String key, T value)判断列表是否含该编码值。不要用于大列表高频检索。
size(String key)返回 long 长度,缺失 0。读取后不能假定下标一直有效。

AtomicStore

源码:AtomicStore

保存 long;缺失键按 0 读取。递增带 TTL 的内置实现先更新计数再设置过期,所以设置失败时计数可能已经变化。

方法 / 重载用途、参数与返回值注意事项
get(String key)读取当前计数,缺失 0。0 不能区分未创建与真实零值。
getAndIncrement(String key)递增 1,返回更新前值。首次返回 0。
getAndIncrement(String key, Duration ttl)递增并刷新 TTL,返回旧值。每次续期,调用前自行校验 ttl。
incrementAndGet(String key)递增 1,返回更新后值。首次返回 1。
incrementAndGet(String key, Duration ttl)递增并刷新 TTL,返回新值。不适合作为固定窗口的直接替代。
compareAndSet(String key, long expect, long update, Duration ttl)当前计数等于 expect 才更新并设置 TTL,返回是否成功。缺失按 0 比较;比较失败时本地可能留下零值键。接口默认不支持,内置后端已覆盖。

DataCacheUtil

源码:DataCacheUtil

注入此 Bean 对数据库查询做 JSON 缓存。构造器接收 StoreTemplate<String>StoreLockManager,第三个 boolean 参数控制 enabled,二参数构造默认 true。所有参数对象必须有效;查询类型用 Class<T> 表达,复杂嵌套泛型不能仅靠原始 Class 保留。

方法 / 重载用途、参数与返回值注意事项
DataCacheUtil(StoreTemplate<String> storeTemplate, StoreLockManager lockManager)手动构造启用缓存的实例。通常由自动配置提供;锁后端和数据后端的共享范围应一致。
DataCacheUtil(StoreTemplate<String> storeTemplate, StoreLockManager lockManager, boolean enabled)显式控制缓存是否启用。false 时仍校验调用参数,但直接回源,不读写缓存。
get(String key, Supplier<T> supplier, Class<T> clazz, Consumer<ValueStore<String>> expirationAction)读缓存,未命中时加键锁并二次读取,再回源;非 null 结果才写入。坏 JSON 条件删除后重新回源;过期回调抛异常会条件删除刚写的数据并重新抛出。
list(String key, Supplier<List<T>> supplier, Class<T> clazz, Consumer<ValueStore<String>> expirationAction)按元素类型解析 JSON 数组;未命中流程同 get。null 和空列表不缓存,连续空查询仍会回源。
delete(String key)启用时删除缓存值,返回 void。禁用时不清理旧值;业务更新后由应用主动失效。

DataCacheObjectUtil

源码:DataCacheObjectUtil

DataCacheUtil 实现的便捷重载;缓存键必须包含影响结果的用户/租户、筛选条件和数据类型,避免同键返回错误对象。

方法 / 重载用途、参数与返回值注意事项
get(String key, Supplier<T> supplier, Class<T> clazz)命中直接返回,未命中回源;无过期回调。写入后为永久缓存,需要显式 delete。
get(String key, Supplier<T> supplier, Class<T> clazz, Duration duration)正 duration 才设置相对过期。null、0、负数退化为永久缓存,不会抛底层 TTL 错误。
get(String key, Supplier<T> supplier, Class<T> clazz, LocalDateTime expireTime)用 JVM 默认时区转为 Instant,写入后设置绝对截止时间。null 抛异常;截止时间已过时仍返回回源数据,但缓存随即删除。
get(String key, Supplier<T> supplier, Class<T> clazz, Consumer<ValueStore<String>> expirationAction)由调用者对 ValueStore 设置过期策略。回调只在回源数据被写入后执行;命中不续期。

DataCacheListUtil

源码:DataCacheListUtil

DataCacheUtil 实现的便捷重载;缓存键必须包含影响结果的用户/租户、筛选条件和数据类型,避免同键返回错误对象。

方法 / 重载用途、参数与返回值注意事项
list(String key, Supplier<List<T>> supplier, Class<T> clazz)命中直接返回,未命中回源;无过期回调。写入后为永久缓存,需要显式 delete。
list(String key, Supplier<List<T>> supplier, Class<T> clazz, Duration duration)正 duration 才设置相对过期。null、0、负数退化为永久缓存,不会抛底层 TTL 错误。
list(String key, Supplier<List<T>> supplier, Class<T> clazz, LocalDateTime expireTime)用 JVM 默认时区转为 Instant,写入后设置绝对截止时间。null 抛异常;截止时间已过时仍返回回源数据,但缓存随即删除。
list(String key, Supplier<List<T>> supplier, Class<T> clazz, Consumer<ValueStore<String>> expirationAction)由调用者对 ValueStore 设置过期策略。回调只在回源数据被写入后执行;命中不续期。

StoreLockManager

源码:StoreLockManager

使用作用域方法包住同步业务,退出作用域时释放锁。Runnable 不返回业务结果,Supplier<T> 返回 action.get() 的 T。action 抛出的异常向外传播;锁不提供数据库事务,也不能保护在 action 中启动后立即返回的异步任务。

方法 / 重载用途、参数与返回值注意事项
withLock(String key, Runnable action)按后端默认等待策略取得单键锁后执行;返回 void。默认等待策略见后端配置。键必须非空白。
withLock(String key, Supplier<T> action)按后端默认等待策略取得单键锁后执行;返回业务结果 T。默认等待策略见后端配置。键必须非空白。
withLock(String key, Duration waitTime, Runnable action)等待至限定时间并取得单键锁后执行;返回 void。超时抛 StoreLockException。键必须非空白。
withLock(String key, Duration waitTime, Supplier<T> action)等待至限定时间并取得单键锁后执行;返回业务结果 T。超时抛 StoreLockException。键必须非空白。
withLocks(Collection<String> keys, Runnable action)按后端默认等待策略取得全部键锁后执行;返回 void。默认等待策略见后端配置。多键去重后按字典序获取、逆序释放。
withLocks(Collection<String> keys, Supplier<T> action)按后端默认等待策略取得全部键锁后执行;返回业务结果 T。默认等待策略见后端配置。多键去重后按字典序获取、逆序释放。
withLocks(Collection<String> keys, Duration waitTime, Runnable action)等待至限定时间并取得全部键锁后执行;返回 void。超时抛 StoreLockException。多键去重后按字典序获取、逆序释放。
withLocks(Collection<String> keys, Duration waitTime, Supplier<T> action)等待至限定时间并取得全部键锁后执行;返回业务结果 T。超时抛 StoreLockException。多键去重后按字典序获取、逆序释放。
tryWithLock(String key, Duration waitTime, Runnable action)拿到锁后执行并返回 true,超时返回 false 且不执行 action。waitTime 必须为正;不能把业务 action 抛异常当作 false。
tryWithLocks(Collection<String> keys, Duration waitTime, Runnable action)全部锁成功才执行一次 action;waitTime 是整组共享预算。集合非空,键逐一校验;失败释放已持有的锁,不能按每个键重新计算等待预算。

StoreRateLimiterManager

源码:StoreRateLimiterManager

先配置额度策略,再申请正数 permits;同一个 key 对应一条策略。它控制调用速率,不替代身份或业务配额持久化。

方法 / 重载用途、参数与返回值注意事项
configure(String key, RateLimitPolicy policy)注册或更新该键的许可数和周期。相同策略重复配置保留已有状态;策略改变时重建/重置额度。本地是平滑速率,Redis 使用共享周期额度,见锁与限流页。
tryAcquire(String key, long permits)立即申请额度,成功 true,额度不足 false。没有配置、参数非法或后端故障不是普通的 false;本地 permits 不得超过 Integer.MAX_VALUE。
acquire(String key, long permits)阻塞等待额度,取得后返回 void。可能长时间占用请求线程,实时接口优先使用 tryAcquire。

一次完整调用

以下片段放入已经注入 StoreTemplate<String> storeStoreLockManager locks 的业务方法,import 使用 java.time.Duration

java
locks.withLock("job:42", Duration.ofSeconds(2), () -> {
    store.value().set("job:42:state", "ready", Duration.ofMinutes(5));
});
String state = store.value().get("job:42:state"); // 未过期且没有并发覆盖时为 ready
boolean claimed = store.value().compareAndDelete("job:42:state", "ready");

这里锁保护设置状态的同步调用;条件删除独立保证只删除匹配值。两者都不证明下载文件已生成或数据库已提交。完整接入配置见快速开始