mirror of
https://github.com/silenceper/wechat.git
synced 2026-02-04 21:02:25 +08:00
110 lines
2.7 KiB
Go
110 lines
2.7 KiB
Go
package cache
|
|
|
|
import (
|
|
"context"
|
|
"crypto/tls"
|
|
"net"
|
|
"time"
|
|
|
|
"github.com/go-redis/redis/v8"
|
|
)
|
|
|
|
// Redis .redis cache
|
|
type Redis struct {
|
|
ctx context.Context
|
|
conn redis.UniversalClient
|
|
}
|
|
|
|
// RedisOpts redis 连接属性
|
|
type RedisOpts struct {
|
|
Host string `json:"host" yml:"host"`
|
|
Username string `json:"username" yaml:"username"`
|
|
Password string `json:"password" yml:"password"`
|
|
Database int `json:"database" yml:"database"`
|
|
MaxIdle int `json:"max_idle" yml:"max_idle"`
|
|
MaxActive int `json:"max_active" yml:"max_active"`
|
|
IdleTimeout int `json:"idle_timeout" yml:"idle_timeout"` // second
|
|
UseTLS bool `json:"use_tls" yml:"use_tls"` // 是否使用TLS
|
|
}
|
|
|
|
// NewRedis 实例化
|
|
func NewRedis(ctx context.Context, opts *RedisOpts) *Redis {
|
|
uniOpt := &redis.UniversalOptions{
|
|
Addrs: []string{opts.Host},
|
|
DB: opts.Database,
|
|
Username: opts.Username,
|
|
Password: opts.Password,
|
|
IdleTimeout: time.Second * time.Duration(opts.IdleTimeout),
|
|
MinIdleConns: opts.MaxIdle,
|
|
}
|
|
|
|
if opts.UseTLS {
|
|
h, _, err := net.SplitHostPort(opts.Host)
|
|
if err != nil {
|
|
h = opts.Host
|
|
}
|
|
uniOpt.TLSConfig = &tls.Config{
|
|
ServerName: h,
|
|
}
|
|
}
|
|
|
|
conn := redis.NewUniversalClient(uniOpt)
|
|
return &Redis{ctx: ctx, conn: conn}
|
|
}
|
|
|
|
// SetConn 设置conn
|
|
func (r *Redis) SetConn(conn redis.UniversalClient) {
|
|
r.conn = conn
|
|
}
|
|
|
|
// SetRedisCtx 设置redis ctx 参数
|
|
func (r *Redis) SetRedisCtx(ctx context.Context) {
|
|
r.ctx = ctx
|
|
}
|
|
|
|
// Get 获取一个值
|
|
func (r *Redis) Get(key string) interface{} {
|
|
return r.GetContext(r.ctx, key)
|
|
}
|
|
|
|
// GetContext 获取一个值
|
|
func (r *Redis) GetContext(ctx context.Context, key string) interface{} {
|
|
result, err := r.conn.Do(ctx, "GET", key).Result()
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
return result
|
|
}
|
|
|
|
// Set 设置一个值
|
|
func (r *Redis) Set(key string, val interface{}, timeout time.Duration) error {
|
|
return r.SetContext(r.ctx, key, val, timeout)
|
|
}
|
|
|
|
// SetContext 设置一个值
|
|
func (r *Redis) SetContext(ctx context.Context, key string, val interface{}, timeout time.Duration) error {
|
|
return r.conn.SetEX(ctx, key, val, timeout).Err()
|
|
}
|
|
|
|
// IsExist 判断key是否存在
|
|
func (r *Redis) IsExist(key string) bool {
|
|
return r.IsExistContext(r.ctx, key)
|
|
}
|
|
|
|
// IsExistContext 判断key是否存在
|
|
func (r *Redis) IsExistContext(ctx context.Context, key string) bool {
|
|
result, _ := r.conn.Exists(ctx, key).Result()
|
|
|
|
return result > 0
|
|
}
|
|
|
|
// Delete 删除
|
|
func (r *Redis) Delete(key string) error {
|
|
return r.DeleteContext(r.ctx, key)
|
|
}
|
|
|
|
// DeleteContext 删除
|
|
func (r *Redis) DeleteContext(ctx context.Context, key string) error {
|
|
return r.conn.Del(ctx, key).Err()
|
|
}
|