我需要缓存来自ReactiveMongoRepository的数据。数据大约每年更新两次,所以我不在乎缓存是否过期。
由于我们不能将@Cacheable与flux一起使用,我想找到一种简单明了的方法来存储来自Mongo到redis的数据,如果存在,就使用该数据,否则就存储并服务于原始数据。
有没有比
@GetMapping
public Flux<AvailableInspection> getAvailableInspectionsRedis() {
AtomicInteger ad = new AtomicInteger();
return availableInspectionReactiveRedisOperations.opsForZSet().range("availableInspections", Range.<Long>from(Range.Bound.inclusive(0L)).to(Range.Bound.inclusive(-1L)))
.switchIfEmpty(availableInspectionMongoRepository.findAll().map(e -> {
availableInspectionReactiveRedisOperations.opsForZSet().add("availableInspections", e, ad.getAndIncrement()).block();
return e;
}));
}
我明确寻找的是一个选项,可以让我像@Cacheable注释一样缓存数据。我正在寻找一个通用的解决方案来缓存任何类型的通量。
我怀疑这个问题是否有现成的解决方案。但是,您可以轻松构建自己的接口,以获取通用缓存对象并将其加载到缓存:
public interface GetCachedOrLoad<T> {
Flux<T> getCachedOrLoad(String key, Flux<T> loader, Class<? extends T> clazz);
}
每个需要此功能的类都将通过构造函数注入它,并按如下方式使用它:
public class PersistedObjectRepository {
private final GetCachedOrLoad<PersistedObject> getCachedOrLoad;
public PersistedObjectRepository(final GetCachedOrLoad<PersistedObject> getCachedOrLoad) {
this.getCachedOrLoad = getCachedOrLoad;
}
public Flux<PersistedObject> queryPersistedObject(final String key) {
return getCachedOrLoad.getCachedOrLoad(key, queryMongoDB(key), PersistedObject.class);
}
private Flux<PersistedObject> queryMongoDB(String key) {
// use reactivemongo api to retrieve Flux<PersistedObject>
}
}
然后需要创建一个实现GetCachedOrLoad的对象
public class RedisCache<T> implements GetCachedOrLoad<T> {
private final Function<String, Flux<String>> getFromCache;
private final BiConsumer<String, String> loadToCache;
private final Gson gson;
public RedisCache(Gson gson, RedisReactiveCommands<String, String> redisCommands) {
this.getFromCache = key -> redisCommands.lrange(key, 0, -1);
this.loadToCache = redisCommands::lpush;
this.gson = gson;
}
@Override
public Flux<T> getCachedOrLoad(final String key, Flux<T> loader, Class<? extends T> clazz) {
final Flux<T> cacheResults = getFromCache.apply(key)
.map(json -> gson.fromJson(json, clazz));
return cacheResults.switchIfEmpty(
loader.doOnNext(value -> loadToCache.accept(key, gson.toJson(value))));
}
}
希望这足够通用:)
PS.这不是一个生产就绪的实现,需要根据您自己的需要进行调整,如添加异常处理、自定义json序列化等。
需求是再页面内打开一个弹窗然后显示外部页面。 但是外部页面都是http 无法使用
问题内容: 以前,我总是以为Vector在长度未知的情况下可以很好地用于非描述对象。据我所知,我也认为它也是线程安全的 有什么改变不应该再使用了,替代方案是什么? 问题答案: 您应该使用而不是。虽然使用了内部同步,但是对于实际的一致性而言,这很少够用,只会在真正不需要时降低执行速度。 另请参阅此stackoverflow问题。
问题内容: 出于各种原因,在编写 Java应用程序时 ,调用会被皱眉,所以如何通知调用过程并非一切都按计划进行? 编辑: 1是任何非零退出代码的。 问题答案: 当“应用程序”实际上是较大的Java应用程序(服务器)的子应用程序(例如servlet,applet)时,对的使用会被拒绝:在这种情况下,它可能会停止JVM并因此停止所有其他子应用程序。在这种情况下,抛出适当的异常(最好由应用程序框架/服务
问题内容: 我知道这个话题已经解决了上千次。但是我找不到解决办法。 我正在尝试计算列表(df2.list2)的列中出现列表(df1.list1的每一行)的频率。所有列表仅包含唯一值。List1包含约300.000行,list2包含30.000行。 我有一个有效的代码,但是它的运行速度非常慢(因为我使用的是迭代程序)。我也尝试过itertuples(),但它给了我一个错误(“要解压缩的值太多(预期2
允许我填充包含复选框和单选按钮的HTML表单的替代方法。 我已经设法使用eclipse中的HtmlUnit库将数据发送到html表单并检索页面(我已经发布了下面的Java代码)。 然而,当我将这些代码复制到我的Android项目中时,我发现Android不支持HtmlUnit库。 对于Android来说,HtmlUnit还有其他替代方案吗?另一种方法应该能够将文本、复选框、单选按钮填写到Html表
朋友 Jackson框架提供了基于注释的方法来在序列化过程中发出类型信息。 我不想在我的任何类中使用@JsonTypeInfo注释。 上述注释是否有替代方案。 如果是,请举例说明如何做到这一点。