使用Go语言测试Redis性能

1. 前言

Redis是一个高性能的键值存储数据库,常用于缓存、队列、排行榜等场景。在实际应用中,我们需要对Redis的性能进行测试,以便了解其在不同场景下的表现。本文将介绍如何使用Go语言测试Redis的性能。

2. 环境准备

在开始测试前,我们需要准备以下环境:
·Redis服务器
·Go语言开发环境
在本文中,我们将使用Redis单机和Redis集群进行测试。

3. 测试方案

我们将使用Go语言编写一个测试脚本,通过多个并发客户端向Redis服务器发送请求,测试其性能表现。测试脚本将支持以下命令行参数:
-h:Redis服务器的主机名或IP地址,默认为localhost。
-p:Redis服务器的端口号,默认为6379。
-n:执行的请求数量,默认为1000。
-c:并发客户端数量,默认为10。
-d:写入Redis的数据大小,默认为1024。
-t:Redis命令类型,支持set和get,默认为set。
-P:Redis密码,默认为空。
-D:Redis数据库,默认为0。
–cluster:是否连接Redis集群,默认为false。
测试脚本将创建多个并发客户端,每个客户端将执行指定数量的请求,并向Redis服务器发送指定类型的命令。测试脚本将输出测试结果,包括执行请求数量、并发客户端数量、写入数据大小、Redis命令类型、总共用时、平均每秒请求数量等信息。

4. 测试脚本

以下是完整的测试脚本代码:

package mainimport ("context""flag""fmt""github.com/go-redis/redis/v8""log""os""strings""sync""time"
)func main() {ctx := context.Background()logger := log.New(log.Writer(), "", log.LstdFlags)// 解析命令行参数host := flag.String("h", "localhost", "Redis 服务器的主机名或 IP 地址")port := flag.String("p", "6379", "Redis 服务器的端口号")requests := flag.Int("n", 1000, "执行的请求数量")clients := flag.Int("c", 10, "并发客户端数量")dataSize := flag.Int("d", 1024, "写入 Redis 的数据大小")cmdType := flag.String("t", "set", "Redis 命令类型")password := flag.String("P", "", "redis密码")db := flag.Int("D", 0, "数据库")cluster := flag.Bool("cluster", false, "是否连接集群")flag.Parse()flag.CommandLine.Usage = func() {fmt.Fprintf(os.Stderr, "Usage: %s [options]\n", os.Args[0])fmt.Fprintf(os.Stderr, "Options:\n")flag.PrintDefaults()}var rdb redis.UniversalClientif *cluster {// 连接 Redis 集群portList := strings.Split(*port, ",")addrs := make([]string, len(portList))for i, p := range portList {addrs[i] = fmt.Sprintf("%s:%s", *host, p)}fmt.Println("Redis 集群地址:", addrs)rdb = redis.NewClusterClient(&redis.ClusterOptions{Addrs: addrs,Password: *password,})} else {// 连接 Redis 单机rdb = redis.NewClient(&redis.Options{Addr:     fmt.Sprintf("%s:%s", *host, *port),Password: *password,DB:       *db,})}if err := rdb.Ping(ctx).Err(); err != nil {fmt.Println("连接 Redis 失败:", err)return}// 创建并发客户端var wg sync.WaitGroupfor i := 0; i < *clients; i++ {wg.Add(1)go func() {defer wg.Done()for j := 0; j < *requests; j++ {key := fmt.Sprintf("key-%d-%d", i, j)value := make([]byte, *dataSize)logger.Println("当前执行操作:", *cmdType, "Key:", key, "执行请求数量:", *requests)if *cmdType == "set" {err := rdb.Set(ctx, key, value, 0).Err()if err != nil {panic(err)}} else if *cmdType == "get" {_, err := rdb.Get(ctx, key).Result()if err != nil && err != redis.Nil {panic(err)}} else {panic(fmt.Sprintf("不支持的命令类型:%s", *cmdType))}}}()}// 等待所有客户端执行完成start := time.Now()wg.Wait()end := time.Now()// 输出测试结果duration := end.Sub(start)qps := float64(*requests) / duration.Seconds()fmt.Printf("执行请求数量:%d\n", *requests)fmt.Printf("并发客户端数量:%d\n", *clients)if *cmdType == "set" {fmt.Printf("写入数据大小:%d\n", *dataSize)}fmt.Printf("Redis 命令类型:%s\n", *cmdType)fmt.Printf("总共用时:%v\n", duration)fmt.Printf("平均每秒请求数量:%f\n", qps)
}

5. 测试结果

我们可以使用以下命令行参数来测试Redis单机和Redis集群的性能:

测试Redis单机

