redis 持久化性能

总览

尽管有许多可用于Java的高性能消息传递系统,但大多数都避免引用基准,包括持久消息传递和消息的序列化/反序列化。 这样做有多种原因。 1)您并不总是需要或想要持久消息2)您希望使用自己的序列化选项。 避免使用它们的一个重要原因是,这两种方法都会使消息传递速度降低多达10倍,看起来并不那么好。 大多数消息传递基准测试都将重点介绍传递原始字节而没有持久性的性能,因为这提供了最高的数字。 有些还引用了持久消息编号,但是这些编号通常要慢得多。

如果您需要高效地对实际数据进行序列化和反序列化,并且即使您已学会了不使用这些数据,也想记录和重播消息该怎么办?

更高的性能序列化和耐用性

我已经编写了一个库,试图解决更多的问题,正如我所看到的,以便为您提供更好的整体解决方案。 它不是可用的最快消息传递,但是它是持久的,并且包括序列化和反序列化时间。 正如我已经指出的那样,这可能比传输序列化数据的成本高10倍,因此在实际应用中,该解决方案可以更快。

示例:发送价格

在此测试InProcessChronicleTest .testPricePublishing()中,我发送价格事件,该事件包括一个较长的时间戳,一个符号,一个出价价格/数量和要价/数量。 写入数据的时间为0.4 µS(0.0004毫秒),通过TCP连接接收数据的时间为1.8 µS。

注意:此连接在两端都是持久的,因此您可以查看哪些数据已排队发送和已接收。 如果连接丢失,即使服务器不可用(例如,重新启动客户端),它也可以从原来的位置继续播放,或者可以选择播放客户端已经收到的任何消息。

为了发送和接收500万条消息,我使用了-Xmx32m -verbosegc标志,该标志表明只需要很少的堆,并且在此测试过程中没有发生任何GC。 这意味着该库对您的其余应用程序影响很小。

与外部化对象进行比较。

为了说明这一点,我将其与在InProcessChronicleTest中序列化和反序列化包含相同数据的对象所需的时间进行了比较。 testSerializationPerformance()。 PriceUpdate对象是可外部化的,并且该基准测试 “比较JVM平台上序列化库的各个方面”表明,可外部化对象可以是可用的最快序列化之一。 在同一台计算机上花费的时间是2.7 µS进行序列化和7.5 µS进行反序列化。 注意:这不包括消息传递或持久性,仅用于序列化和反序列化。

序列化

运输

写作时间

时间阅读

Java纪事

TCP和持久性

0.4微秒

1.8微秒

可外部化

没有

2.7微秒

7.5微秒

可序列化

没有

3.8微秒

13.2微秒

结论

在对消息传递进行基准测试时,您应该包括发送和接收真实消息所花费的时间,而不仅是byte [],还包括持久性(如果需要)。

参考:来自Vantage Java博客的JCG合作伙伴 Peter Lawrey提供的高性能持久消息 。

翻译自: https://www.javacodegeeks.com/2013/02/high-performance-durable-messaging.html

redis 持久化性能