为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕哥6287543 2021-09-29 10:59:15
我有一组模式可以匹配每个请求来确定要做什么。模式的数量现在约为 60,但很快就会增长到 1000 多个。我从数据库中获取模式,并使用 infinispan 来缓存我的模式。Pattern.compile()真的很快,我不确定是否应该缓存编译模式或字符串。Pattern似乎是Serializable。缓存Pattern对象有什么问题吗?编辑我正在使用远程 infinispan。它是一个分布式缓存。
查看完整描述

2 回答

?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

从 Javadoc

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

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

Pattern.compile() 真的很快

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


查看完整回答
反对 回复 2021-09-29
?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

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

您可以同时执行这两种操作,缓存模式字符串或Pattern对象。我建议在分布式缓存中缓存模式字符串。

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

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

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


查看完整回答
反对 回复 2021-09-29
  • 2 回答
  • 0 关注
  • 350 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号