go run main.go -h localhost -p 6379 -n 10000 -c 50 -d 1024 -t set

执行结果如下:

执行请求数量:10000
并发客户端数量:50
写入数据大小:1024
Redis命令类型:set
总共用时:10.5033712s
平均每秒请求数量:952.957627

测试Redis集群

go run main.go -h 10.1.4.7 -p 6379,6380,6381 -n 10000 -c 50 -d 1024 -t set --cluster

执行结果如下:

Redis集群地址: [10.39.45.47:6379 10.39.45.47:6380 10.39.45.47:6381]
执行请求数量:10000
并发客户端数量:50
写入数据大小:1024
Redis命令类型:set
总共用时:9.6948692s
平均每秒请求数量:1031.903858

使用截图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6. 编译

也可以编译后使用

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o redis_performance main.go

编译后的文件名:redis_performance
将这个文件上传服务器后 chmod赋予权限,然后./redis_performance运行即可

7. 总结

本文介绍了如何使用Go语言测试Redis的性能,通过测试脚本可以方便地测试Redis在不同场景下的性能表现。在实际应用中,我们可以根据测试结果来调整Redis的配置,以便更好地满足应用需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/118954.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何让家居设备快速通过Matter认证?移远通信为您带来标准回答

2022年10月&#xff0c;Matter协议正式面向全球发布&#xff1b;2023年10月23日&#xff0c;Matter 1.2最新版本正式发布。在Matter发布至今的时日里&#xff0c;众多头部厂商纷纷加速开发新产品&#xff0c;只为更快抢占市场先机&#xff0c;以“先发者”身份入局新赛道&#…

数据库安全定义以及重要性简单讲解

数据库安全定义 数据库安全指的是对数据库进行保护&#xff0c;以确保其数据的机密性、完整性和可用性&#xff0c;并防止非法访问、篡改、破坏、泄露等安全威胁。一般包括访问控制、数据加密、审计和监控、数据备份、漏洞修补、网络安全等方面。 数据库安全的重要性 1、数据…

C++ 学习 之 名字空间 namespace

必须在模块里面 extern 声明 在一个 cpp 文件中&#xff0c; 一个namespace 可以多次定义&#xff0c;最后合并&#xff0c;使用 using namespace A 这种引入方式的话&#xff0c;使用的时候可以用所有 A 中的数据 多个 cpp 文件的话&#xff0c;不能会自动合并相同的 名字空…

HackTheBox - Starting Point -- Tier 0 ---Preignition

文章目录 一 题目二 实验过程 一 题目 Tags Web、Custom Applications、Apache、Reconnaissance、Web Site Structure Discovery、Default Credentials译文&#xff1a;Web、定制应用程序、Apache、侦察、网站结构发现、默认凭证Connect To attack the target machine, you …

论文-分布式-分布式计算|容错-分布式控制下的自稳定系统

参考文献Self-stabilizing systems in spite of distributed control可以把松散耦合的 循环序列过程 间的同步任务&#xff0c;看成是要保持一个这样的不变性&#xff1a;“系统要处于一种合法状态”因此每个进程在运行每一个可能会改变不变性的步骤之前都要先检查一下是可以执…

人机环境系统智能是东方与西方智能思想的融合

人机环境系统的思想是一种综合性的思想&#xff0c;它融合了东方思想和西方思想的元素。在东方文化中&#xff0c;人类与自然环境有着密切的联系&#xff0c;强调人类与自然环境的和谐共生关系。而在西方文化中&#xff0c;科技和机器的应用越来越广泛&#xff0c;对人类社会和…

21.2 Python 使用Scapy实现端口探测

Scapy 是一款使用纯Python编写的跨平台网络数据包操控工具&#xff0c;它能够处理和嗅探各种网络数据包。能够很容易的创建&#xff0c;发送&#xff0c;捕获&#xff0c;分析和操作网络数据包&#xff0c;包括TCP&#xff0c;UDP&#xff0c;ICMP等协议&#xff0c;此外它还提…

十四天学会C++之第八天:文件操作

1. 文件的打开和关闭 文件操作的基本概念。打开文件&#xff1a;使用fstream库打开文件以供读写。关闭文件&#xff1a;确保文件在使用完毕后正确关闭。 文件的打开和关闭&#xff1a;C 文件操作入门 在C编程中&#xff0c;文件操作是一项重要的任务&#xff0c;可以读取和写…

《Cesium 进阶知识点》- el-select 列表打开后,点击Cesium.Viewer场景无法自动关闭

