hello/redis/redis.go

170 lines
3.0 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package redis
import (
"encoding/json"
"os"
"strconv"
"time"
redigo "github.com/gomodule/redigo/redis"
)
/*
REDIS_DSN=127.0.0.1:6379 \
REDIS_PWD=eYX7EwxKPCDmwMtyKVge8oLd2t81 \
REDIS_DB=0 \
*/
var pool *redigo.Pool
func init() {
dbNumber := func() int {
db := os.Getenv("REDIS_DB")
database, err := strconv.Atoi(db)
if err != nil {
return 0
}
if database < 0 {
database = 0
}
if database > 16 {
database = 0
}
return database
}()
pool = &redigo.Pool{
MaxActive: 100,
MaxIdle: 1,
IdleTimeout: time.Second * time.Duration(60),
Dial: func() (redigo.Conn, error) {
return redigo.Dial("tcp", os.Getenv("REDIS_DSN"),
redigo.DialDatabase(dbNumber),
redigo.DialPassword(os.Getenv("REDIS_PWD")),
)
},
TestOnBorrow: func(conn redigo.Conn, t time.Time) error {
if time.Since(t) < time.Minute {
return nil
}
_, err := conn.Do("PING")
return err
},
}
}
// GetBytes 获取一个字节数组值
func GetBytes(key *string) (*[]byte, error) {
conn := pool.Get()
defer conn.Close()
data, err := redigo.Bytes(conn.Do("GET", *key))
return &data, err
}
// Get 获取一个值
func Get(key string) interface{} {
conn := pool.Get()
defer conn.Close()
var data []byte
var err error
if data, err = redigo.Bytes(conn.Do("GET", key)); err != nil {
return nil
}
var reply interface{}
if err = json.Unmarshal(data, &reply); err != nil {
return nil
}
return reply
}
// 集合Set增加元素
func SetAdd(key string, data ...interface{}) error {
conn := pool.Get()
defer conn.Close()
var err error
for _, d := range data {
_, e := conn.Do("SADD", key, d)
if e != nil {
err = e
break
}
}
return err
}
// 集合Set删除元素
func SetRem(key string, data ...interface{}) error {
conn := pool.Get()
defer conn.Close()
var err error
for _, d := range data {
_, e := conn.Do("SREM", key, d)
if e != nil {
err = e
break
}
}
return err
}
// 集合Set判断是否存在成员member结果.(int64)==1表示存在
func SetIsMember(key string, member interface{}) (interface{}, error) {
conn := pool.Get()
defer conn.Close()
return conn.Do("SISMEMBER", key, member)
}
// 设置一个值
func Set(key string, val interface{}, timeout time.Duration) error {
data, err := json.Marshal(val)
if err != nil {
return err
}
return SetBytes(&key, &data, timeout)
}
func SetBytes(key *string, data *[]byte, timeout time.Duration) error {
conn := pool.Get()
defer conn.Close()
_, err := conn.Do("SETEX", *key, int64(timeout/time.Second), *data)
return err
}
// IsExist 判断key是否存在
func IsExist(key string) bool {
conn := pool.Get()
defer conn.Close()
a, _ := conn.Do("EXISTS", key)
i := a.(int64)
return i > 0
}
// Delete 删除
func Delete(key string) error {
conn := pool.Get()
defer conn.Close()
if _, err := conn.Do("DEL", key); err != nil {
return err
}
return nil
}
// Expire 失效时间配置
func Expire(key string, t int64) error {
conn := pool.Get()
defer conn.Close()
if _, err := conn.Do("expire", key, t); err != nil {
return err
}
return nil
}