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

时间:2018-09-19 13:28:21

标签: java regex caching infinispan

我有一组模式,可以匹配每个请求来确定要做什么。模式的数量目前约为60个,但很快就会增加到1000个以上。

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

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

编辑

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

2 个答案:

答案 0 :(得分:1)

  

缓存模式对象有问题吗?

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

Pattern对象的内部,您会看到实际上只有原始的模式字符串被序列化了。这就是说,Pattern实例在反序列化(又名从分布式缓存中获取)时,需要再次构建内部解析树。

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

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

答案 1 :(得分:0)

From the Javadoc

  

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

因此,一定要编译一次并重新使用它们。

  

Pattern.compile()真的很快

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