【问题标题】:Clearing memcache AppEngine not working清除内存缓存 AppEngine 不起作用
【发布时间】:2011-12-19 22:35:13
【问题描述】:

我在 AppEngine 中使用 memcache 会话处理。有时在发布时,我会以一种使内存缓存内容过时的方式更改对象。当我这样做并进行测试时,我希望能够清除我的会话。

我添加了一个 servlet 来清除使用的内存缓存:

        try {
            CacheFactory cacheFactory = CacheManager.getInstance()
                    .getCacheFactory();
            cacheFactory.createCache(Collections.emptyMap()).clear();
            outputMessage(response, "CLEARED cache");
        } catch (CacheException e1) {
            LOG.log(Level.SEVERE, "cache issue", e1);
            outputMessage(response, "cache issue!!!!!!!!");
        }

然后我使用以下方法转储会话内容:

    Enumeration<String> e = request.getSession().getAttributeNames();

    outputMessage(response, "DUMPING SESSION..");

    while (e.hasMoreElements()) {
        String name = e.nextElement();

        outputMessage(response, "Name:" + name + " value: "
                + request.getSession().getAttribute(name).toString());

    }

在清除之前和之后进行会话转储看起来没有任何不同。

我用对了吗?

干杯

【问题讨论】:

  • “清除会话”是什么意思? Memcache 不同于会话。
  • 你是如何倾销价值的?请给我们看一些代码。
  • 感谢反馈,更新问题

标签: java google-app-engine servlets memcached


【解决方案1】:

为了解决这个问题,我通常会在存储在 memcache 中的对象的键上附加一个版本 ID。例如,而不是:

memcache.add('key', 'value')

我愿意:

version = '1'    
memcache.add(VERSION + '#key', 'value')

之后,如果我想使memcache中的所有数据失效,我只需更改版本号(并且已经存储在memcache中的条目到期时会自动删除)。

【讨论】:

  • 您应该注意您的密钥不能与您用于版本的数字重叠。例如,如果我查看 memcache 并看到 2 个键,17 和 117,很难判断它们是否都用于对象 7,一个来自版本 1,一个来自版本 11,或者它们是否用于对象 7 和 17,都来自版本 1。
  • 是的,你是对的,这就是我在版本和密钥之间添加“#”的原因 - 并确保没有任何密钥包含“#”字符。
  • 那么您在清除内存缓存时也遇到了问题?或者只是因为这个问题?
  • 使用这个添加前缀的技巧后,我没有问题了。
猜你喜欢
  • 2016-07-24
  • 1970-01-01
  • 2012-04-07
  • 1970-01-01
  • 2021-03-04
  • 2021-11-02
  • 1970-01-01
  • 2018-02-12
  • 2019-05-15
相关资源
最近更新 更多