当前位置: 首页 > news >正文

使用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

7. 总结

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

相关文章:

使用Go语言测试Redis性能

1. 前言 Redis是一个高性能的键值存储数据库&#xff0c;常用于缓存、队列、排行榜等场景。在实际应用中&#xff0c;我们需要对Redis的性能进行测试&#xff0c;以便了解其在不同场景下的表现。本文将介绍如何使用Go语言测试Redis的性能。 2. 环境准备 在开始测试前&#x…...

【Javascript】运算符(赋值,算术,自增,自减)

目录 赋值 算术 单个变量&#xff1a; 多个变量&#xff1a; 在字符串&#xff0c;数组中充当连接符 自符串与字符串 数组与数组 数组与字符串 自增与自减 前置 自增 自减 后置 自增 自减 赋值 var a 1;算术 单个变量&#xff1a; var a 1;a 1;console.l…...

Redis数据类型——list类型数据的扩展操作

1.list阻塞式数据获取 2.list类型数据业务场景...

[论文笔记]NEZHA

引言 今天带来华为诺亚方舟实验室提出的论文NEZHA,题目是 针对中文中文语言理解神经网络上下文表示(NEural contextualiZed representation for CHinese lAnguage understanding),为了拼出哪吒。 预训练语言模型由于具有通过对大型语料库进行预训练来捕获文本中深层上下文信…...

【Linux】认识协议

目录 一、应用层二、协议三、序列化和反序列化 一、应用层 之前的socket编程&#xff0c;都是在通过系统调用层面&#xff0c;如今我们来向上打通计算机网络。认识应用层的协议和序列化与反序列化 我们程序员写的一个个解决我们实际问题, 满足我们日常需求的网络程序, 都是在应…...

Hadoop3教程(三十四):(生产调优篇)MapReduce生产经验汇总

文章目录 &#xff08;164&#xff09;MR跑得慢的原因&#xff08;165&#xff09;MR常用调优参数Map阶段Reduce阶段 &#xff08;166&#xff09;MR数据倾斜问题参考文献 &#xff08;164&#xff09;MR跑得慢的原因 MR程序执行效率的瓶颈&#xff0c;或者说当你觉得你的MR程…...

Unity⭐️Win和Mac安卓打包环境配置

文章目录 🟥 配置Android SDK1️⃣ 配置 SDK Platforms2️⃣ 配置 SDK Tools🎁 Android SDK Build-Tools🎁 Android SDK Command-line Tools(latest)🎁 Android SDK Tools(Obsolete)🟧 配置NDK🟩 配置JDK前情提示: 此方法适用于Windows/Mac 在配置时注意开启 🪜 …...

STM32F4XX之串口

一、标准串口&#xff08;UART&#xff09;介绍 1、通信协议相关概念 1.1同步通信和异步通信 (1)同步通信&#xff1a;两个器件之间共用一个时钟线&#xff0c;要发送的数据在时钟的作用下一位一位发送出去。 &#xff08;2&#xff09;异步通信&#xff1a;指两个器件之间没…...

【J-Long Group Limited】申请1500万美元纳斯达克IPO上市

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;总部位于中国香港的J-Long Group Limited&#xff08;简称&#xff1a;J-Long&#xff09;近期已向美国证券交易委员会&#xff08;SEC&#xff09;提交招股书&#xff0c;申请在纳斯达克IPO上市&…...

上传文件到google drive

参考&#xff1a;使用 Python 将文件上传到 Google 云端硬盘_迹忆客 第 1 步&#xff1a;Google API Playground 我们可以通过搜索 Google 找到更多关于 Google API Playground 的信息。 我们必须单击第一个链接才能继续前进。 选择第一个链接后&#xff0c;我们会自动进入下一…...

用VLOOKUP快速合并两个表格

一、前言 上周五微信收到运营提过来的需求&#xff0c;第一句话&#xff1a;帮我提取一下1号门店的库存数据&#xff0c;马上登录系统下载一份库存数据给到他然后专心读代码&#xff0c;过一会微信第二句话&#xff1a;帮我提取一下1号门店商品半年/一年的销量数据&#xff0c…...

Vue ref属性

Vue中的ref属性可以用来对HTML元素或者是对组件进行唯一标识。 一、设置ref属性 只需要在元素或者是组件后跟上如下语法即可&#xff1a; ref"标识名" 二、获取元素或对象 我们可以用如下方法获取我们设置ref的元素或组件&#xff1a; this.$refs.标识名 第一个输…...

【python入门】函数,类和对象

