Redis vs Valkey

Background

过去一年各大云服务厂商在Redis换license之后,力推使用Valkey代替Redis作为kv内存数据库的使用方案。Valkey作为Redis 7.2.4 fork,不仅兼容redis各个语言的client库,也解决了Redis目前存在的单线程性能瓶颈和内存占用问题,不禁好奇其性能有多大提升,周末找了个时间进行了性能benchmark。

已有youtube博主进行过benchmark,但由于方法不同结果仅供参考,可以与本文结果进行互相比较

关于Valkey相较于Redis的改进,主要有两个,一个是io-thread, 另一个是数据结构内存优化, 可以参见以下两篇blog post:

其中io-thread是最重要的改进,支持了Epoll job并行执行,建议配置

io-thread=<核心数>
events-per-io-thread=2 (default)
io-threads-do-reads=yes (default)

img

另外,需要注意Redis 7.2.4 之后引入的 feature 如 time series, vector db, valkey 可能没有很好的支持,参考Redis方面的post
Valkey实验版本支持了RDMA,不经过OS和CPU直接进行数据读取,继续提升性能,参考以下两篇:

Method

instance: RaspberryPi 5b, 4vcore 8GiB
kennel: linux 6.14.0-1005-raspi
redis: 8.0.0
valkey: 8.1.0
command: `redis-benchmark -h <host>`
client number: 50 (default)
request number: 100000 (default)

valkey单核: io-threads=1
valkey多核: io-threads=4

Result

Redis 8.0

testrpsavg_latency_msmin_latency_msp50_latency_msp95_latency_msp99_latency_msmax_latency_ms
PING_INLINE22031.291.9060.6642.0552.6072.8154.767
PING_MBULK28935.181.3110.640.9192.2392.4874.415
SET30969.341.5830.7841.5671.8391.9353.175
GET31486.141.5570.7361.5431.7991.8953.615
INCR31240.241.4370.5681.4231.8711.9832.991
LPUSH30778.71.4770.6241.4631.8952.0153.511
RPUSH31084.861.4610.5041.4391.8711.9994.431
LPOP31328.321.4780.4481.4231.8231.9273.079
RPOP31377.471.4970.5361.4551.8312.0235.439
SADD32123.361.3390.5521.3991.8071.9592.599
HSET31210.991.480.8321.4551.8551.9913.959
SPOP31908.11.4580.441.4311.7831.9274.159
ZADD31220.731.4750.841.4231.8391.9592.679
ZPOPMIN32765.41.480.5761.4631.7351.8553.671
LPUSH (needed to benchmark LRANGE)31113.881.4850.6081.4391.8552.0074.287
LRANGE_100 (first 100 elements)25906.741.1890.5041.1671.4791.7433.215
LRANGE_300 (first 300 elements)16460.912.1721.0721.9993.4873.7916.567
LRANGE_500 (first 500 elements)12318.32.1950.6642.1672.4152.8476.247
LRANGE_600 (first 600 elements)10948.112.5441.7842.4633.0393.9997.655
MSET (10 keys)27639.581.7871.0961.7192.1752.4233.831

Valkey 8.1, 单核

testrpsavg_latency_msmin_latency_msp50_latency_msp95_latency_msp99_latency_msmax_latency_ms
PING_INLINE26910.661.2240.6321.1591.6552.3914.863
PING_MBULK24125.451.5330.61.3752.3352.6954.615
SET27019.721.8170.4641.8552.1432.2713.727
GET31655.591.4560.7041.4231.8071.9273.447
INCR31625.551.470.7761.4631.8231.9513.007
LPUSH31104.21.4790.641.4631.8631.9833.031
RPUSH32435.941.4930.5841.4791.7671.9033.719
LPOP312501.4860.5841.4791.8632.0073.527
RPOP30684.261.4070.41.3911.9352.0393.023
SADD31201.251.2640.481.3111.7591.9113.911
HSET31565.661.4760.6081.4311.8071.9273.287
SPOP31938.681.450.5761.4151.7831.8953.039
ZADD30703.11.4910.6481.4631.9032.0634.511
ZPOPMIN32164.681.4860.5441.4711.7751.9353.191
LPUSH (needed to benchmark LRANGE)31525.851.4910.61.4791.8311.9833.215
LRANGE_100 (first 100 elements)26595.741.4030.4641.3672.0792.2633.751
LRANGE_300 (first 300 elements)12635.832.091.2482.0792.2952.4318.663
LRANGE_500 (first 500 elements)9476.882.7511.5922.7432.9913.15111.335
LRANGE_600 (first 600 elements)8437.393.0791.6643.0713.5193.73512.471
MSET (10 keys)35063.111.2860.5761.2551.7351.8152.543

Valkey 8.1, 多核

