如何在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
相关产品推荐
相关产品推荐