【大家好&#xff0c;我是爱干饭的猿&#xff0c;本文重点介绍python入门的函数&#xff0c;高阶函数&#xff0c;python中的类和对象&#xff0c;模块的作用等。 后续会继续分享其他重要知识点总结&#xff0c;如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关…...

alibaba.fastjson的使用(二)-- jar包导入

目录 1. 在pom文件中引入依赖: 2.fastjsonv2的使用: 1. 在pom文件中引入依赖: <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.14</version> </dependency>2.fastjsonv2的使用…...

A_搜索(A Star)算法

A*搜索(A Star) 不同于盲目搜索&#xff0c;A算法是一种启发式算法(Heuristic Algorithm)。 上文提到&#xff0c;盲目搜索对于所有要搜索的状态结点都是一视同仁的&#xff0c;因此在每次搜索一个状态时&#xff0c;盲目搜索并不会考虑这个状态到底是有利于趋向目标的&#x…...

Tinywebserve学习之linux 用户态内核态

一.CPU指令集权限 指令集是实现CPU实现软件指挥硬件执行的媒介&#xff0c;具体来说每一条汇编语句都对应了一条CPU指令&#xff0c;而非常多的CPU指令再一起组成一个甚至多个集合&#xff0c;指令的集合叫CPU指令集&#xff1b; 因为CPU指令集可以操纵硬件&#xff0c;会造成…...

AI之浅谈

随着ChatGPT的爆火&#xff0c;AI的应用也随之遍地开花&#xff0c;国内国外的各种大模型也都陆续推出&#xff0c;AI的本质是进行数据的分析和整理&#xff0c;其背后的资源来自于互联网时代所积累的大数据基础&#xff0c;这也是深度学习的结果&#xff0c;AI具有不眠不休的特…...

20231024后端研发面经整理

1.如何在单链表O(1)删除节点&#xff1f; 狸猫换太子 2.redis中的key如何找到对应的内存位置&#xff1f; 哈希碰撞的话用链表存 3.线性探测哈希法的插入&#xff0c;查找和删除 插入&#xff1a;一个个挨着后面找&#xff0c;知道有空位 查找&#xff1a;一个个挨着后面找…...

【前段基础入门之】=>CSS3新增渐变颜色属性

导语&#xff1a; CSS3 新增了&#xff0c;渐变色 的解决方案&#xff0c;这使得我们可以绘制出更加生动的炫酷的的配色效果 线性渐变 多个颜色之间的渐变&#xff0c; 默认从上到下渐变 background-image: linear-gradient(red,yellow,green); /*默认从上到下渐变*/默认从上…...

深入浅出排序算法之归并排序

目录 1. 归并排序的原理 1.1 二路归并排序执行流程 2. 代码分析 2.1 代码设计 3. 性能分析 4. 非递归版本 1. 归并排序的原理 “归并”一词的中文含义就是合并、并入的意思&#xff0c;而在数据结构中的定义是将两个或者两个以上的有序表组合成一个新的有序表。 归并排序…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

什么是VR全景技术

VR全景技术&#xff0c;全称为虚拟现实全景技术&#xff0c;是通过计算机图像模拟生成三维空间中的虚拟世界&#xff0c;使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验&#xff0c;结合图文、3D、音视频等多媒体元素…...

ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]

报错信息&#xff1a;libc.so.6: cannot open shared object file: No such file or directory&#xff1a; #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...

Python学习(8) ----- Python的类与对象

Python 中的类&#xff08;Class&#xff09;与对象&#xff08;Object&#xff09;是面向对象编程&#xff08;OOP&#xff09;的核心。我们可以通过“类是模板&#xff0c;对象是实例”来理解它们的关系。 &#x1f9f1; 一句话理解&#xff1a; 类就像“图纸”&#xff0c;对…...

用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章

用 Rust 重写 Linux 内核模块实战&#xff1a;迈向安全内核的新篇章 ​​摘要&#xff1a;​​ 操作系统内核的安全性、稳定性至关重要。传统 Linux 内核模块开发长期依赖于 C 语言&#xff0c;受限于 C 语言本身的内存安全和并发安全问题&#xff0c;开发复杂模块极易引入难以…...

HTTPS证书一年多少钱?

HTTPS证书作为保障网站数据传输安全的重要工具&#xff0c;成为众多网站运营者的必备选择。然而&#xff0c;面对市场上种类繁多的HTTPS证书&#xff0c;其一年费用究竟是多少&#xff0c;又受哪些因素影响呢&#xff1f; 首先&#xff0c;HTTPS证书通常在PinTrust这样的专业平…...