redis mysql 封装 层_go语言封装的 mysql 和 封装的 redis

该代码展示了如何初始化和关闭MySQL数据库连接以及使用redigo库操作Redis进行数据的读写。通过读写锁dbMtx确保了数据库操作的并发安全性。在读取MySQL数据后写入Redis,同时在写入大量数据到MySQL时使用锁防止并发问题。
摘要由CSDN通过智能技术生成

package main

import (

"fmt"

"os"

"sync"

_ "github.com/go-sql-driver/mysql"

//数据库依赖

"github.com/garyburd/redigo/redis"

"github.com/jmoiron/sqlx"

)

var (

//数据库读写锁

dbMt sync.RWMutex

mysqlDB *sqlx.DB

redisPool *redis.Pool

)

func InitMysql(){

if mysqlDB == nil {

db, err := sqlx.Connect("mysql", "root:[email protected](12.12.12.12:3306)/thinkphp")

mysqlDB = db

HandleError(err,`sqlx.Connect("mysql","root:[email protected](12.12.12.12:3306)/thinkphp")`)

}

}

func CloseMysql(){

if mysqlDB != nil {

mysqlDB.Close()

}

}

func GetRedisConn() redis.Conn{

if redisPool == nil{

redisPool = &redis.Pool{

MaxActive: 100,

MaxIdle: 10,

IdleTimeout: 10,

Dial: func() (redis.Conn, error) {

conn, err := redis.Dial("tcp", "12.12.12.12:6379")

HandleError(err,`redis.Dial("tcp", "12.12.12.12:6379")`)

//redis密码

_, e := conn.Do("AUTH", "123456")

HandleError(e,`conn.Do("AUTH", "123456")`)

//指定redis哪个库

_, err = conn.Do("select", "1")

HandleError(err,`conn.Do("select", "1")`)

return conn, err

}}

}

return redisPool.Get()

}

func CloseRedis(){

if redisPool != nil {

redisPool.Close()

}

}

func WriteRedis(name string,score int){

//调用redis

conn := GetRedisConn()

_, err := conn.Do("set", name, score)

HandleError(err,"conn.Do set")

}

func ReadRedis(name string) (score int,err error) {

//调用redis

conn := GetRedisConn()

reply, err := conn.Do("get", name)

HandleError(err,"conn.Do get")

score, err = redis.Int(reply, err)

return score, err

}

func ReadMysql(name string){

dbMt.RLock()

//调用mysql

InitMysql()

results := make([]ExamResult, 0)

err := mysqlDB.Select(&results, "select * from score where name=?;", name)

HandleError(err,"mysqlDB.Select")

fmt.Println(results)

dbMt.RUnlock()

//写入redis

WriteRedis(name,results[0].Score)

}

func WriteMysql(scoreMap map[string]int){

dbMt.Lock()

//调用mysql

InitMysql()

for name,score := range scoreMap{

_, err := mysqlDB.Exec("insert into score(name,score) values(?,?);", name, score)

if err != nil {

fmt.Println("插入失败err=",err)

os.Exit(1)

}

}

dbMt.Unlock()

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值