Golang使用Redis与连接池方式

 更新时间:2024年06月01日 11:16:28   作者:T  
这篇文章主要介绍了Golang使用Redis与连接池方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Golang使用Redis与连接池

使用下载go的redis包go get github.com/gomodule/redigo/redis 如果网不好的话就很费劲了

package main

import (
	"fmt"
	"github.com/gomodule/redigo/redis" // 引入redis包
)

func main() {
	//连接数据源
	rediss, err := redis.Dial("tcp", "127.0.01:6379")

	if err != nil {
		fmt.Println("连接异常", err)
	}

	//插入string数据
	test, err := rediss.Do("set", "test", "hi")
	if err != nil {
		fmt.Println("插入数据失败", err)
	}
	fmt.Println(test)

	//读取string数据
	str, err := redis.String(rediss.Do("get", "test"))
	fmt.Println(str)

	//hash 类型
	do, _ := rediss.Do("hset", "hh", "name", "zhangsn")
	fmt.Println(do)
	hh, _ := redis.String(rediss.Do("hget", "hh", "name"))
	fmt.Println(hh)

	//设置key 过期时间
	rediss.Do("expire", "hh", 1)

	//关闭redis
	rediss.Close()
}

redis数据源连接池

package main

import (
    "fmt"
    "github.com/gomodule/redigo/redis" // 引入redis包
)

var pool *redis.Pool

func init() {
    pool = &redis.Pool{
        MaxIdle:     8,   //最大空闲连接数
        MaxActive:   0,   //表示和数据库最大连接数。0表示没有限制
        IdleTimeout: 100, //最大空闲时间
        Dial: func() (redis.Conn, error) { //初始化连接 redis 地址
            return redis.Dial("tcp", "127.0.01:6379")
        },
    }
}
func main() {

    //获取连接
    conn := pool.Get()
    //插入数据
    do, err := conn.Do("set", "11", "11")
    if err != nil {
        fmt.Println("插入失败", err)
    }

    fmt.Println(do)

    //关闭redis
    conn.Close()

}

Golang Redis连接池封装

创建连接池方法文件

package dao
 
import (
	"fmt"
	"github.com/gomodule/redigo/redis"
	"gopkg.in/ini.v1"
	"os"
	"sync"
	"time"
)
 
var once sync.Once
 
// RedisClient Redis 服务
type RedisClient struct {
	Client *redis.Pool
}
 
//Redis 全局 Redis
var RedisPool *RedisClient
 
//ConnectRedis 连接 redis 数据库,设置全局的 Redis 对象
func ConnectRedis() {
	config, err := ini.Load("./config/app.ini")
	if err != nil {
		//失败
		fmt.Printf("Fail to read file: %v", err)
		os.Exit(1)
	}
	address := config.Section("redis").Key("address").String()
	password := config.Section("redis").Key("password").String()
	db, _ := config.Section("redis").Key("db").Int()
	once.Do(func() {
		RedisPool = NewClient(address, password, db)
	})
	con_err := RedisPool.Ping()
	if con_err != nil {
		panic(con_err)
	}
}
 
// NewClient 创建一个新的 redis 连接
func NewClient(address string, password string, db int) *RedisClient {
	// 初始化自定的 RedisClient 实例
	rds := &RedisClient{}
	// 使用 redis 库里的 NewClient 初始化连接
	rds.Client = &redis.Pool{
		MaxIdle:     100,  //最大空闲
		MaxActive:   1000, //最大连接
		IdleTimeout: time.Duration(60) * time.Second,
		Wait:        true,
		Dial: func() (redis.Conn, error) {
			c, err := redis.Dial(
				"tcp",
				address,
				redis.DialPassword(password),
				redis.DialDatabase(int(db)),
				redis.DialConnectTimeout(time.Duration(60)*time.Second),
				redis.DialReadTimeout(time.Duration(60)*time.Second),
				redis.DialWriteTimeout(time.Duration(60)*time.Second),
			)
			if err != nil {
				return nil, err
			}
			return c, err
		},
	}
	return rds
}
 
// Ping 用以测试 redis 连接是否正常
func (rds *RedisClient) Ping() error {
	_, err := rds.Client.Get().Do("ping")
	return err
}
 
