【问题标题】:Pattern.compile() from cached string vs Caching the compiled patternPattern.compile() from cached string vs Caching the compiled pattern
【发布时间】:2018-09-20 16:27:36
【问题描述】:

我有一组模式,我匹配每个请求以确定要做什么。现在模式的数量约为 60,但很快就会增长到 1000 多个。

我从数据库中获取模式并使用 infinispan 缓存我的模式。

Pattern.compile() 真的很快,我不确定是否应该缓存编译模式或字符串。 Pattern 似乎是 Serializable。缓存 Pattern 对象有什么问题吗?

编辑

我正在使用远程 infinispan。它是一个分布式缓存。

【问题讨论】:

    标签: java regex caching infinispan


    【解决方案1】:

    缓存 Pattern 对象有什么问题吗?

    您可以同时缓存模式字符串或Pattern 对象。我建议在分布式缓存中缓存模式字符串。

    查看Pattern 对象的内部结构,您会发现实际上只有原始模式字符串被序列化。这意味着,当反序列化(也就是从分布式缓存中获取)时,Pattern 实例需要再次构建内部解析树。

    使用缓存模式字符串,您将有两个优势:当您检查缓存内容时,它是可读的,而不是二进制的。在序列化形式中,您存储的数据比您需要的更多,因为序列化流将包含类型。所以我期待一个微小的优势,因为序列化开销不存在。

    如果您的模式很复杂,再次构建对象树的成本会更高。为了解决这个问题,您需要一个进程内缓存来缓存实际的对象引用。您可以将这些与分布式缓存结合使用。具有最快访问时间的现代进程内缓存将是 Caffeine 或 cache2k。您可以节省多少时间,取决于您的整体情况。

    【讨论】:

      【解决方案2】:

      From the Javadoc:

      此类的实例是不可变的,并且可以安全地被多个并发线程使用。

      所以,无论如何都要编译一次并重用它们。

      Pattern.compile() 真的很快

      它相当快,但不不必要地运行它会更快。

      【讨论】:

      • 但我是从分布式缓存中获取的?
      猜你喜欢
      • 2022-11-20
      • 2013-08-13
      • 1970-01-01
      • 1970-01-01
      • 2022-12-01
      • 2022-12-27
      • 1970-01-01
      • 1970-01-01
      • 2022-07-07
      相关资源
      最近更新 更多