当前位置: 首页 > 知识库问答 >
问题:

正确使用Qukus缓存与Reactive和Mutiny

秦伯寅
2023-03-14

我正在尝试将我的项目迁移到具有Hibernate反应模式的Quarkus反应模式,我不知道如何处理缓存。

我原来的方法是这样的

    @Transactional
    @CacheResult(cacheName = "subject-cache")
    public Subject getSubject(@CacheKey String subjectId) throws Exception {
        return subjectRepository.findByIdentifier(subjectId);
    }

主题通过缓存键“subjectId”从缓存中加载(如果可用)。

迁移到兵变会是这样的

    @CacheResult(cacheName = "subject-cache")
    public Uni<Subject> getSubject(@CacheKey String subjectId) {
        return subjectRepository.findByIdentifier(subjectId);
    }

但是,将Uni对象存储在缓存中是不对的。

还有将缓存作为bean注入的选项,但是,回退函数不支持返回Uni:

    @Inject
    @CacheName("subject-cache")
    Cache cache;


  //does not work, cache.get function requires return type Subject, not Uni<Subject>
  public Uni<Subject> getSubject(String subjectId) {
        return cache.get(subjectId, s -> subjectRepository.findByIdentifier(subjectId));
    }

  //This works, needs blocking call to repo, to return response wrapped in new Uni
  public Uni<Subject> getSubject(String subjectId) {
        return cache.get(subjectId, s -> subjectRepository.findByIdentifier(subjectId).await().indefinitely());
    }

@CacheResult注释是否可以与Uni/Multi一起使用,并且所有内容都可以在后台正确处理?

共有2个答案

易风华
2023-03-14

缓存Uni的问题在于,根据Uni的创建方式,多个订阅可能会多次触发某些代码。为了避免这种情况,您必须像这样记住Uni:

@CacheResult(cacheName = "subject-cache")
public Uni<Subject> getSubject(@CacheKey String subjectId) {
    return subjectRepository.findByIdentifier(subjectId)
        .memoize().indefinitely();
}

这将确保对缓存的Uni的每个订阅都将始终返回相同的值(项或失败),而不会重新执行原始Uni流的任何内容。

齐博厚
2023-03-14

您在返回Uni的方法上使用CacheResult的示例应该实际可行。该实现将自动“剥离”Uni类型,并仅将主题存储在缓存中。

 类似资料:
  • 问题内容: X项目包含以下部分: 一个。Spring Data存储库具有单独的方法,例如: b。hibernate方式也使用“ xobjects”缓存。 问题#1 由于有两种添加对象以缓存的方法,因此可能是同一对象出现2次的情况。如何更好地解决这个问题?例如,使用结果对象中的键。就像是: 键=“#result.id” 问题#2 我不想在调用“保存”方法时从缓存中逐出所有对象,但是我不确定当前的实现

  • 我很清楚关于这个话题有多个问题,但我就是弄不懂它的意思。问题似乎是没有将新值添加到@cacheable列表中。 调试完问题后,我发现问题似乎出在钥匙上。 下面是代码片段 所以当我调用save方法时,用于缓存的关键字是incrementing integer,或者1,2,3...但是当我尝试获取所有文档时,缓存使用SimpleKey[]作为键。如果我尝试为@Cacheable使用相同的键,我会得到S

  • 问题内容: 我有一个返回字符串的吸气剂,并且我正在将它与其他一些String进行比较。我检查返回的值是否为null,因此我的陈述看起来像这样(如果确实为真,我确实会提前退出) 从性能上来说,存储返回的String而不是像这样两次调用getter会更好吗?有关系吗 为了回答评论中的问题,这种检查并不经常执行,并且吸气剂非常简单。我最好奇的是,分配新的局部变量与执行getter的额外时间相比如何。 问

  • 问题内容: 我还没有使用过Redis,但我听说过它,并打算尝试将其作为缓存存储。 我听说Redis使用内存作为缓存存储数据库,那么如果我使用变量作为对象或字典数据类型来存储数据有什么区别?喜欢: Redis有什么优势? 问题答案: Redis是一个 远程 数据结构服务器。这肯定比仅将数据存储在本地内存中要慢(因为它涉及套接字往返来获取/存储数据)。但是,它也带来了一些有趣的属性: 应用程序的所有进

  • 我有以下应用程序(我对这个框架很陌生),我想看到缓存大小(增加),因为它从队列中读取消息,但它一直保持为0。 有人能告诉我缺失了什么/错了什么吗? 谢谢!

  • classpath : herosphp\cache\CacheFactory herophp的缓存是通过缓存工厂来管理的,CacheFactory 负责创建缓存,默认采用的是单例模式,也就是同一类型的缓存在应用中只会存再一个实例。 $cacher = CacheFactory::create('file', true); 我们为缓存工具定义了一个 ICache接口,它定义了以下接口方法: get