// Set 存储 key 对应的 value,且设置 expiration 过期时间(单位纳秒)
func (rds *RedisClient) Setex(key string, expiration int, value interface{}) bool {
	conn := rds.Client.Get()
	defer conn.Close()
	if _, err := conn.Do("setex", key, expiration, value); err != nil {
		fmt.Println(err)
		return false
	}
	return true
}
 
//
//Get 获取 key 对应的 value
func (rds *RedisClient) Get(key string) string {
	conn := rds.Client.Get()
	defer conn.Close()
	result, err := redis.String(conn.Do("Get", key))
	if err != nil {
		return ""
	}
	return result
}
 
//Get 获取 key 对应的 value
func (rds *RedisClient) Rpop(key string) (string, error) {
	conn := rds.Client.Get()
	defer conn.Close()
	result, err := redis.String(conn.Do("Rpop", key))
	if err != nil {
		return "", err
	}
	return result, nil
}

配置文件

app_name   = go-gin
 
 
[mysql]
ip       = 127.0.0.1
port     = 3306
user     = root
password = root
database = test
prefix   = tt_
#最大连接数
MaxIdleConns = 500
#最大空闲
MaxOpenConns = 50
 
[redis]
address   = 127.0.0.1:6379
password = 123456
db = 7

调用方法

func main() {
	dao.ConnectRedis()                 //初始化连接redis
	defer dao.RedisPool.Client.Close() //退出前执行关闭
	res, err := dao.RedisPool.Rpop("aaa")
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(res)
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • go集成gorm数据库的操作代码

    go集成gorm数据库的操作代码

    GORM 是一个用于 Go 语言的 ORM(对象关系映射)库,它提供了一种简单而强大的方式来与数据库进行交互,GORM 支持多种数据库,并且提供了丰富的功能,如自动迁移、预加载、事务管理等,文中通过代码示例讲解的非常详细,需要的朋友可以参考下
    2024-11-11
  • Golang中字符串(string)与字节数组([]byte)一行代码互转实例

    Golang中字符串(string)与字节数组([]byte)一行代码互转实例

    golang语言本身就是c的工具集,开发c的程序用到的大部分结构体,内存管理,携程等,golang基本都有,下面这篇文章主要给大家介绍了关于Golang中字符串(string)与字节数组([]byte)一行代码互转的相关资料,需要的朋友可以参考下
    2022-09-09
  • Golang基于内存的键值存储缓存库go-cache

    Golang基于内存的键值存储缓存库go-cache

    go-cache是一个内存中的key:value store/cache库,适用于单机应用程序,本文主要介绍了Golang基于内存的键值存储缓存库go-cache,具有一定的参考价值,感兴趣的可以了解一下
    2025-03-03
  • 详解Go语言中的数据类型及类型转换

    详解Go语言中的数据类型及类型转换

    这篇文章主要为大家介绍了Go语言中常见的几种数据类型,以及他们之间的转换方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-04-04
  • go语言使用jwt认证的实现

    go语言使用jwt认证的实现

    本文主要介绍了go语言使用jwt认证的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • 如何使用Go语言获取当天、昨天、明天、某天0点时间戳以及格式化时间

    如何使用Go语言获取当天、昨天、明天、某天0点时间戳以及格式化时间

    这篇文章主要给大家介绍了关于如何使用Go语言获取当天、昨天、明天、某天0点时间戳以及格式化时间的相关资料,格式化时间戳是将时间戳转换为特定的日期和时间格式,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • Go语言实现Base64、Base58编码与解码

    Go语言实现Base64、Base58编码与解码

    本文主要介绍了Base64、Base58编码与解码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • 一文带你掌握Go语言中的时间处理操作

    一文带你掌握Go语言中的时间处理操作

    这篇文章主要为大家详细介绍了Go语言中的时间处理操作的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以了解下
    2026-04-04
  • Golang实现IO操作

    Golang实现IO操作

    本文主要介绍了Golang实现IO操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05
  • 解决go 生成的exe不在bin文件夹里的问题

    解决go 生成的exe不在bin文件夹里的问题

    这篇文章主要介绍了解决go 生成的exe不在bin文件夹里的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12

最新评论