【Redis】----如何测试redis单机的最大并发
📅 2026/7/22 15:49:52
👁️ 阅读次数
📝 编程学习
文章目录
- 一、Python 压测脚本
- 1.1、redis_concurrent_test.py
- 1.2、关键说明
- 1.3、进阶优化建议(可选)
- 1.4、协程版本补充(高并发推荐)
- 二、redis内部提供的命令
- 2.1、命令 redis-benchmark
- 2.2、参数解释
- 2.3、压测结果解读(GET 纯读,100 并发,10 万请求)
- 核心指标
- 2.4、简单分析
- 2.5、建议继续测试(复制直接运行)
- 1)纯 SET 写压测(最有参考价值)
- 2)读写混合(默认场景 SET/GET 等多条命令)
- 3)调高并发到 200,观察延迟是否明显上涨
- 2.6、补充对比提醒
一、Python 压测脚本
使用threading多线程模拟并发读写,打印详细耗时、成功率、QPS日志,支持自定义并发数、请求总量、读写比例。
依赖:
redis-py
pipinstallredis1.1、redis_concurrent_test.py
importthreadingimporttimeimportredisfromtypingimportDict# ===================== 配置区 =====================REDIS_HOST="127.0.0.1"REDIS_PORT=6379REDIS_PASSWORD=NoneREDIS_DB=0CONCURRENT_THREADS=20# 并发线程数TOTAL_REQUESTS=10000# 总请求次数TEST_KEY_PREFIX="test_concurrent:"# 读写比例 True=写, False=读;调整读写混合场景WRITE_RATIO=0.3# ==================================================# 全局统计stat:Dict={"success":0,"fail":0,"total_cost":0.0,"lock":threading.Lock()}defcreate_redis_client()->redis.Redis:"""创建redis连接(每个线程独立client,避免线程安全问题)"""returnredis.Redis(host=REDIS_HOST,port=REDIS_PORT,password=REDIS_PASSWORD,db=REDIS_DB,decode_responses=True,socket_timeout=5)defworker(thread_id:int,req_per_thread:int):"""单个线程工作函数"""r=create_redis_client()thread_start=time.perf_counter()print(f"[线程{thread_id:02d}] 启动,计划执行{req_per_thread}次请求")foriinrange(req_per_thread):key=f"{TEST_KEY_PREFIX}{thread_id}_{i}"start=time.perf_counter()try:ifi/req_per_thread<WRITE_RATIO:# 写操作 setr.setex(key,300,f"value_{thread_id}_{i}_{time.time()}")else:# 读操作 getr.get(key)cost=time.perf_counter()-startwithstat["lock"]:stat["success"]+=1stat["total_cost"]+=costexceptExceptionase:withstat["lock"]:stat["fail"]+=1print(f"[线程{thread_id:02d}] 请求异常 key={key}err={str(e)}")thread_cost=time.perf_counter()-thread_startprint(f"[线程{thread_id:02d}] 执行完成,耗时={thread_cost:.3f}s")defmain():print("="*60)print(f"Redis单机并发压测启动")print(f"地址:{REDIS_HOST}:{REDIS_PORT}| 并发线程:{CONCURRENT_THREADS}")print(f"总请求量:{TOTAL_REQUESTS}| 写比例:{WRITE_RATIO:.1%}")print("="*60)# 均分请求到各个线程base_req=TOTAL_REQUESTS//CONCURRENT_THREADS threads=[]start_time=time.perf_counter()fortidinrange(CONCURRENT_THREADS):t=threading.Thread(target=worker,args=(tid,base_req))threads.append(t)t.start()# 等待所有线程结束fortinthreads:t.join()total_time=time.perf_counter()-start_time# 输出汇总统计print("\n"+"="*60)print("【压测结果汇总】")print(f"总耗时:{total_time:.3f}s")print(f"成功请求:{stat['success']}")print(f"失败请求:{stat['fail']}")ifstat["success"]>0:avg_latency_ms=(stat["total_cost"]/stat["success"])*1000qps=stat["success"]/total_timeprint(f"平均延迟:{avg_latency_ms:.3f}ms")print(f"QPS(成功):{qps:.2f}req/s")print("="*60)if__name__=="__main__":main()1.2、关键说明
- 线程安全:每个线程新建独立
Redis实例,禁止多线程共用同一个client(redis-py同步客户端非线程安全) - 支持读写混合压测,修改
WRITE_RATIO:1.0纯写压测0.0纯读压测
- 日志输出:
- 每个线程启动/结束日志
- 异常请求打印错误信息
- 最终汇总:总耗时、成功失败数、平均延迟、QPS
- 适用于单机Redis;如需集群压测只需修改连接初始化
1.3、进阶优化建议(可选)
如果想要更高压测性能:
- 使用
gevent协程版本(大量并发场景比thread高效) - 开启redis pipeline批量请求
- 使用
hiredis加速解析:pip install hiredis,客户端自动启用
1.4、协程版本补充(高并发推荐)
略过
二、redis内部提供的命令
2.1、命令 redis-benchmark
命令例子:进入到redis的安装目录执行 redis-benchmark -a 123456 -c 100 -n 100000 -t get
如果是docker方式: docker exec -it redis redis-benchmark -a 123456 -c 100 -n 100000 -t get
2.2、参数解释
-a 123456:Redis 认证密码 -c 100:并发连接数 -n 100000:总请求次数 -t get:只压测 GET 命令2.3、压测结果解读(GET 纯读,100 并发,10 万请求)
throughput summary:104058.27requests per second latency summary(msec): avg min p50 p95 p99 max0.4960.1760.4390.8151.1914.807核心指标
QPS ≈ 10.4 万 /s Docker 内单机 Redis 纯读,这个性能属于非常优秀。 延迟分布 平均延迟:0.496ms p50:0.439ms(一半请求低于该值) p95:0.815ms p99:1.191ms 最大延迟:4.807ms(少量毛刺)2.4、简单分析
✅ 绝大部分请求稳定在 1ms 以内;
✅ 长尾延迟不高,没有严重阻塞;
⚠️ 注意:redis-benchmark 测试的是预设 key,不存在 key 缺失、大 value、复杂命令;真实业务 QPS 会低于该数值。
2.5、建议继续测试(复制直接运行)
1)纯 SET 写压测(最有参考价值)
docker exec -it redis redis-benchmark -a 123456 -c 100 -n 100000 -t set
2)读写混合(默认场景 SET/GET 等多条命令)
docker exec -it redis redis-benchmark -a 123456 -c 100 -n 100000
3)调高并发到 200,观察延迟是否明显上涨
docker exec -it redis redis-benchmark -a 123456 -c 200 -n 200000 -t get
2.6、补充对比提醒
之前的 Python 脚本受 GIL、网络开销、python 客户端限制,跑不出 10 万 QPS。
redis-benchmark:C 原生,测 Redis 理论极限; Python 脚本:适合模拟真实业务逻辑(带复杂 key、序列化、异常重试),用来验证业务并发场景。
编程学习
技术分享
实战经验