2种Go Redis客户端使用对比 - 腾讯云开发者社区-腾讯云


本站和网页 https://cloud.tencent.com/developer/article/2056319 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

2种Go Redis客户端使用对比 - 腾讯云开发者社区-腾讯云腾讯云备案控制台开发者社区学习实践活动专区工具TVP文章/答案/技术大牛搜索搜索关闭写文章提问登录/注册Johnstencent · 后台开发 (已认证)《技思广益 · 腾讯技术人原创集》资深作者73 篇文章2种Go Redis客户端使用对比转到我的清单专栏首页代码工具2种Go Redis客户端使用对比30分享分享文章到朋友圈分享文章到 QQ分享文章到微博复制文章链接到剪贴板海报分享海报分享原创2种Go Redis客户端使用对比修改于2022-08-12 18:46:16阅读 8360总结go-redis和redigo底层是通过调用的万能 Do 方法实现, 但是redigo:由于输入是万能类型所以必须记住每个命令的参数和返回值情况, 使用起来非常的不友好,参数类型是万能类型导致在编译阶段无法检查参数类型,每个命令都需要花时间记录使用方法,参数个数等,使用成本高;go-redis:细化了每个redis每个命令的功能, 我们只需记住命令,具体的用法直接查看接口的申请就可以了,使用成本低;其次它对数据类型按照redis底层的类型进行统一,编译时就可以帮助检查参数类型并且它的响应统一采用 Result 的接口返回,确保了返回参数类型的正确性,对用户更加友好;image.png性能对比BenchmarkRedis/redigo_client_Benchmark-12 31406 36919 ns/op
BenchmarkRedis/go-redis_client_Benchmark-12 29977 38152 ns/op
BenchmarkRedis/redigo_client_Benchmark-12 27928 39923 ns/op
BenchmarkRedis/go-redis_client_Benchmark-12 27127 46451 ns/op复制从上图可以看出, go-redis虽然每次操作会比redigo慢10%左右, 但是redigo需要显示申请/关闭连接,所以总体上二者的性能差异其实不大Redigo库介绍redigo 是Redis数据库的Go客户端, 操作Redis基本和commands一样. Redigo命令基本都是通过Do方法来实现的.Do(ctx context.Context, cmd string, args ...interface{}) (interface{}, error)复制虽然调用Do函数万能参数可以实现所有的功能,但是使用起来非常的不友好,参数类型是万能类型,所以在编译阶段无法检查参数类型, 其次每个命令都需要花时间记录使用方法,参数个数等,使用成本高;演示演示基本的连接池建立, ping, string操作, hash操作, list操作, expire等操作package main
import (
"fmt"
"github.com/gomodule/redigo/redis"
func main() {
// 新建一个连接池
var pool *redis.Pool
pool = &redis.Pool{
MaxIdle: 10, //最初的连接数量
MaxActive: 0, //连接池最大连接数量,(0表示自动定义),按需分配
IdleTimeout: 300, //连接关闭时间 300秒 (300秒不使用自动关闭)
Dial: func() (redis.Conn, error) { //要连接的redis数据库
return redis.Dial("tcp", "localhost:6379")
},
conn := pool.Get() //从连接池,取一个链接
defer conn.Close()
// 0. ping正常返回pong, 异常res is nil, err not nil
res, err := conn.Do("ping")
fmt.Printf("ping res=%v\n", res)
if err != nil {
fmt.Printf("ping err=%v\n", err.Error())
// string操作
// set
res, err = conn.Do("set", "name", "测试001")
fmt.Printf("set res=%v\n", res)
if err != nil {
fmt.Printf("set err=%v\n", err.Error())
// get
res, err = redis.String(conn.Do("get", "name"))
fmt.Printf("get res=%v\n", res)
if err != nil {
fmt.Printf("get err=%v\n", err.Error())
// MSet MGet
res, err = conn.Do("MSet", "name", "测试001", "age", 18)
fmt.Printf("MSet res=%v\n", res)
if err != nil {
fmt.Printf("MSet err=%v\n", err.Error())
r, err := redis.Strings(conn.Do("MGet", "name", "age"))
fmt.Printf("MGet res=%v\n", r)
if err != nil {
fmt.Printf("MGet err=%v\n", err.Error())
// expire
res, err = conn.Do("expire", "name", 5)
fmt.Printf("expire res=%v\n", r)
if err != nil {
fmt.Printf("expire err=%v\n", err.Error())
// list操作
// lpush lpop
res, err = conn.Do("lpush", "hobby", "篮球", "足球", "乒乓球")
fmt.Printf("lpush res=%v\n", r)
if err != nil {
fmt.Printf("lpush err=%v\n", err.Error())
// lpop
rs, er := conn.Do("lpop", "hobby")
fmt.Printf("lpop res=%v\n", rs)
if er != nil {
fmt.Printf("lpop err=%v\n", er.Error())
// hash 操作
// hset
res, err = conn.Do("HSet", "userinfo", "name", "lqz")
fmt.Printf("HSet res=%v\n", r)
if err != nil {
fmt.Printf("HSet err=%v\n", err.Error())
// hget
r4, er4 := conn.Do("HGet", "userinfo", "name")
fmt.Printf("HGet res=%v\n", r4)
if er4 != nil {
fmt.Printf("HGet err=%v\n", er4.Error())
}复制go-redis组件介绍和使用介绍go-redis提供了三种对应服务端的客户端模式,集群,哨兵,和单机模式,三种模式在连接池这一块都是公用的, 同时还提供了灵活的Hook机制, 其底层实际也是调用的万能 Do 方法.image.png但go-redis细化了每个redis每个命令的功能, 我们只需记住命令,具体的用法直接查看接口的申请就可以了,使用成本低;其次它对数据类型按照redis底层的类型进行统一,编译时就可以帮助检查参数类型, 并且它的响应统一采用 Result 的接口返回,确保了返回参数类型的正确性,对用户更加友好;演示演示基本的连接池建立, ping, string操作, hash操作, list操作, expire等操作func main() {
var rdb = redis2.NewClient(
&redis2.Options{
Addr: "localhost:6379",
Password: "", DB: 1,
MinIdleConns: 1,
PoolSize: 1000,
})
ctx := context.Background()
res, err = rdb.Ping(ctx).Result()
fmt.Printf("ping res=%v\n", res)
if err != nil {
fmt.Printf("ping err=%v\n", err.Error())
// string操作
// set
res, err = rdb.Set(ctx, "name", "测试001", 0).Result()
fmt.Printf("set res=%v\n", res)
if err != nil {
fmt.Printf("set err=%v\n", err.Error())
// get
res, err = rdb.Get(ctx, "name").Result()
fmt.Printf("get res=%v\n", res)
if err != nil {
fmt.Printf("get err=%v\n", err.Error())
// MSet MGet
res, err = rdb.MSet(ctx, "name", "测试001", "age", "18").Result()
fmt.Printf("MSet res=%v\n", res)
if err != nil {
fmt.Printf("MSet err=%v\n", err.Error())
var ret []interface{}
ret, err = rdb.MGet(ctx, "name", "age").Result()
fmt.Printf("MGet res=%v\n", ret)
if err != nil {
fmt.Printf("MGet err=%v\n", err.Error())
// expire
res, err = rdb.Expire(ctx, "name", time.Second).Result()
fmt.Printf("expire res=%v\n", res)
if err != nil {
fmt.Printf("expire err=%v\n", err.Error())
// list操作
// lpush lpop
res, err = rdb.LPush(ctx, "hobby", "篮球", "足球", "乒乓球").Result()
fmt.Printf("lpush res=%v\n", res)
if err != nil {
fmt.Printf("lpush err=%v\n", err.Error())
// lpop
rs, err = rdb.LPop(ctx, "hobby").Result()
fmt.Printf("lpop res=%v\n", rs)
if er != nil {
fmt.Printf("lpop err=%v\n", er.Error())
// hash 操作
// hset
res, err = rdb.HSet(ctx, "userinfo", "name", "lqz").Result()
fmt.Printf("HSet res=%v\n", r)
if err != nil {
fmt.Printf("HSet err=%v\n", err.Error())
// hget
r4, er4 = rdb.HGet(ctx, "userinfo", "name").Result()
fmt.Printf("HGet res=%v\n", r4)
if er4 != nil {
fmt.Printf("HGet err=%v\n", er4.Error())
}复制 性能测试package main
import (
"context"
redis2 "github.com/go-redis/redis/v8"
"github.com/gomodule/redigo/redis"
"testing"
"time"
func BenchmarkRedis(b *testing.B) {
// 新建一个连接池
var pool *redis.Pool
pool = &redis.Pool{
MaxIdle: 10, //最初的连接数量
MaxActive: 1000, //连接池最大连接数量,(0表示自动定义),按需分配
IdleTimeout: 300, //连接关闭时间 300秒 (300秒不使用自动关闭)
Dial: func() (redis.Conn, error) { //要连接的redis数据库
return redis.Dial("tcp", "localhost:6379")
},
var rdb = redis2.NewClient(
&redis2.Options{
Addr: "localhost:6379",
Password: "",
MinIdleConns: 10,
PoolSize: 1000,
})
b.Run("redigo client Benchmark", func(b *testing.B) {
for j := 0; j < b.N; j++ {
conn := pool.Get() //从连接池,取一个链接
conn.Do("set", time.Now().String(), 10000, time.Second)
conn.Do("get", time.Now().String())
conn.Close()
})
ctx := context.Background()
b.Run("go-redis client Benchmark", func(b *testing.B) {
for j := 0; j < b.N; j++ {
rdb.Set(ctx, time.Now().String(), 1000, time.Second)
rdb.Get(ctx, time.Now().String())
})
}复制结果输出goos: darwin
goarch: amd64
cpu: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
BenchmarkRedis
BenchmarkRedis/redigo_client_Benchmark
BenchmarkRedis/redigo_client_Benchmark-12 26386 39110 ns/op
BenchmarkRedis/go-redis_client_Benchmark
BenchmarkRedis/go-redis_client_Benchmark-12 28186 37794 ns/op复制原创声明,本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。如有侵权,请联系 cloudcommunity@tencent.com 删除。展开阅读全文云数据库 RedisGo举报点赞 3分享登录 后参与评论0 条评论相关文章redis客户端对比redigo go-redis应用程序调用Get方法从池中获取连接,并使用连接的Close方法将连接的资源返回到池。golangLeetcodeDotNetCore三大Redis客户端对比和使用心得稍微复杂一点的互联网项目,技术选型都会涉及Redis,.NetCore的生态越发完善,支持.NetCore的Redis客户端越来越多,有态度的马甲go语言使用redis(redigo)go的redis client用的比较多两个包是redix和redigo,因为beego cache模块里redis使用的是redigo,所以我也就使用这个包了...李海彬Redis 学习笔记8 - 使用 go-redis 访问 redisRedis 的 API 非常简单和易于编程。处理使用命令行工具来连接,也可以用你喜欢的语言,本文描述使用 Go 语言 通过 go-redis 库连接。zhangyunfeiVir[译]使用 Go 语言读写Redis协议原文: Reading and Writing Redis Protocol in Go
翻译整理: smallnest, 译文连接: 使用 Go 语言读写Re...李海彬Go实战-redis的基本使用示例仅展示了基本的string操作的存和取,其他的操作可以依葫芦画瓢的进行配置,基本和执行redis的命令用法一致用户6680840Go 使用三方 Redis 包操作 RedisRedis 是一个基于内存的非关系型数据库,在项目开发中使用非常广泛,Go 语言操作 Redis 需要使用三方包,我们选择支持 Redis 集群和 Redis ...frank.windows下使用redis和客户端众所周知,redis是没有windows平台下的官方支持版本的,这给很多习惯使用windows的学习者,开发者带来了不必要的困扰。
好在目前有第三方的支持,缺点...用户1739228【Redis】redis安装与客户端redis-cli的使用(批量操作)先创建一个文件夹用于存放redis
mkdir /data/redis & cd /data/redis石臻臻的杂货铺[同名公众号]linux使用客户端连接redis,使用redis客户端连接windows和linux下的redis并解决无法连接redis的问题…[通俗易懂]搭建环境:linux是centos7.4(请注意centos7以下版本的防火墙跟centos7以上的不同,使用redis客户端连接redis时会有区别,建议使用...全栈程序员站长Go(四)Redis还不会使用?1、数据结构(3.2之前):sds:simple dynamic string是一个二进制安全数组 sds:lomtom使用Java客户端对Redis进行操作  上篇文章我们介绍了如何在centos7下面进行安装单机版redis以及redis集群。这篇文章,我们来聊一聊如何使用java客户端来进行操作redis。我们...阿豪聊干货你在使用什么 Redis 客户端工具?今天发现一个不错的 Redis 客户端工具:AnotherRedisDesktopManager。dysRabbitmq 简单介绍,安装和go客户端使用消息队列(英语:Message queue)是一种进程间通信或同一进程的不同线程间的通信方式,软件的贮列用来处理一系列的输入,通常是来自用户。消息队列提供了异步...张琳兮Golang 官方推荐使用的 Redis 客户端 redigo在之前的文章介绍过 Golang 操作 Redis 的三方库 go-redis,本文主要介绍另外一个 Golang 操作 Redis 的三方库 redigo,它...frank.Redis简单介绍和安装以及Jedis客户端使用Redis是一个开源,先进的key-value存储,并用于构建高性能,可扩展的Web应用程序的完美解决方案。
王念博客Linux下Redis数据库安装使用及Go语言操作RedisRedis简介
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从20...星哥玩云Redis使用及源码剖析-13.Redis客户端-2021-1-27Redis服务端是典型的一对多程序,可以为多个客户端提供服务,Redis服务端结构体中的clients链表中保存了所有的客户端信息,如下所示:用户7719114redis 客户端连接及常用命令使用[通俗易懂]redis存储的是:key,value格式的数据,其中key都是字符串,value有5种不同的数据结构全栈程序员站长更多文章作者介绍Johns《技思广益 · 腾讯技术人原创集》资深作者tencent后台开发tencent · 后台开发 (已认证)关注专栏文章73阅读量63.3K获赞276作者排名197精选专题腾讯云原生专题云原生技术干货,业务实践落地。活动推荐腾讯云自媒体分享计划入驻社区,可分享总价值百万资源包立即入驻邀请好友加入自媒体分享计划邀请好友,同享奖励 30 / 100 / 180 元云服务器代金券立即邀请运营活动广告关闭目录总结Redigo库介绍演示go-redis组件介绍和使用介绍演示性能测试社区专栏文章阅读清单互动问答技术沙龙技术视频团队主页腾讯云TI平台活动自媒体分享计划邀请作者入驻自荐上首页技术竞赛资源技术周刊社区标签开发者手册开发者实验室关于视频介绍社区规范免责声明联系我们友情链接归档问题归档专栏文章归档快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档腾讯云开发者扫码关注腾讯云开发者领取腾讯云代金券热门产品域名注册云服务器区块链服务消息队列 网络加速云数据库域名解析云存储视频直播热门推荐人脸识别腾讯会议企业云CDN 加速视频通话图像分析MySQL 数据库SSL 证书语音识别更多推荐数据安全负载均衡短信文字识别云点播商标注册小程序开发网站监控数据迁移Copyright © 2013 - 2022 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有 京公网安备 11010802017518 粤B2-20090059-1扫描二维码扫码关注腾讯云开发者领取腾讯云代金券