一个集成redis-benchmark的redis压测的脚本
支持 单节点 主从 sentinel cluster (sentinel的还没写)
出于高可用的考虑,你还可以用高可用的ip做压力测试
需要调用redis-benchmark 用来测试不同版本redis7 同样写入速率和相同数据量下 redis占用内存大小
写了很多def,改天统一合并到一个类里面去
使用方式

python3 newtest.py -h xxxxxx -P 6379 -t 2 -a xxxxxx <可选> -H xxxx
#!/usr/bin/python3
import argparse
import subprocess
import sys
from datetime import datetimeimport redisstandalone = 0
sentinel = 1
cluster = 2v = 6
ips = ''
shard1_ip = ''
shard2_ip = ''
shard3_ip = ''
if v == 6:flush = "92619_dont_run_flushall_rudely"
elif v == 7:flush = "92618_dont_run_flushall_rudely"# cmd = "/home/redis/redistest/src/redis-benchmark -h {}  --cluster -p 6379 -q -a {} -p 6379 -t set   " \
#       "--threads 8 -P 100 -q -r 10000 -d 1024".format(
#     ips, passwd)def getredis_used_Mem(ip, passwd, port):r = redis.StrictRedis(host=ip, password=passwd, port=port)mem = r.info()['used_memory']r.close()return memdef init_mem(ip, passwd, port):r = redis.StrictRedis(host=ip, password=passwd, port=port)r.execute_command(flush)r.close()def humansize(iput):b = 1B = b * 1024MB = B * 1024GB = MB * 1024TB = GB * 1024if iput > TB:return str(iput / TB) + " TB"elif iput > GB:return str(iput / GB) + " GB"elif iput > MB:return str(iput / MB) + " MB"elif iput > B:return str(iput) + " Bit"else:return str(iput) + " bit"def timehuman(iput):s = 1m = s * 60h = m * 60d = h * 24if iput > d:return str(iput / d) + " days"elif iput > h:return str(iput / h) + " hours"elif iput > m:return str(iput / m) + " mins"else:return str(iput) + " seconds"def get_master_ip(ip, passwd, port):r = redis.StrictRedis(host=ip, password=passwd, port=port)if r.info()['role'] == "slave":masterip = r.info()['master_host']r.close()return masteripelse:return ipdef parse_args(args):"""parser agrs for this file"""parser = argparse.ArgumentParser(description='Parse Args you want', add_help=False)connect_setting = parser.add_argument_group('connect setting')connect_setting.add_argument('-h', '--host', dest='host', type=str,help='Host the Redis database server located\n  redis单节点/主从/cluster的任意一个节点的ip地址',default='127.0.0.1')connect_setting.add_argument('-H', '--lbc_ip', dest='ips', type=str,help='Host the Redis database lbc server located\n  redis上层网络地址,可以是dns lbc或者proxy地址',default='127.0.0.1')connect_setting.add_argument('-a', '--passwd', dest='passwd', type=str,help='password for redis', default=None)connect_setting.add_argument('-P', '--port', dest='port', type=str,help='port for redis', default=None)parser.add_argument('-t', '--archtype',help='the architecture type of the redis database [standalone sentinel cluster]',default=0)return parserdef command_line_args(args):parser = parse_args(args)args = parser.parse_args(args)return argsdef get_cluster_all_master_nodes(realip, passwd, port):cluster_master_ip_list = []r = redis.r = redis.StrictRedis(host=realip, password=passwd, port=port, db=0)clusterinfo = r.cluster("nodes")for nodes in clusterinfo:if 'master' in clusterinfo[nodes]["flags"]:cluster_master_ip_list.append(nodes.split(':')[0])print(cluster_master_ip_list)return cluster_master_ip_listdef runbenchmark(type, proxyip, realip, passwd, port):if type == cluster:cmd = "/home/redis/redistest/src/redis-benchmark -h {}  --cluster -p 6379 -q -a {} -p {} -t set  -n 100000000 " \"--threads 8 -P 100 -q -r 10000000 ".format(proxyip, passwd, port)cluster_masters = get_cluster_all_master_nodes(realip, passwd, port)starttime = datetime.now()cluster_mem_start = 0cluster_mem_end = 0for ip in cluster_masters:init_mem(ip, passwd, port)cluster_mem_start = cluster_mem_start + getredis_used_Mem(ip, passwd, port)if subprocess.run(cmd, shell=True, check=True).returncode == 0:endtime = datetime.now()duringtime = endtime - starttimefor ip in cluster_masters:cluster_mem_end = cluster_mem_start + getredis_used_Mem(ip,passwd,port)output = abs(cluster_mem_end - cluster_mem_start)else:err_msg = 'run {} failed'.format(cmd)raise Error(err_msg)else:cmd = "/home/redis/redistest/src/redis-benchmark -h {}  -p 6379 -q -a {} -p {} -t set  -n 1000000 " \"--threads 8 -P 100 -q -r 1000000 ".format(proxyip, passwd, port)init_mem(proxyip, passwd, port)mem_start = getredis_used_Mem(realip, passwd, port)starttime = datetime.now()if subprocess.run(cmd, shell=True, check=True).returncode == 0:mem_end = getredis_used_Mem(realip,passwd,port)endtime = datetime.now()duringtime = endtime - starttimeoutput = abs(mem_end - mem_start)else:err_msg = 'run {} failed'.format(cmd)raise Error(err_msg)print("写完数据总共耗时{},内存占用为{}".format(timehuman(duringtime.seconds), humansize(output)))class Error(ValueError):passdef main():args = command_line_args(sys.argv[1:])# lbc dns proxy 统一叫proxyproxy_ip = args.ipspasswd = args.passwdport = args.portmasterIp = get_master_ip(args.host, passwd, port)if not proxy_ip:ip = proxy_ipelse:ip = masterIpif int(args.archtype) == standalone:runbenchmark(standalone, ip, masterIp, passwd, port)elif int(args.archtype) == sentinel:runbenchmark(sentinel, ip)elif int(args.archtype) == cluster:runbenchmark(cluster, ip, masterIp, passwd, port)else:raise f'不支持的redis架构类型{Error(args.archtype)}'if __name__ == '__main__':main()

