【问题标题】:Invalidating namespace using simple spring memcached使用简单的spring memcached使命名空间无效
【发布时间】:2012-05-23 21:50:53
【问题描述】:

有没有人尝试过基于时间戳使 memcached 命名空间失效? 例如我需要一个 memcached 命名空间,它是托管我的 API 服务的 tomcat 服务器的时间戳。我需要注释我的方法调用,以便命名空间是一个变量(而不是一个常量),并且它包含服务器启动的时间戳。

@ReadThroughAssignCache(namespace = "api_divisions_", assignedKey="allDivisions")
public List<Division> getAllDivisions()
{
    List<Division> all = (List<Division>)getHibernateTemplate().find("from Division");
    return all;
}

那么每次服务器启动时,这个方法上的命名空间都需要动态设置为服务器启动时间。

更新 - 我知道有一种使用 javaassist 和动态注释的迂回方法,但我想要一种更好的方法。

-戈茨

【问题讨论】:

    标签: spring-mvc memcached simple-spring-memcached ssm


    【解决方案1】:

    命名空间始终是常量,不能使用变量。 据我了解,您想使用服务器启动时间创建缓存键。 至少有两种方法可以做到。 第一:使用@ReadThroughSingleCache

    @ReadThroughSingleCache(namespace = "api_divisions_allDivisions")
    public List<Division> getAllDivisions(@ParameterValueKeyProvider long startup)
    {
      List<Division> all = (List<Division>)getHibernateTemplate().find("from Division");
      return all;
    }
    

    第二种:使用自定义CacheKeyBuilder,可以为每个缓存键添加时间戳。

    您需要在服务器启动之前存储旧值吗?如果不是,那么简单的解决方案是始终使用相同的缓存键并在服务器启动时清理 memcached。

    【讨论】:

    • 感谢您的回复。好吧,我不需要服务器启动时的旧值。使用时间戳是在服务器启动时刷新缓存并让 LRU 处理其余部分的简单方法。但是有没有一种方法可以让我在服务器启动时使用 SSM API 使缓存失效?
    • 创建自定义 spring bean,它依赖于 Cache,并作为调用 Cache.flush 的这个 bean set 方法的 init-method。它应该可以按您的意愿工作。请记住,在多服务器环境中,重新启动其中一台服务器将使所有服务器的缓存失效(我假设所有服务器都使用相同的 memcached 实例)。
    • 是的,所有服务器都使用相同的缓存实例。会试一试。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2011-04-11
    • 2023-03-14
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    相关资源
    最近更新 更多