Pattern.compile() 来自缓存的字符串 vs 缓存已编译的模式

Pattern.compile() from cached string vs Caching the compiled pattern

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

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

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

编辑

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

From the Javadoc:

Instances of this class are immutable and are safe for use by multiple concurrent threads.

所以,一定要编译一次并重新使用它们。

Pattern.compile() is really fast

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

Is there any issue with caching Pattern objects?

两者都可以,缓存模式字符串或 Pattern 对象。我建议在分布式缓存中缓存模式字符串。

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

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

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