Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring cache/jsr107:作为键的一部分的列表/集合参数_Java_Spring_Caching_Jcache_Jsr107 - Fatal编程技术网

Java Spring cache/jsr107:作为键的一部分的列表/集合参数

Java Spring cache/jsr107:作为键的一部分的列表/集合参数,java,spring,caching,jcache,jsr107,Java,Spring,Caching,Jcache,Jsr107,我有一个服务,它调用外部系统,通过外部id检索某种对象,并将它们提交回更新。与逐个检索对象不同,还有一种更通用的方法: public interface ExternalSystem { List<ExternalDTO> getObjects(List<String> externalIds); void updateObjects(List<ExternalDTO> updates); } 公共接口外部系统{ 列出getObjects(

我有一个服务,它调用外部系统,通过外部id检索某种对象,并将它们提交回更新。与逐个检索对象不同,还有一种更通用的方法:

public interface ExternalSystem {
    List<ExternalDTO> getObjects(List<String> externalIds);

    void updateObjects(List<ExternalDTO> updates);
}
公共接口外部系统{
列出getObjects(列出ExternalId);
作废更新对象(列表更新);
}
我想在ExternalSystem调用之上放置一个缓存,因为它们非常昂贵

在服务的实现中,我可以简单地添加spring注释:

@Cacheable("cache-external")
List<ExternalDTO> getObjects(List<String> externalIds) {} 

@CacheEvict(cacheNames="cache-external", allEntries=true)
void updateObjects(List<ExternalDTO> updates);
@Cacheable(“缓存外部”)
List getObjects(List ExternalId){}
@cacheexecute(cacheNames=“cache external”,allEntries=true)
作废更新对象(列表更新);
然而,如果ExternalID之间有很多交集,那么这样的缓存将表现得非常糟糕

  • 调用#1 getObjects([1,2,3,4])->按[1,2,3,4]键放入缓存
  • 调用#2 getObjects([1,2,3,4,5])->由[1,2,3,4,5]键放入的缓存
  • 调用#3 getObjects([6,7,8,9])->通过[6,7,8,9]键放入缓存
  • 调用#4 updateObjects()->退出所有缓存,但第三个缓存不包含3个缓存
  • 所以,问题是如何实现定制策略(我假设它不是现成的),它将只逐出那些真正应该逐出的条目,并使键以这样的方式从缓存中检索相交对象

    Upd.我发现了两个类似的问题:

  • Upd2. 这里有一些类似于我想要的东西,只是我将为集合中的每个项放入字符串和ExternalDTO的缓存对中。

    AFAIK这在注释中是不可能的。您可以使用命令式API,它包含您需要的批量操作,例如
    Cache.getAll(keySet)
    Cache.removeAll(keySet)
    AFAIK这在注释中是不可能的。您可以使用命令式API,它包含您需要的批量操作,例如
    Cache.getAll(keySet)
    Cache.removeAll(keySet)
    对于我来说,它可以很好地使用此配置。 这是我的代码的模糊版本

    @Cacheable(cacheNames = "test", key = "#p0")
    public List<String> getTestFunction(List<String> someIds) {
    
    你看,它包含字符串

    ... Computed cache key '[A, B, C]' ...
    
    我的设置: /参考资料/ehcache.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <ehcache>
        <cache name="test"
               maxBytesLocalHeap="1M"
               timeToLiveSeconds="300"/>
    </ehcache>
    

    对我来说,它与这个配置配合得很好。 这是我的代码的模糊版本

    @Cacheable(cacheNames = "test", key = "#p0")
    public List<String> getTestFunction(List<String> someIds) {
    
    你看,它包含字符串

    ... Computed cache key '[A, B, C]' ...
    
    我的设置: /参考资料/ehcache.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <ehcache>
        <cache name="test"
               maxBytesLocalHeap="1M"
               timeToLiveSeconds="300"/>
    </ehcache>
    

    是的,我打赌应该已经有一些自定义实现了。问题不仅仅是关于删除,请参阅Upd中的附加问题。只是好奇:您的应用程序通常一次请求多少实例?如果您不能通过批量请求,而是一个接一个地执行,您是否会无法满足客户的最大延迟要求?如果您选择自定义解决方案:您是否分析了所有应用程序,这是影响最大的优化?只是问问;)这是一个好问题,但即使在我的情况下可行,在其他情况下也可能不可行。所以,这个问题比我的情况更一般。因此,我正在为这种情况寻找某种可重用的解决方案。如果我找不到它,我会自己写并发布在这里:)是的,我打赌应该已经有一些自定义实现了。问题不仅仅是关于删除,请参阅Upd中的附加问题。只是好奇:您的应用程序通常一次请求多少实例?如果您不能通过批量请求,而是一个接一个地执行,您是否会无法满足客户的最大延迟要求?如果您选择自定义解决方案:您是否分析了所有应用程序,这是影响最大的优化?只是问问;)这是一个好问题,但即使在我的情况下可行,在其他情况下也可能不可行。所以,这个问题比我的情况更一般。因此,我正在为这种情况寻找某种可重用的解决方案。如果我没有找到它,我会写我自己的,并发布在这里:)什么是#p0?…我只是在谷歌上搜索了什么#p0,这只是参数1的值,它是十六进制的引用。您使用十六进制引用作为键,我认为这是不合适的。@Fernando您是对的,这是第一个参数的值。1.什么是十六进制引用?2.为什么不合适?什么是#p0?…我刚在谷歌上搜索了#p0,那只是参数1的值,它是十六进制的一个引用。您使用十六进制引用作为键,我认为这是不合适的。@Fernando您是对的,这是第一个参数的值。1.什么是十六进制引用?2.为什么不合适呢?