package main
import (
"fmt"
"github.com/gomodule/redigo/redis"
"time"
)
// go get github.com/gomodule/redigo/redis
var Redis *RedisPool
func main(){
// 初始化redis连接池
Redis = &RedisPool{}
Redis.InitRedisPool("")
structAdd()
structValues()
MapAdd()
}
type User struct {
ID int64 `redis:"id"`
Name string `redis:"name"`
}
// 添加struct类型的值(需要注意的是结构体字段是可导出的字段名称,并且使用了字段标签 redis。)
func structAdd() {
u1 := User{
ID: 1,
Name: "name1",
}
replyStruct, err := Redis.Do("HMSET", redis.Args{}.Add("hkey1").AddFlat(&u1)...)
if err != nil {
fmt.Println("struct err: ", err)
}
// 最后存在redis里的样子如下(用struct的方式,redisgo会解析成key-value形式):
// id 1
// name name1
fmt.Println(replyStruct) // OK
}
// structValues 把hash读取到struct
func structValues() {
v, err := redis.Values(Redis.Do("HGETALL", "hkey1"))
if err != nil {
fmt.Println("redis.Values() err: ", err)
}
// redis.ScanStruct()
u2 := new(User)
if err := redis.ScanStruct(v, u2); err != nil {
fmt.Println("redis.ScanStruct() err: ", err)
}
fmt.Printf("%+v\n", u2) // &{ID:1 Name:name1}
}
// MapAdd 添加map到hash
func MapAdd(){
uu := map[string]string{
"a1":"name1",
"a2":"name2",
"a3":"name3",
}
replyMap,err := Redis.Do("HMSET",redis.Args{}.Add("key2").AddFlat(uu)...)
if err != nil{
fmt.Println("MapAdd",err)
}else{
fmt.Println("MapAdd",replyMap) // MapAdd OK
}
}
// ---------- Redis
type RedisPool struct{
pool *redis.Pool
}
func (r *RedisPool) InitRedisPool(password string){
r.pool = &redis.Pool{
MaxIdle: 10, // 最大空闲连接数
MaxActive: 10,
IdleTimeout: 240,
Wait: true,
Dial: func() (redis.Conn, error) {
c,err := redis.Dial("tcp",
"127.0.0.1:6379",
redis.DialDatabase(0),
redis.DialReadTimeout(time.Duration(1)*time.Second),
redis.DialWriteTimeout(time.Duration(1)*time.Second),
redis.DialConnectTimeout(time.Duration(2)*time.Second),
)
if err != nil{
fmt.Println("Dial",err)
return nil,err
}
if password != ""{
if _,err := c.Do("AUTH",password);err != nil{
c.Close()
fmt.Println("AUTH",err)
return nil,err
}
}
return c,nil
},
TestOnBorrow: func(c redis.Conn, t time.Time) error {
if _,err := c.Do("PING");err != nil{
fmt.Println("PING",err)
return err
}
return nil
},
}
}
func (r *RedisPool) Do(commandName string, args ...interface{})(reply interface{}, err error){
conn := r.pool.Get()
reply,err = conn.Do(commandName,args...)
defer conn.Close()
return
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)