一个集成redis-benchmark的redis压测的脚本相关推荐

  1. java模拟数据库压测_写并发压测 java 脚本你必须会的 3 个类

    性能测试做到后面,一些特殊的场景利用常用的现成工具满足不了需求,所以你需要学习java写一些特定协议的压测脚本,那你不得不研究多线程或线程池,而此时你也一定会遇到java并发编程中的几个类,今天重点讲 ...

  2. 高性能分布式缓存redis(持久化原理 安全策略 过期删除内存淘汰策略 性能压测 高可用 Redis Cluster)

    redis redis(持久化原理 安全策略 过期删除&内存淘汰策略 性能压测 高可用 Redis Cluster) 1. 持久化原理 1.1 持久化流程(落盘) 1.2 RDB详解 1.2. ...

  3. redis压测工具redis-benchmark

    redis-benchmark 位于src目录下,是redis自带的压测工具,使用简单方便: [root@xxxx]# redis-benchmark -p 8200 -c 50 -n 100000 ...

  4. 大促系统全流量压测及稳定性保证——京东交易架构

    https://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=2653547431&idx=1&sn=744a42639e7c36 ...

  5. 大促系统全流量压测及稳定性保证——京东交易架构分享(含PPT)

    导读:对于应对突发的峰值访问,每个技术团队都有自己的经验及方法,但是这些方法远没有得到体系化的讨论.高可用架构在 6 月 25 日举办了『高压下的架构演进』专题活动,进行了闭门私董会研讨及对外开放的四 ...

  6. 大促系统全流量压测及稳定性保证——京东交易架构分享

    转:大促系统全流量压测及稳定性保证--京东交易架构分享(含PPT) 来源:http://blog.sina.com.cn/s/blog_12df1b9e60102wble.html 先介绍一下交易系统 ...

  7. 如何用jmeter压测java接口,Jmeter接口压测快速入门

    [TOC] Jmeter简介 Jmeter是Apache开源的一个使用纯Java编写的压力测试工具,它最初是为测试web应用程序而设计的,但后来扩展到了其他测试功能.例如,可用于测试静态和动态资源以及 ...

  8. 有赞11·11:全链路压测方案设计与实施详解

    2017年双十一即将来临,对于买家来说是一年一度的购物狂欢,可是对于电商公司的技术人员来说,却是一年一次的大考.如何用更少的预算完成指定当前业务规模的流量高峰,是技术的永恒主题. \\ 由InfoQ举 ...

  9. 6. 堪比JMeter的.Net压测工具 - Crank 实战篇 - 收集诊断跟踪信息与如何分析瓶颈

    1. 前言 上面我们已经做到了接口以及场景压测,通过控制台输出结果,我们只需要将结果收集整理下来,最后汇总到excel上,此次压测报告就可以完成了,但收集报告也挺麻烦的,交给谁呢-- 找了一圈.没找到 ...

最新文章

  1. 90 后 CTO 创业 6 年,做了一件改变互联网的“小事”
  2. Visual Studio 2013开发 mini-filter driver step by step 获取可执行文件名称 - 实现process monitor的一个功能 (10)
  3. 模板插件aTpl.js新增功能
  4. 细节之中自有天地,整洁成就卓越代码
  5. C#中的序列化和反序列化
  6. asp.net写验证码
  7. HTML入门学习笔记(二)
  8. 奇门遁甲时家转盘奇门排盘,带八字排盘
  9. 分光光度计的使用及注意事项
  10. 【openwrt】初探 基于MT7621
  11. fragment中高德地图定位
  12. -转载-我要我们在一起故事原著
  13. 中国知名网站(alexa top 500)
  14. 计算机毕业设计基于Python实现的药店|药房管理系统
  15. python del语句
  16. 多路信号发生器(74LS00和LM324)
  17. iOS开发小技巧汇总
  18. vue 视频播放插件vue-video-player自定义样式、自动播放设置、设置一开始全屏播放视频
  19. CMT2119/2119A 示例代码及说明
  20. 小米范工具系列之九:小米范子域名收集工具

热门文章

  1. 数据库工程师四级学习笔记(2) ||纸上得来终觉浅
  2. eslint,prettier
  3. 常见用户行为分析模型:用户行为路径分析模型
  4. STM32 DMA方式和中断方式查询的区别
  5. 千万不要给手机root权限
  6. 【HZNUOJ】【C系列3.8】Lucky Sum of Digits
  7. STM32CubeMX介绍及安装
  8. Unity3D - 详解Quaternion类[转载]
  9. Autoware自动驾驶平台(序言):什么是Autoware
  10. 百度地图SDK for iOS v2.1.1全新发布