做网站app的工资高吗,安阳做网站电话,惠州seo博客,为某网站做一则广告语文章目录 Redis 参考文档配置项import 和 bury使用分布是缓存 redis.Cache接口定义使用示例 使用分布式锁 redis.Locker接口定义使用示例 操作Key#xff0c;使用 redis.Key接口定义 使用 Provider 注入 redis 接口使用示例 直接使用redis连接池接口定义使用示例 Redis 参考文… 文章目录 Redis 参考文档配置项import 和 bury使用分布是缓存 redis.Cache接口定义使用示例 使用分布式锁 redis.Locker接口定义使用示例 操作Key使用 redis.Key接口定义 使用 Provider 注入 redis 接口使用示例 直接使用redis连接池接口定义使用示例 Redis 参考文档
本文件介绍如何利用Gone内置模块操作redis包括使用分布式缓存、分布式锁、操作键值、操作Hash等内容是对Gone框架介绍18 - redis 分布式缓存 和 分布式锁 的补充和完善。
已经收录到官方文档https://goner.fun/zh/references/redis.html
配置项
redis.max-idle最大空闲链接数不配置默认为2redis.max-active最大活跃链接数不配置默认为10redis.db使用的db不配置默认为0redis.cache.prefixkey前缀如果设置了对redis的增删改查都会拼接该前缀拼接方式KaTeX parse error: Expected EOF, got # at position 9: {prefix}#̲{key}默认为空
import 和 bury
import
import github.com/gone-io/gone/goner/redisbury
//使用 goner.RedisPriest 函数将 redis 相关的Goner 埋葬到 Cemetery 中
_ goner.RedisPriest(cemetery)使用分布是缓存 redis.Cache
接口定义
type Cache interface {//设置缓存Set的别名Put(key string, value any, ttl ...time.Duration) error//设置缓存Set(key string, value any, ttl ...time.Duration) error//获取缓存Get(key string, value any) error//删除缓存Remove(key string) (err error)//根据模式获取缓存的keyKeys(pattern string) ([]string, error)//获取当前Cache使用的前缀Prefix() string
}使用示例
type redisUser struct {gone.Flagcache redis.Cache gone:gone-redis-cache
}func (r *redisUser) UseCache() {key : gone-addressvalue : https://github.com/gone-io/gone//设置缓存err : r.cache.Put(key, //第一个参数为 缓存的key类型为 stringvalue, // 第二参数为 需要缓存的值类型为any可以是任意类型传入的值会被编码为 []byte 发往redis10*time.Second, // 第三个参数为 过期时间类型为 time.Duration;省略表示不设置过期时间)if err ! nil {fmt.Printf(err:%v, err)return}//获取缓存var getValue stringerr r.cache.Get(key, //第一个参数为 缓存的key类型为 stringgetValue, //第二参数为指针接收获取缓存的值类型为any可以是任意类型从redis获取的值会被解码为传入的指针类型)if err ! nil {fmt.Printf(err:%v, err)return}fmt.Printf(getValue:%v, getValue)
}使用分布式锁 redis.Locker
接口定义
// Locker redis 分布式缓存
type Locker interface {//TryLock 尝试将key锁定一段时间成功返回一个解锁函数失败返回错误TryLock(key string, ttl time.Duration) (unlock Unlock, err error)//LockAndDo 尝试获取锁并执行fn函数函数未执行完自动续期函数执行完后自动释放锁LockAndDo(key string, fn func(), lockTime, checkPeriod time.Duration) (err error)
}使用示例
type redisUser struct {gone.Flaglocker redis.Locker gone:gone-redis-locker
}func (r *redisUser) UseLock() {lockKey : gone-lock-key//尝试获取锁 并 锁定一段时间//返回的第一个参数为一个解锁的函数unlock, err : r.locker.TryLock(lockKey, //第一个参数为 锁的key类型为 string10*time.Second, //第二参数为 锁的过期时间类型为 time.Duration)if err ! nil {fmt.Printf(err:%v, err)return}//操作完后需要解锁defer unlock()//获取锁成功后可以进行业务操作//todo
}func (r *redisUser) LockFunc() {lockKey : gone-lock-keyerr : r.locker.LockAndDo(lockKey, //第一个参数为 锁的key类型为 stringfunc() { //第二个参数为 需要执行的函数类型为 func()代表一个操作//获取锁成功后可以进行业务操作//todoprintln(do some options)},100*time.Second, //第三个参数为 锁的过期时间类型为 time.Duration;第一次加锁和后续锁续期都将使用该值5*time.Second, //第四个参数为 锁续期的间隔时间类型为 time.Duration;周期性检查所是否将过期如果在下个周期内会过期则对锁续期)if err ! nil {fmt.Printf(err:%v, err)}
}操作Key使用 redis.Key
接口定义
type Key interface {//Expire 给key设置一段时间后过期Expire(key string, ttl time.Duration) error//ExpireAt 设置key在某个时间点过期ExpireAt(key string, time time.Time) error//Ttl 获取key的过期时间Ttl(key string) (time.Duration, error)//Del 删除一个keyDel(key string) (err error)//Incr 使key自增一个量Incr(field string, increment int64) (int64, error)//Keys 根据模式获取缓存的keyKeys(pattern string) ([]string, error)//Prefix 获取redis配置的key前缀Prefix() string
}使用 Provider 注入 redis 接口
通过标签 gone:gone-redis-provider,${key}使用redis Provider 创建一个接口给注入属性。支持注入的接口包括前面的redis.Cache、redis.Locker、redis.Key另外还支持注入 redis.Hash接口用于操作redis hash。
Hash接口定义
type Hash interface {//设置hash字段Set(field string, v interface{}) (err error)//获取hash字段Get(field string, v interface{}) error//删除hash字段Del(field string) error//扫描hash字段Scan(func(field string, v []byte)) error//hash字段自增Incr(field string, increment int64) (int64, error)
}使用示例
使用 Provider 创建一个redis.Cache接口该缓存接口的前缀将使用配置中的前缀拼接${key}得到新的前缀可以用于有按模块隔离的场景。 如果配置了redis.cache.prefixmember那么下面注入的redis.Cache接口将使用的前缀为member#points执行操作r.redis.Set(use-110, value)操作保存到redis中的key为member#points#use-110。
type redisUser struct {gone.Flagredis redis.Cache gone:gone-redis-provider,points
}func (r *redisUser) UseProvidedCache() {r.redis.Set(use-110, value)
}redis.Locker 和 redis.Key 接口的注入 与 redis.Cache 接口类似。
从配置文件中读取一个值作为前缀来拼接 如果配置了redis.cache.prefixorder 和 app.order.sell.redis-prefixsell下面注入的接口将使用的前缀为order#sell执行操作r.redis.Set(use-110, value)操作保存到redis中的key为order#sell#use-110。
type redisUser struct {gone.Flagredis redis.Cache gone:gone-redis-provider,configapp.order.sell.redis-prefix //读取配置中的 app.order.sell.redis-prefix 的值用于创建 redis.Cache
}func (r *redisUser) UseProvidedCache() {r.redis.Set(use-110, value)
}redis.Locker 和 redis.Key 接口的注入 与 redis.Cache 接口类似。
使用 redis.Hash 接口 在注入redis.Hash接口时key不在为前缀而就是当前redis要操作的key。
如果配置了redis.cache.prefixuser下面代码中的r.hash.Set(use-110, value)将会被翻译为指令HSET user-set use-110 value。
type redisUser struct {gone.Flaghash redis.Hash gone:gone-redis-provider,user-set
}
func (r *redisUser) UseHash() {r.hash.Set(use-110, value)
}直接使用redis连接池
接口定义
type Pool interface {//获取链接Get() Conn//释放链接Close(conn redis.Conn)
}使用示例
type redisUser struct {gone.Flagpool redis.Pool gone:gone-redis-pool
}func (r *redisUser) UsePool() {conn : r.pool.Get()defer r.pool.Close(conn)//执行redis命令_, err : conn.Do(SET, key, value)
}