gpt4 book ai didi

Java ehCache,如何替换成员

转载 作者:行者123 更新时间:2023-12-02 11:35:55 25 4
gpt4 key购买 nike

我有一个简单的方法,我已经注释了它用于缓存。

  @Cacheable(value = "devices", key = "#hardwareId", unless = "#result == null")
public Device get(String hardwareId)

我有一种机制可以知道何时有人更改底层数据库。这样我就知道从缓存中删除一个成员,以便下一次调用返回到数据库。

 getCache().remove(hardwareId);

我想做的就是替换缓存中的元素。原因是对数据库的回调可能需要 1000 毫秒,并且我希望方法的性能不会出现这样的问题。

据我所知,我有两个选择。

选项 1:

当我驱逐该成员时,当时回调服务。

 getCache().remove(hardwareId);
service.get(hardwareId);

选项 2:

  • 创建“net.sf.ehcache.bootstrap.BootstrapCacheLoader”的实例在启动时注册要通知元素的同一类从缓存中删除(notifyElementRemoved())。
  • 在@PostContruct上获取所有用@Cacheable注释的方法。创建一个 map 'cacheName' 到方法实例(java 反射方法)
  • 当notifyElementRemoved()被触发时,使用缓存名称获取Method实例,并调用它来触发缓存重新填充。

    Method method = map.get(cacheName);
    // Add magic here to get the service.
    Object serviceInstance = applicationContext.getBean("deviceService");

    if (Proxy.isProxyClass(serviceInstance.getClass())) {
    Proxy.getInvocationHandler(serviceInstance).invoke(serviceInstance, method, new Object[] {objectKey});
    } else {
    method.invoke(serviceInstance, objectKey);
    }

选项 1 的缺点是我必须修改 30 多个类才能放入回调服务的逻辑。

方案2的缺点是有点复杂,感觉如果ehCache能提供这个功能就好了。它知道它包装了什么方法,它知道调用该方法的键/参数是什么。

这两个选项的缺点是,缓存总会有不包含成员的时候,并且可能会导致性能下降。

我的问题是,ehCache 是否提供了我想要的功能,或者是否有其他机制可以在缓存为空的时间为零的情况下替换缓存中的成员?

最佳答案

不要选择选项 2。太复杂了。一般来说,它的方式是有一个 @Cacheable 和一个 @CachePut 方法。为什么不使用它?

@Cacheable(value = "devices", key = "#hardwareId", unless = "#result == null")
public Device get(String hardwareId)

@CachePut(value ="devices", key= "#hardwardId", unless = "#result == null")
public Device update(String hardwareId)

它应该可以彻底解决您的问题。

顺便说一句,您不需要指定 key 。这是隐式的。

关于Java ehCache,如何替换成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48945484/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com