【问题标题】:command object cache invalidation命令对象缓存失效
【发布时间】:2011-05-02 13:10:22
【问题描述】:

我有一个应用程序,它实现了一个命令对象模式来从服务器获取数据。现在我想实现一个客户端缓存,我需要一些关于如何处理缓存 eviction 失效的指针。

问题

为了获得一个对象,我通过 GetObject(id) 命令并接收带有该 id 结果的 GetObjectResponse。我有一个缓存可以很好地缓存 GetObject(id) 的响应。

但是,当我看到像 DeleteObject(id) 或 UpdateObject(id) 这样的命令时,GetObject(id) 的缓存响应需要失效。

我应该说,现实不一定像使用单个 id 参数那样简单。一些响应对象依赖于命令对象中的多个参数。此外,传递一个命令对象可能会使多个响应对象无效。

关于如何实现这一点的任何想法?提前致谢!

【问题讨论】:

  • 引用 Haacked 的话:计算机科学中只有两个难题。命名事物、缓存失效和一个错误。
  • 既然您已经在使用命令模式,请查看责任链模式。

标签: design-patterns caching


【解决方案1】:

首先,这个问题叫做缓存失效,而不是驱逐。 (我看到你使用这两个术语。)缓存驱逐意味着当缓存已满时从缓存中删除元素。这是一个完全不同的话题。

其次,我看不到命令​​模式和缓存之间的联系。无论如何,让我们专注于缓存。

当使一个元素失效时,你必须在缓存中找到它。这与检索元素的工作方式相同:通过使用缓存 key 查找值。这样的键可以是您提到的 id 或其他一些独特的值元组。此 id 或元组的外观取决于您的域(您使用命令模式的方式)。

关于您的上一个问题,必须有一条规则告诉您当某个其他元素无效时哪些元素将无效。这取决于您的命令模式应用程序背后的逻辑。我无法从你的描述中看出这样的规则到底是什么样的。

【讨论】:

  • 感谢您澄清我的术语困惑。我想我正在寻找有关如何构建这些失效规则的提示。
【解决方案2】:

据我了解,您的客户端需要具有服务器状态的本地缓存。 当服务器状态发生变化时,您的客户端需要得到通知和更新。 我的建议是从使整个缓存无效的极端情况开始,然后在不发送服务器的整个状态的情况下采用更小、更精细的方法来更新缓存。进行更精细更新的一个想法是“标记”服务器状态的每个更改,以便客户端可以发送他的最后一个标记,然后服务器可以根据他的当前标记计算更新客户端的最佳方式(整个更新或只是字段)。

【讨论】:

    【解决方案3】:

    我最终用这个方法编写了一个 CacheInvalidationGenerator 类:

    public ArrayList<Action> getInvalidForAction(Action action) {
      ArrayList<Action> result = new ArrayList<Action>();
      if (action.getClass()==UpdateObject.class) {
        UpdateObject a = (UpdateObject) action;
        result.add(new GetObject(a.getObjectId()));
      }
      return result;
    }
    

    该方法只是从缓存中返回要失效的操作对象。当然,这些也会产生失效,所以这个方法应该递归调用。

    【讨论】:

      猜你喜欢
      • 2011-10-22
      • 2018-07-11
      • 2018-12-28
      • 2015-04-29
      • 2022-08-15
      • 2010-10-22
      • 2012-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多