使用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是一个高性能的键值存储数据库,常用于缓存、队列、排行榜等场景。在实际应用中,我们需要对Redis的性能进行测试,以便了解其在不同场景下的表现。本文将介绍如何使用Go语言测试Redis的性能。 2. 环境准备 在开始测试前&#x…...
【Javascript】运算符(赋值,算术,自增,自减)
目录 赋值 算术 单个变量: 多个变量: 在字符串,数组中充当连接符 自符串与字符串 数组与数组 数组与字符串 自增与自减 前置 自增 自减 后置 自增 自减 赋值 var a 1;算术 单个变量: var a 1;a 1;console.l…...
Redis数据类型——list类型数据的扩展操作
1.list阻塞式数据获取 2.list类型数据业务场景...
[论文笔记]NEZHA
引言 今天带来华为诺亚方舟实验室提出的论文NEZHA,题目是 针对中文中文语言理解神经网络上下文表示(NEural contextualiZed representation for CHinese lAnguage understanding),为了拼出哪吒。 预训练语言模型由于具有通过对大型语料库进行预训练来捕获文本中深层上下文信…...
【Linux】认识协议
目录 一、应用层二、协议三、序列化和反序列化 一、应用层 之前的socket编程,都是在通过系统调用层面,如今我们来向上打通计算机网络。认识应用层的协议和序列化与反序列化 我们程序员写的一个个解决我们实际问题, 满足我们日常需求的网络程序, 都是在应…...
Hadoop3教程(三十四):(生产调优篇)MapReduce生产经验汇总
文章目录 (164)MR跑得慢的原因(165)MR常用调优参数Map阶段Reduce阶段 (166)MR数据倾斜问题参考文献 (164)MR跑得慢的原因 MR程序执行效率的瓶颈,或者说当你觉得你的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之串口
一、标准串口(UART)介绍 1、通信协议相关概念 1.1同步通信和异步通信 (1)同步通信:两个器件之间共用一个时钟线,要发送的数据在时钟的作用下一位一位发送出去。 (2)异步通信:指两个器件之间没…...
【J-Long Group Limited】申请1500万美元纳斯达克IPO上市
来源:猛兽财经 作者:猛兽财经 猛兽财经获悉,总部位于中国香港的J-Long Group Limited(简称:J-Long)近期已向美国证券交易委员会(SEC)提交招股书,申请在纳斯达克IPO上市&…...
上传文件到google drive
参考:使用 Python 将文件上传到 Google 云端硬盘_迹忆客 第 1 步:Google API Playground 我们可以通过搜索 Google 找到更多关于 Google API Playground 的信息。 我们必须单击第一个链接才能继续前进。 选择第一个链接后,我们会自动进入下一…...
用VLOOKUP快速合并两个表格
一、前言 上周五微信收到运营提过来的需求,第一句话:帮我提取一下1号门店的库存数据,马上登录系统下载一份库存数据给到他然后专心读代码,过一会微信第二句话:帮我提取一下1号门店商品半年/一年的销量数据,…...
Vue ref属性
Vue中的ref属性可以用来对HTML元素或者是对组件进行唯一标识。 一、设置ref属性 只需要在元素或者是组件后跟上如下语法即可: ref"标识名" 二、获取元素或对象 我们可以用如下方法获取我们设置ref的元素或组件: this.$refs.标识名 第一个输…...
【python入门】函数,类和对象
【大家好,我是爱干饭的猿,本文重点介绍python入门的函数,高阶函数,python中的类和对象,模块的作用等。 后续会继续分享其他重要知识点总结,如果喜欢这篇文章,点个赞👍,关…...
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) 不同于盲目搜索,A算法是一种启发式算法(Heuristic Algorithm)。 上文提到,盲目搜索对于所有要搜索的状态结点都是一视同仁的,因此在每次搜索一个状态时,盲目搜索并不会考虑这个状态到底是有利于趋向目标的&#x…...
Tinywebserve学习之linux 用户态内核态
一.CPU指令集权限 指令集是实现CPU实现软件指挥硬件执行的媒介,具体来说每一条汇编语句都对应了一条CPU指令,而非常多的CPU指令再一起组成一个甚至多个集合,指令的集合叫CPU指令集; 因为CPU指令集可以操纵硬件,会造成…...
AI之浅谈
随着ChatGPT的爆火,AI的应用也随之遍地开花,国内国外的各种大模型也都陆续推出,AI的本质是进行数据的分析和整理,其背后的资源来自于互联网时代所积累的大数据基础,这也是深度学习的结果,AI具有不眠不休的特…...
20231024后端研发面经整理
1.如何在单链表O(1)删除节点? 狸猫换太子 2.redis中的key如何找到对应的内存位置? 哈希碰撞的话用链表存 3.线性探测哈希法的插入,查找和删除 插入:一个个挨着后面找,知道有空位 查找:一个个挨着后面找…...
【前段基础入门之】=>CSS3新增渐变颜色属性
导语: CSS3 新增了,渐变色 的解决方案,这使得我们可以绘制出更加生动的炫酷的的配色效果 线性渐变 多个颜色之间的渐变, 默认从上到下渐变 background-image: linear-gradient(red,yellow,green); /*默认从上到下渐变*/默认从上…...
深入浅出排序算法之归并排序
目录 1. 归并排序的原理 1.1 二路归并排序执行流程 2. 代码分析 2.1 代码设计 3. 性能分析 4. 非递归版本 1. 归并排序的原理 “归并”一词的中文含义就是合并、并入的意思,而在数据结构中的定义是将两个或者两个以上的有序表组合成一个新的有序表。 归并排序…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving
地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...
消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...