testrpsavg_latency_msmin_latency_msp50_latency_msp95_latency_msp99_latency_msmax_latency_ms
PING_INLINE35637.921.0230.240.8391.3514.69531.135
PING_MBULK38358.271.0720.2320.8631.6315.78326.095
SET44404.970.6660.240.6550.7191.3832.975
GET50226.020.6360.1840.6150.7671.03113.511
INCR50100.200.6760.1920.5990.7672.28719.855
LPUSH51975.050.6320.2320.5990.7111.07131.135
RPUSH55218.110.5770.2320.5750.6710.7911.695
LPOP57570.520.5810.1920.5670.7030.9672.039
RPOP54734.540.6370.1840.5670.7353.28712.919
SADD57736.720.5760.2080.5670.6870.8713.975
HSET53191.490.6580.1680.5670.8072.91919.791
SPOP57736.720.5740.1920.5670.6950.8871.663
ZADD57836.900.5800.240.5750.6950.8792.855
ZPOPMIN57770.080.5730.2320.5670.6870.8551.679
LPUSH (needed to benchmark LRANGE)56561.090.5930.2480.5670.6951.02318.127
LRANGE_100 (first 100 elements)38417.210.8400.2960.7350.9113.75921.263
LRANGE_300 (first 300 elements)18491.121.5320.5361.5111.6632.2477.679
LRANGE_500 (first 500 elements)12712.942.1300.3522.0952.2873.40711.007
LRANGE_600 (first 600 elements)11059.502.3990.6722.3672.5672.86322.751
MSET (10 keys)57240.980.6940.20.6870.8551.0474.727

Valkey/Redis, 单核

testrpsavg_latency_msmin_latency_msp50_latency_msp95_latency_msp99_latency_msmax_latency_ms
PING_INLINE22.15%-35.78%-4.82%-43.60%-36.52%-15.06%2.01%
PING_MBULK-16.62%16.93%-6.25%49.62%4.29%8.36%4.53%
SET-12.75%14.78%-40.82%18.38%16.53%17.36%17.39%
GET0.54%-6.49%-4.35%-7.78%0.44%1.69%-4.65%
INCR1.23%2.30%36.62%2.81%-2.57%-1.61%0.53%
LPUSH1.06%0.14%2.56%0.00%-1.69%-1.59%-13.67%
RPUSH4.35%2.19%15.87%2.78%-5.56%-4.80%-16.07%
LPOP-0.25%0.54%30.36%3.94%2.19%4.15%14.55%
RPOP-2.21%-6.01%-25.37%-4.40%5.68%0.79%-44.42%
SADD-2.87%-5.60%-13.04%-6.29%-2.66%-2.45%50.48%
HSET1.14%-0.27%-26.92%-1.65%-2.59%-3.21%-16.97%
SPOP0.10%-0.55%30.91%-1.12%0.00%-1.66%-26.93%
ZADD-1.66%1.08%-22.86%2.81%3.48%5.31%68.38%
ZPOPMIN-1.83%0.41%-5.56%0.55%2.31%4.31%-13.08%
LPUSH (needed to benchmark LRANGE)1.32%0.40%-1.32%2.78%-1.29%-1.20%-25.01%
LRANGE_100 (first 100 elements)2.66%18.00%-7.94%17.14%40.57%29.83%16.67%
LRANGE_300 (first 300 elements)-23.24%-3.78%16.42%4.00%-34.18%-35.87%31.92%
LRANGE_500 (first 500 elements)-23.07%25.33%139.76%26.58%23.85%10.68%81.45%
LRANGE_600 (first 600 elements)-22.93%21.03%-6.73%24.69%15.79%-6.60%62.91%
MSET (10 keys)26.86%-28.04%-47.45%-26.99%-20.23%-25.09%-33.62%

Valkey/Redis, 多核

testrpsavg_latency_msmin_latency_msp50_latency_msp95_latency_msp99_latency_msmax_latency_ms
PING_INLINE61.76%86.31%176.67%144.93%92.97%-40.04%-84.69%
PING_MBULK32.57%22.29%175.86%6.49%37.28%-56.99%-83.08%
SET43.38%137.69%226.67%139.24%155.77%39.91%6.72%
GET59.52%144.81%300.00%150.89%134.55%83.80%-73.24%
INCR60.37%112.57%195.83%137.56%143.94%-13.29%-84.94%
LPUSH68.87%133.70%168.97%144.24%166.53%88.14%-88.72%
RPUSH77.64%153.21%117.24%150.26%178.84%152.72%161.42%
LPOP83.77%154.39%133.33%150.97%159.32%99.28%51.01%
RPOP74.44%135.01%191.30%156.61%149.12%-38.45%-57.90%
SADD79.73%132.47%165.38%146.74%163.03%124.91%-34.62%
HSET70.43%124.92%395.24%156.61%129.86%-31.79%-80.00%
SPOP80.95%154.01%129.17%152.38%156.55%117.25%150.09%
ZADD85.25%154.31%250.00%147.48%164.60%122.87%-6.16%
ZPOPMIN76.31%158.29%148.28%158.02%152.55%116.96%118.64%
LPUSH (needed to benchmark LRANGE)81.79%150.42%145.16%153.79%166.91%96.19%-76.35%
LRANGE_100 (first 100 elements)48.29%41.55%70.27%58.78%62.35%-53.63%-84.88%
LRANGE_300 (first 300 elements)12.33%41.78%100.00%32.30%109.68%68.71%-14.48%
LRANGE_500 (first 500 elements)3.20%3.05%88.64%3.44%5.60%-16.44%-43.25%
LRANGE_600 (first 600 elements)1.02%6.04%165.48%4.06%18.39%39.68%-66.35%
MSET (10 keys)107.10%157.49%448.00%150.22%154.39%131.42%-18.95%

Conclusion

从rps/latency指标来看,大多数常用指令(GET SET L/RPUSH L/RPOP)单核性能大差不差,多核性能提升巨大,主要提升都由valkey独有的io-thread架构带来,高并发场景会有更好的支持。

另外注意到Valkey的LRANGE性能明显不如Redis,其本身也是一个slow command,使用需要注意。

如没有使用Redis 7.2.4 后新版本 feature 的需求,可以推荐从Redis无痛切换到Valkey。

Reference