mirror of
https://github.com/cowardmrx/rds_cache_go.git
synced 2024-09-21 11:26:41 +08:00
338 lines
7.4 KiB
Go
338 lines
7.4 KiB
Go
package rds_cache_go
|
||
|
||
import (
|
||
"context"
|
||
"fmt"
|
||
"github.com/go-redis/redis/v8"
|
||
"time"
|
||
)
|
||
|
||
type config struct {
|
||
Host string // redis主机
|
||
Port string // redis 端口
|
||
Password string // redis 密码
|
||
DB int // redis库名
|
||
Client *redis.Client // redis链接客户端 【如果项目中已经有了redis链接可使用该参数】
|
||
OriginDB bool // 是否强制使用redis客户端【Client】的DB
|
||
}
|
||
|
||
type Option func(ca *config)
|
||
|
||
func WithHost(host string) Option {
|
||
return func(ca *config) {
|
||
ca.Host = host
|
||
}
|
||
}
|
||
|
||
func WithPort(port string) Option {
|
||
return func(ca *config) {
|
||
ca.Port = port
|
||
}
|
||
}
|
||
|
||
func WithPassword(password string) Option {
|
||
return func(ca *config) {
|
||
ca.Password = password
|
||
}
|
||
}
|
||
|
||
func WithRedisClient(client *redis.Client) Option {
|
||
return func(ca *config) {
|
||
ca.Client = client
|
||
}
|
||
}
|
||
|
||
func WithDB(db int) Option {
|
||
return func(ca *config) {
|
||
ca.DB = db
|
||
}
|
||
}
|
||
|
||
func WithOriginDB(originDB bool) Option {
|
||
return func(ca *config) {
|
||
ca.OriginDB = originDB
|
||
}
|
||
}
|
||
|
||
type Cache interface {
|
||
// Put 放入缓存
|
||
Put(key string, value interface{}, ttl time.Duration) error
|
||
// Exist 判断某个缓存是否存在
|
||
Exist(key string) bool
|
||
// Get 获取某个缓存的值
|
||
Get(key string) interface{}
|
||
// Delete 删除指定缓存
|
||
Delete(keys ...string) int64
|
||
// HPut hash put
|
||
HPut(key string, value ...interface{}) error
|
||
// HMPut hash put 兼容redis v3
|
||
HMPut(key string, value ...interface{}) error
|
||
// HKeyExist 判断hash表中的key是否存在
|
||
HKeyExist(key, field string) bool
|
||
// HGet 获取hash表中指定field的值
|
||
HGet(key, field string) interface{}
|
||
// HGetAll 获取hash表中的全部值
|
||
HGetAll(key string) map[string]string
|
||
// HGetKeyAll 获取hash表中的全部key
|
||
HGetKeyAll(key string) []string
|
||
// HIncrBy 为哈希表 key 中的指定字段的整数值加上增量 increment 。
|
||
HIncrBy(key, field string, incr int64) int64
|
||
// HFloatIncrBy 为哈希表 key 中的指定字段的浮点数值加上增量 increment 。
|
||
HFloatIncrBy(key, field string, incr float64) float64
|
||
// HGetValAll 获取hash表中全部的value值
|
||
HGetValAll(key string) []string
|
||
// HDelete 删除hash表中一个或多个字段
|
||
HDelete(key string, fields ...string) int64
|
||
}
|
||
|
||
// @method NewCache
|
||
// @description: 初始化一个cache对象
|
||
// @param opts ...Option
|
||
// @return Cache
|
||
func NewCache(opts ...Option) Cache {
|
||
|
||
cha := new(config)
|
||
|
||
for _, v := range opts {
|
||
v(cha)
|
||
}
|
||
|
||
rClient := new(cache)
|
||
|
||
if cha.Client == nil {
|
||
|
||
rClient.client = redis.NewClient(&redis.Options{
|
||
Addr: fmt.Sprintf("%s:%s", cha.Host, cha.Port),
|
||
Password: cha.Password,
|
||
DB: cha.DB,
|
||
})
|
||
} else {
|
||
rClient.client = cha.Client
|
||
if cha.OriginDB == false {
|
||
rClient.client.Options().DB = cha.DB
|
||
}
|
||
}
|
||
|
||
rClient.ctx = context.Background()
|
||
|
||
return rClient
|
||
|
||
}
|
||
|
||
type cache struct {
|
||
client *redis.Client
|
||
ctx context.Context
|
||
}
|
||
|
||
// @method Put
|
||
// @description: 放入缓存
|
||
// @receiver c
|
||
// @param key string key
|
||
// @param value interface{} 值
|
||
// @param ttl time.Duration 过期时间
|
||
// @return error
|
||
func (c *cache) Put(key string, value interface{}, ttl time.Duration) error {
|
||
_, err := c.client.Set(c.ctx, key, value, TTL(ttl)).Result()
|
||
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
return nil
|
||
}
|
||
|
||
// @method Exist
|
||
// @description: 判断指定缓存是否存在
|
||
// @receiver c
|
||
// @param key string 缓存key
|
||
// @return bool
|
||
func (c *cache) Exist(key string) bool {
|
||
result, err := c.client.Exists(c.ctx, key).Result()
|
||
if err != nil {
|
||
return false
|
||
}
|
||
|
||
if result <= 0 {
|
||
return false
|
||
}
|
||
|
||
return true
|
||
}
|
||
|
||
// @method Get
|
||
// @description: 获取指定缓存
|
||
// @receiver c
|
||
// @param key string 缓存key
|
||
// @return interface{}
|
||
func (c *cache) Get(key string) interface{} {
|
||
result, err := c.client.Get(c.ctx, key).Result()
|
||
|
||
if err != nil {
|
||
panic("get cache by " + key + " failed: " + err.Error())
|
||
}
|
||
|
||
return result
|
||
}
|
||
|
||
// @method Delete
|
||
// @description: 删除指定缓存
|
||
// @receiver c
|
||
// @param keys ...string
|
||
// @return int
|
||
func (c *cache) Delete(keys ...string) int64 {
|
||
result, err := c.client.Del(c.ctx, keys...).Result()
|
||
|
||
if err != nil {
|
||
panic("delete cache failed: " + err.Error())
|
||
}
|
||
|
||
return result
|
||
}
|
||
|
||
// @method HPut
|
||
// @description: hash put
|
||
// @receiver c
|
||
// @param key string
|
||
// @param value ...interface{}
|
||
// @return error
|
||
func (c *cache) HPut(key string, value ...interface{}) error {
|
||
_, err := c.client.HSet(c.ctx, key, value...).Result()
|
||
|
||
return err
|
||
}
|
||
|
||
// @method HMPut
|
||
// @description: hash put 用来兼容redis v3
|
||
// @receiver c
|
||
// @param key string
|
||
// @param value interface{}
|
||
// @return error
|
||
func (c *cache) HMPut(key string, value ...interface{}) error {
|
||
_, err := c.client.HMSet(c.ctx, key, value).Result()
|
||
|
||
return err
|
||
}
|
||
|
||
// @method HKeyExist
|
||
// @description: 判断hash表中的key是否存在
|
||
// @receiver c
|
||
// @param key string
|
||
// @return bool
|
||
func (c *cache) HKeyExist(key, field string) bool {
|
||
result, err := c.client.HExists(c.ctx, key, field).Result()
|
||
|
||
if err != nil {
|
||
return false
|
||
}
|
||
|
||
return result
|
||
|
||
}
|
||
|
||
// @method HGet
|
||
// @description: 获取hash表中指定key,field的值
|
||
// @receiver c
|
||
// @param key string
|
||
// @param field string
|
||
// @return interface{}
|
||
func (c *cache) HGet(key, field string) interface{} {
|
||
result, err := c.client.HGet(c.ctx, key, field).Result()
|
||
|
||
if err != nil {
|
||
panic("get key : " + key + " from hash filed: " + field + " failed: " + err.Error())
|
||
}
|
||
|
||
return result
|
||
}
|
||
|
||
// @method HGetAll
|
||
// @description: 获取hash表中的全部数据
|
||
// @receiver c
|
||
// @param key string
|
||
// @return interface{}
|
||
func (c *cache) HGetAll(key string) map[string]string {
|
||
result, err := c.client.HGetAll(c.ctx, key).Result()
|
||
|
||
if err != nil {
|
||
panic("get hash by key: " + key + " failed: " + err.Error())
|
||
}
|
||
|
||
return result
|
||
}
|
||
|
||
// @method HGetKeyAll
|
||
// @description: 获取hash表中的全部key
|
||
// @receiver c
|
||
// @param key string
|
||
func (c *cache) HGetKeyAll(key string) []string {
|
||
result, err := c.client.HKeys(c.ctx, key).Result()
|
||
|
||
if err != nil {
|
||
panic("get hash all key failed :" + err.Error() + " by cache key :" + key)
|
||
}
|
||
|
||
return result
|
||
}
|
||
|
||
// @method HIncrBy
|
||
// @description: 为哈希表 key 中的指定字段的整数值加上增量 increment
|
||
// @receiver c
|
||
// @param key string
|
||
// @param field string
|
||
// @param incr int64
|
||
func (c *cache) HIncrBy(key, field string, incr int64) int64 {
|
||
result, err := c.client.HIncrBy(c.ctx, key, field, incr).Result()
|
||
|
||
if err != nil {
|
||
panic("hash incr by failed: " + err.Error())
|
||
}
|
||
|
||
return result
|
||
}
|
||
|
||
// @method HFloatIncrBy
|
||
// @description: 为哈希表 key 中的指定字段的浮点数值加上增量 increment
|
||
// @receiver c
|
||
// @param key string
|
||
// @param field string
|
||
// @param incr float64
|
||
// @return float64
|
||
func (c *cache) HFloatIncrBy(key, field string, incr float64) float64 {
|
||
result, err := c.client.HIncrByFloat(c.ctx, key, field, incr).Result()
|
||
|
||
if err != nil {
|
||
panic("hash incr float by failed: " + err.Error())
|
||
}
|
||
|
||
return result
|
||
}
|
||
|
||
// @method HGetValAll
|
||
// @description: 获取hash表中全部的value 值
|
||
// @receiver c
|
||
// @param key string
|
||
func (c *cache) HGetValAll(key string) []string {
|
||
result, err := c.client.HVals(c.ctx, key).Result()
|
||
|
||
if err != nil {
|
||
panic("get hash all value failed: " + err.Error())
|
||
}
|
||
|
||
return result
|
||
}
|
||
|
||
// @method HDelete
|
||
// @description: 删除hash表中一个或多个字段
|
||
// @receiver c
|
||
// @param key string
|
||
// @param fields ...string
|
||
func (c *cache) HDelete(key string, fields ...string) int64 {
|
||
result, err := c.client.HDel(c.ctx, key, fields...).Result()
|
||
|
||
if err != nil {
|
||
panic("delete hash filed failed: " + err.Error())
|
||
}
|
||
|
||
return result
|
||
}
|