You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

KeyDB配置多线程后未生效,长查询仍阻塞普通读写请求?

KeyDB多线程并行查询能力实测

我正在测试KeyDB的性能提升效果,因为Redis的单线程查询模型确实存在瓶颈。据KeyDB官方文档介绍,其采用「真实多线程」实现数据库并行查询,不同于Redis仅支持IO多线程、查询执行仍为单线程的架构。
官方文档说明如下:

与Redis6、Elasticache不同,KeyDB在多个层面实现了多线程,包括将事件循环运行在多个线程上,网络IO、查询解析均可并发执行。

测试环境与步骤

  • 首先在Ubuntu(WSL2)环境安装并启动KeyDB,启动时显示有2个活跃线程:Thread 0 alive. Thread 1 alive.
  • 修改keydb.conf配置文件关闭持久化功能,核心配置server-threads 2;也试过不使用配置文件,直接通过启动参数--server-threads 2指定,甚至设置为4线程,效果均无差异。
  • 测试脚本逻辑:
    • 先向一个hash结构中写入100万条简单JSON对象数据
    • 编写控制台测试程序,开启两个线程:一个线程循环执行简单的SET key1 1或GET key1 1请求;另一个线程等待1秒后执行HGETALL testhash长查询。

测试代码基于StackExchange.Redis库开发。

预期结果

长查询运行期间,简单SET/GET请求的响应时间应与平时一致,保持在0-1ms左右,不会因KeyDB阻塞出现延迟或限流。

实际结果

长查询运行期间,简单SET/GET请求出现了500-700ms的阻塞延迟,说明KeyDB实际仍仅使用单线程执行查询,和Redis的阻塞表现一致,未实现预期的多线程并行查询能力。

测试日志如下:
当输出「Starting long query」时开始执行HGETALL,之后立即出现简单SET请求延迟超过500ms的情况,而正常情况下这类请求耗时仅0-1ms。

使用ServiceStack Redis客户端的日志

10:50:55.336    GetValueFromHashAsync took 1
10:50:55.367    GetValueFromHashAsync took 1
10:50:55.397    GetValueFromHashAsync took 0
10:50:55.416    Starting long query
10:50:56.191    GetValueFromHashAsync took 766 <-- 被限流!我判断这是查询执行阶段导致的延迟,而非IO阶段延迟,此时长查询尚未返回结果
10:50:56.228    GetValueFromHashAsync took 0
10:50:56.261    GetValueFromHashAsync took 1
....
....
10:51:00.592    GetValueFromHashAsync took 1
10:51:00.620    GetValueFromHashAsync took 1
10:51:00.651    GetValueFromHashAsync took 1
10:51:00.663    Long query done in 5244        <-- 长查询至此返回完成,总耗时约5秒,其中短请求被阻塞时长约0.7秒

我也测试过将短请求替换为hash读取操作,阻塞现象相同。

使用StackExchange.Redis客户端的日志

11:27:12.084    HashGetAsync took 0
11:27:12.115    HashGetAsync took 0
11:27:12.146    HashGetAsync took 0
11:27:12.177    HashGetAsync took 1
11:27:12.183    Starting long query
11:27:14.877    Long query done in 2692
11:27:14.893    HashGetAsync took 2686      <-- 被限流!本次短请求被阻塞的时长等于长查询的总耗时(查询+IO)
11:27:14.929    HashGetAsync took 0
11:27:14.960    HashGetAsync took 0
11:27:14.992    HashGetAsync took 0
11:27:15.023    HashGetAsync took 0
11:27:15.053    HashGetAsync took 0

结论

无论使用哪种客户端库,即使配置了2个甚至4个线程,KeyDB在长查询运行期间仍会阻塞其他请求,未实现官方宣称的并行查询能力。暂不深究StackExchange和ServiceStack客户端表现差异的原因,核心问题是KeyDB多线程未生效。


内容的提问来源于stack exchange,提问作者Ted

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 08:57:03