本地缓存 Caffeine 和 Redis 缓存延迟差多少?值的大小有影响吗?两者在语义上有什么不同(同一个对象、修改原对象、put 之后立刻读)?这篇在同一台机器上用 Spring Cache 的两种 CacheManager 实测。
Caffeine 命中读取(单线程 20 万次):平均 0.08 µs,P50 0.08 µs,P99 0.17 µs Redis 命中读取(单线程 5 万次):平均 42.34 µs,P50 36.71 µs,P99 106.29 µs Caffeine 8 线程读取:8 线程,39973 万次/秒 Redis 8 线程读取:8 线程,8 万次/秒
Caffeine 与 Redis 命中读取的延迟与 8 线程吞吐。
Caffeine 命中读取(单线程 20 万次):平均 0.07 µs,P50 0.04 µs,P99 0.13 µs Redis 命中读取(单线程 5 万次):平均 50.80 µs,P50 38.63 µs,P99 149.46 µs Caffeine 8 线程读取:8 线程,39376 万次/秒 Redis 8 线程读取:8 线程,7 万次/秒
值变大对本机回环下的 Redis 延迟影响很小。
Caffeine 命中读取(单线程 20 万次):平均 0.02 µs,P50 0.04 µs,P99 0.08 µs Redis 命中读取(单线程 5 万次):平均 56.40 µs,P50 42.88 µs,P99 208.04 µs Caffeine 8 线程读取:8 线程,40085 万次/秒 Redis 8 线程读取:8 线程,8 万次/秒
JDK 序列化的 POJO 对 Redis 延迟影响不明显。
Caffeine 未命中读取:平均 0.03 µs,P50 0.04 µs,P99 0.13 µs Redis 未命中读取:平均 37.13 µs,P50 34.58 µs,P99 65.08 µs Caffeine put:平均 0.05 µs,P50 0.04 µs,P99 0.17 µs Redis put:平均 3.75 µs,P50 2.21 µs,P99 7.00 µs
未命中同样要走网络;Redis 的 put 延迟低是因为返回时还没写完。
put 之后立刻 get(2000 次):Caffeine 读不到 0 次,Redis 读不到 1944 次 Redis put 之后反复 get 直到读到(300 次):最短 33.63 µs,中位数 79.83 µs,最长 1427.00 µs Caffeine 连续两次 get 取到的是不是同一个对象:true;是不是放进去的那个对象:true Redis 连续两次 get 取到的是不是同一个对象:false;是不是放进去的那个对象:false 放进去之后修改原对象的 name:Caffeine 里读到 已被修改;Redis 里读到 item-7 TTL 500 ms:300 ms 时 Caffeine 有=true、Redis 有=true;800 ms 时 Caffeine 有=false、Redis 有=false
可见性、对象引用、修改原对象、TTL 的差别。