前提 el-select属性 popper-append-to-body 必须 为 false。这样初始化的列表 el-select-dropdown 才在 el-select下&#xff1b;目前测试&#xff0c;仅对 Cesium.Viewer 生成的 canvas 点击时列表无法自动关闭&#xff1b;使用原生 canvas 和 echarts&#xff0c;点击其场景…

vivado简单仿真入门

打开软件 创建工程 create project ![在这里插入图片描述](https://img-blog.csdnimg.cn/892eda626d394733920854b71ca8f726.png)先next,保留工程路径&#xff0c;配置环境 配置芯片环境 本次芯片类型 xc7k325tffg900-2 创建之后完整的demo 编写仿真内容 timescale 1ns/1…

RabbitMQ 笔记

一、win10安装erlang 1.1 安装erLang语言&#xff0c;配置环境变量 erLang官网地址 1.2 配置环境变量 &#xff08;1&#xff09;添加系统变量ERLANG_HOME &#xff08;2&#xff09;path路径&#xff0c;指向bin目录 1.3 配置完成后再cmd命令窗口erl -version可以查看…

管理类联考——数学——汇总篇——知识点突破——数据分析——记忆

文章目录 考点记忆/考点汇总——按大纲 整体目录大纲法记忆宫殿法绘图记忆法 局部数字编码法对号不对号 归类记忆法重点记忆法歌决记忆法口诀&#xff1a;加法分类&#xff0c;类类相加&#xff1b;乘法分步&#xff0c;步步相乘。 谐音记忆法涂色 理解记忆法比较记忆法转图像记…

1997-2017年各省能源投入数据(万吨标准煤)

1997-2017年各省能源投入数据&#xff08;万吨标准煤&#xff09; 1、时间&#xff1a;1997-2017年 2、来源&#xff1a;中国统计年鉴 3、范围&#xff1a;30个省 4、指标&#xff1a;能源投入&#xff08;各省8种能源消费总量计算得出&#xff09;&#xff08;万吨标准煤&…

DeepSpeed: 大模型训练框架 | 京东云技术团队

背景&#xff1a; 目前&#xff0c;大模型的发展已经非常火热&#xff0c;关于大模型的训练、微调也是各个公司重点关注方向。但是大模型训练的痛点是模型参数过大&#xff0c;动辄上百亿&#xff0c;如果单靠单个GPU来完成训练基本不可能。所以需要多卡或者分布式训练来完成这…

华为NAT配置实例(含dhcp、ospf配置)

一、网络拓朴如下&#xff1a; 二、要求&#xff1a;PC1 能访问到Server1 三、思路&#xff1a; R2配置DHCP&#xff0c;R2和R1配OSPF&#xff0c;R1出NAT 四、主要配置&#xff1a; R2的DHCP和OSPF&#xff1a; ip pool 1gateway-list 10.1.1.1 network 10.1.1.0 mask 25…

Leetcode—7.整数反转【中等】

2023每日刷题&#xff08;十&#xff09; Leetcode—7.整数反转 关于为什么要设long变量 参考自这篇博客 long可以表示-2147483648而且只占4个字节&#xff0c;所以能满足题目要求 复杂逻辑版实现代码 int reverse(int x){int arr[32] {0};long y;int flag 1;if(x <…

JS操作DOM及CSS

JS创造于1994年&#xff0c;其目的是为浏览器显示的文档赋予动态行为。 1 Web编程基础 本节讲解如何编写Web应用中的js程序&#xff0c;如果将这些程序加载到浏览器&#xff0c;以及如何获取输入、产出输出&#xff0c;如何运行响应事件的异步代码。 1.1 js 脚本 虽然现在不…

什么是 Node.js

目标 什么是 Node.js&#xff0c;有什么用&#xff0c;为何能独立执行 JS 代码&#xff0c;演示安装和执行 JS 文件内代码 讲解 Node.js 是一个独立的 JavaScript 运行环境&#xff0c;能独立执行 JS 代码&#xff0c;因为这个特点&#xff0c;它可以用来编写服务器后端的应用…

mybatisPlus逻辑删除注解@TableLogic

当我做了一个实体类&#xff0c;字段为del_flag的逻辑删除字段&#xff0c;要通过这个字段控制数据库中的数据逻辑删除。 重写mapper中的deleteById&#xff0c; 先按id查出数据&#xff0c;在更新此数据中的del_flag字段为1&#xff0c;调用update方法更新数据。 这种方式我…

多继承的实例介绍

一、多继承同名覆盖 子类中的成员与父类中的成员同名问题&#xff0c;通过作用域分辨符&#xff08;&#xff1a;&#xff1a;&#xff09;进行限定类的访问&#xff0c;从而实现对不同类中的同名成员各自赋值。 #include<iostream> using namespace std; class A{//父…