You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在apollo-kotlin客户端中为SqlNormalizedCacheFactory设置过期时间?

如何为SqlNormalizedCacheFactory设置过期时间

和MemoryCacheFactory能直接通过构造参数设置过期时间不同,SqlNormalizedCacheFactory本身并没有提供expireAfterMillis这类直接设置过期的参数,不过可以通过两种常用方式实现过期逻辑:

方法一:用ExpirationCache包装SQL缓存

借助ExpirationCache来给SqlNormalizedCache实例添加过期控制,代码示例如下:

// 先创建基础的SQL缓存工厂
val sqlCacheFactory = SqlNormalizedCacheFactory(context, "your_db_name")
// 用ExpirationCache包装SQL缓存,设置过期时间
val expiringCache = ExpirationCache(
    delegate = sqlCacheFactory.create(),
    expireAfterMillis = 1000 // 这里设置1秒过期
)
// 用包装后的缓存构建ApolloClient
val apolloClient = ApolloClient.Builder()
    .serverUrl("your_server_url")
    .normalizedCache(expiringCache)
    .build()

方法二:自定义带过期逻辑的SQL缓存工厂

如果需要在多个地方复用带过期的SQL缓存,可以自己封装一个工厂类:

class ExpiringSqlNormalizedCacheFactory(
    private val context: Context,
    private val dbName: String,
    private val expireAfterMillis: Long
) : NormalizedCacheFactory() {
    override fun create(): NormalizedCache {
        val baseSqlCache = SqlNormalizedCacheFactory(context, dbName).create()
        return ExpirationCache(baseSqlCache, expireAfterMillis)
    }
}

// 使用时直接实例化自定义工厂
val expiringSqlFactory = ExpiringSqlNormalizedCacheFactory(
    context = context,
    dbName = "your_db_name",
    expireAfterMillis = 1000
)

val apolloClient = ApolloClient.Builder()
    .serverUrl("your_server_url")
    .normalizedCache(expiringSqlFactory)
    .build()

要提一句的是,ExpirationCache的过期逻辑是:缓存项在被读取或写入时会刷新过期时间,而且它不会主动去清理过期的缓存项,只有当你尝试读取某个已经过期的项时,才会把它移除并返回null。

内容的提问来源于stack exchange,提问作者raiden

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 11:17:16