【问题标题】:Remove cache entries by prefix按前缀删除缓存条目
【发布时间】:2012-10-07 09:50:43
【问题描述】:

编辑
Circumflex 访问ehcache's getKeys,因此应该可以在 Play 中进行类似操作,前提是 Cache 插件实现公开了 getKeys,这可能是不可能的(假设每个 Cache 库都提供了一种查询缓存中所有键的方法)

原创 有没有办法通过 EhCache 的键前缀删除缓存条目?

我正在使用默认使用 EhCache 的 Play 框架的缓存实现。

查看 Play 2 Scala Cache.scala 我看到了一个删除方法,它接受一个字符串,即要删除的键,但我想知道 EhCache 本身是否支持按前缀删除(如果是,我将向 Play 开发人员提出功能请求对于 2.1 快照)

就目前而言,我正在使用一个辅助方法,它获取一个常用缓存键列表并删除匹配项:

object clear {
  def apply(key: String, keys: List[String] = List()) = {
    if(keys.size > 0) keys.filter(_.startsWith(key)) map(Cache.remove(_))
    else Cache.remove(key)
  }
}

但是与将任何键前缀直接传递给缓存删除相比,维护一个固定键列表是愚蠢的

【问题讨论】:

    标签: playframework-2.0 ehcache prefix


    【解决方案1】:

    根据EHCache plugin,您也可以直接访问EHCache,只需使用CacheManager.create() 静态方法:

    net.sf.ehcache.Cache cache = net.sf.ehcache.CacheManager.create().getCache("play");
    

    create() 方法返回现有实例(如果存在)。

    【讨论】:

    • Nico 不错,但如果可能的话,我想直接玩 Play Cache 插件。
    • 所以你必须编写自己的缓存插件:正如@biesior 所说,目前,Play Cache API 仅包含setgetremove
    【解决方案2】:

    不幸的是,当前 EhCache 在 Play 中的实现非常基础,并且仅限于像 put cache entrydelete cache entry 这样的操作。可惜。

    另一方面,EhCache 提供了更复杂的方式来管理缓存条目,包括使其可通过自定义字段、索引等进行搜索,因此可以创建 http://ehcache.org/documentation/apis/search

    当然,如果它在 Play 中实现开箱即用,那就太棒了,但我可以想象开发人员的观点:'让每个功能都使用子系统Play 中可用会破坏框架的轻便性' - 这是我的猜测,我同意。

    因此,在这种情况下,最好的选择就是为 Play 创建一个新模块,我们称之为 CachePlus,它将按需结合 EC 的功能。无论如何有人必须启动它并与他人分享:)

    【讨论】:

    • 它可能很小,因为它必须支持任何缓存实现,而不仅仅是 EhCache——不确定 Redis 等人是否支持 getKeys 访问器,但如果支持,如果 Play 公开该方法会很好! (我发布到 Play 用户组,它可能会在帖子的海洋中迷失......)
    • 在我看来是戏剧!团队应该使用一个简单的包装方法(类似于 getWrappedCacheObject())来扩展特征“CacheAPI”,该方法返回原始缓存对象。用户可以将其转换为 EhCache 或其他任何内容,并使用具有所有功能的原始实现,或者用户不使用原始缓存对象来保持干净并独立于缓存实现。每个人都会很高兴。 :-)
    猜你喜欢
    • 2011-06-14
    • 1970-01-01
    • 2021-11-02
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    相关资源
    最近更新 更多