当前位置: 首页 > news >正文

Gone框架介绍25 - 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:最大空闲链接数,不配置默认为2
  • redis.max-active:最大活跃链接数,不配置默认为10
  • redis.db:使用的db,不配置默认为0
  • redis.cache.prefix:key前缀,如果设置了,对redis的增删改查都会拼接该前缀,拼接方式KaTeX parse error: Expected 'EOF', got '#' at position 9: {prefix}#̲{key};默认为空

import 和 bury

  • import
import "github.com/gone-io/gone/goner/redis"
  • bury
//使用 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-address"value := "https://github.com/gone-io/gone"//设置缓存err := r.cache.Put(key,            //第一个参数为 缓存的key,类型为 `string`value,          // 第二参数为 需要缓存的值,类型为any,可以是任意类型;传入的值会被编码为 `[]byte` 发往redis10*time.Second, // 第三个参数为 过期时间,类型为 `time.Duration`;省略,表示不设置过期时间)if err != nil {fmt.Printf("err:%v", err)return}//获取缓存var getValue stringerr = r.cache.Get(key,       //第一个参数为 缓存的key,类型为 `string`&getValue, //第二参数为指针,接收获取缓存的值,类型为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,类型为 `string`10*time.Second, //第二参数为 锁的过期时间,类型为 `time.Duration`)if err != nil {fmt.Printf("err:%v", err)return}//操作完后,需要解锁defer unlock()//获取锁成功后,可以进行业务操作//todo
}func (r *redisUser) LockFunc() {lockKey := "gone-lock-key"err := r.locker.LockAndDo(lockKey, //第一个参数为 锁的key,类型为 `string`func() { //第二个参数为 需要执行的函数,类型为 `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.Cacheredis.Lockerredis.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)
}

使用示例

  1. 使用 Provider 创建一个redis.Cache接口,该缓存接口的前缀将使用配置中的前缀拼接${key}得到新的前缀,可以用于有按模块隔离的场景。
    如果配置了redis.cache.prefix=member,那么下面注入的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 接口类似。

  1. 从配置文件中读取一个值作为前缀来拼接
    如果配置了redis.cache.prefix=orderapp.order.sell.redis-prefix=sell,下面注入的接口将使用的前缀为: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,config=app.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 接口类似。

  1. 使用 redis.Hash 接口
    在注入redis.Hash接口时,key不在为前缀,而就是当前redis要操作的key。

如果配置了redis.cache.prefix=user,下面代码中的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")
}

相关文章:

Gone框架介绍25 - Redis模块参考文档

文章目录 Redis 参考文档配置项import 和 bury使用分布是缓存 redis.Cache接口定义使用示例 使用分布式锁 redis.Locker接口定义使用示例 操作Key,使用 redis.Key接口定义 使用 Provider 注入 redis 接口使用示例 直接使用redis连接池接口定义使用示例 Redis 参考文…...

SpringBoot前置知识02-spring注解发展史

springboot前置知识01-spring注解发展史 spring1.x spring配置只能通过xml配置文件的方式注入bean,需要根据业务分配配置文件&#xff0c;通过import标签关联。 spring1.2版本出现Transactional注解 <?xml version"1.0" encoding"UTF-8"?> <be…...

C++ TCP发送Socket数据

DEVC需要加入ws2_32库 #include <iostream> #include <winsock2.h>#pragma comment(lib, "ws2_32.lib")void sendData(const char* ip, int port, const char* data) {WSADATA wsaData;SOCKET sockfd;struct sockaddr_in server_addr;// 初始化Winsock…...

鸿蒙HarmonyOS开发中的易混点归纳-持续补充中

相关文章目录 鸿蒙HarmonyOS开发术语全解&#xff1a;小白也能看懂&#xff01; 文章目录 相关文章目录前言一、build()函数和Builder装饰器&#xff1f;二、自定义组件和系统组件&#xff08;内置组件&#xff09;三、组件和页面四、自定义弹窗和其他弹窗总结 前言 一、build…...

ue引擎游戏开发笔记(45)——添加游戏音效

1.需求分析&#xff1a; 截至目前&#xff0c;我们仍然在一个无声的世界游玩游戏&#xff0c;所以有必要为游戏增添一些声音&#xff0c;例如开火声&#xff0c;子弹撞击声等等。 2.操作实现&#xff1a; 1.这是一个较为简单的功能&#xff0c;类似特效的实现方法&#xff0c…...

202472读书笔记|《首先你要快乐,其次都是其次》——快乐至上,允许一切发生

202472读书笔记|《首先你要快乐&#xff0c;其次都是其次》——快乐至上&#xff0c;允许一切发生 《首先你要快乐&#xff0c;其次都是其次》作者林小仙&#xff0c;挺轻松的小漫画&#xff0c;清新的文字。 生而为人&#xff0c;我很抱歉&#xff0c;大可不必。 生活已经很难…...

8.STL中Vector容器的常见操作(附习题)

目录 1.vector的介绍 2 vector的使用 2.1 vector的定义 2.2 vector iterator 的使用 2.3 vector 空间增长问题 2.3 vector 增删查改 2.4 vector 迭代器失效问题 2.5 vector 在OJ中的使用 1.vector的介绍 vector是表示可变大小数组的序列容器。 就像数组一样&#xff0…...

5.23小结

1.java项目创新 目前想添加一个自动回复的功能和设置验证方式有&#xff08;允许任何人添加&#xff0c;禁止添加&#xff0c;设置回答问题添加&#xff0c;普通验证添加&#xff09; 目前只完成画好前端界面&#xff0c;前端发送请求&#xff0c;还有表的修改 因为涉及表字…...

文心一言 VS 讯飞星火 VS chatgpt (265)-- 算法导论20.1 4题

四、假设不使用一棵叠加的度为 u \sqrt{u} u ​ 的树&#xff0c;而是使用一棵叠加的度为 u 1 k u^{\frac{1}{k}} uk1​的树&#xff0c;这里 k 是大于 1 的常数&#xff0c;则这样的一棵树的高度是多少&#xff1f;又每个操作将需要多长时间&#xff1f;如果要写代码&#xf…...

Flutter 中的 EditableText 小部件:全面指南

Flutter 中的 EditableText 小部件&#xff1a;全面指南 在Flutter中&#xff0c;EditableText是一个低级别的文本编辑组件&#xff0c;它提供了构建自定义文本编辑界面的能力。与TextField和TextFormField不同&#xff0c;EditableText提供了更多的灵活性&#xff0c;允许开发…...

H800基础能力测试

H800基础能力测试 参考链接A100、A800、H100、H800差异H100详细规格H100 TensorCore FP16 理论算力计算公式锁频安装依赖pytorch FP16算力测试cublas FP16算力测试运行cuda-samples 本文记录了H800基础测试步骤及测试结果 参考链接 NVIDIA H100 Tensor Core GPU Architecture…...

2024/5/24 Day38 greedy 435. 无重叠区间 763.划分字母区间 56. 合并区间

2024/5/24 Day38 greedy 435. 无重叠区间 763.划分字母区间 56. 合并区间 遇到两个维度权衡的时候&#xff0c;一定要先确定一个维度&#xff0c;再确定另一个维度。如果两个维度一起考虑一定会顾此失彼。 重叠区间问题 435. 无重叠区间 题目链接 435 给定一个区间的集合 i…...

【python】使用函数名而不加括号是什么情况?

使用函数名而不加括号通常是为了表示对函数本身的引用&#xff0c;而不是调用函数。这种用法通常出现在下面这几种情况&#xff1a; 作为回调函数传递&#xff1a;将函数名作为参数传递给其他函数&#xff0c;以便在需要时调用该函数。例如&#xff0c;在事件处理程序或高阶函数…...

全文检索ElasticSearch简介

1 全文检索 1.1 什么是全文检索 全文检索是一种通过对文本内容进行全面索引和搜索的技术。它可以快速地在大量文本数据中查找包含特定关键词或短语的文档,并返回相关的搜索结果。全文检索广泛应用于各种信息管理系统和应用中,如搜索引擎、文档管理系统、电子邮件客户端、新闻…...

Github上传时报错The file path is empty的解决办法

问题截图 文件夹明明不是空的&#xff0c;却怎么都上传不上去。 解决方案&#xff1a; 打开隐藏文件的开关&#xff0c;删除原作者的.git文件 如图所示&#xff1a; 上传成功&#xff01;...

Adobe Bridge BR v14.0.3 安装教程 (多媒体文件组织管理工具)

Adobe系列软件安装目录 一、Adobe Photoshop PS 25.6.0 安装教程 (最流行的图像设计软件) 二、Adobe Media Encoder ME v24.3.0 安装教程 (视频和音频编码渲染工具) 三、Adobe Premiere Pro v24.3.0 安装教程 (领先的视频编辑软件) 四、Adobe After Effects AE v24.3.0 安装…...

嵌入式学习——3——TCP-UDP 数据交互,握手,挥手

1、更新源 cd /etc/apt/ sudo cp sources.list sources.list.save 将原镜像备份 sudo vim sources.list 将原镜像修改成阿里源/清华源&#xff0c;如所述 阿里源 deb http://mirrors.aliyun.com/ubuntu/ bionic main …...

【LeetCode】【3】无重复字符的最长子串(1113字)

文章目录 [toc]题目描述样例输入输出与解释样例1样例2样例3 提示Python实现滑动窗口 个人主页&#xff1a;丷从心 系列专栏&#xff1a;LeetCode 刷题指南&#xff1a;LeetCode刷题指南 题目描述 给定一个字符串s&#xff0c;请你找出其中不含有重复字符的最长子串的长度 样…...

溪谷联运SDK功能全面解析

近期&#xff0c;备受用户关注的手游联运10.0.0版本上线了&#xff0c;不少用户也选择了版本更新&#xff0c;其中也再次迎来了SDK的更新。溪谷软件和大家一起盘点一下溪谷SDK的功能都有哪些吧。 一、溪谷SDK具有完整的运营功能和高度扩展性 1.登录&#xff1a;登录是SDK最基础…...

Vitis HLS 学习笔记--控制驱动TLP - Dataflow视图

目录 1. 简介 2. 功能特性 2.1 Dataflow Viewer 的功能 2.2 Dataflow 和 Pipeline 的区别 3. 具体演示 4. 总结 1. 简介 Dataflow视图&#xff0c;即数据流查看器。 DATAFLOW优化属于一种动态优化过程&#xff0c;其完整性依赖于与RTL协同仿真的完成。因此&#xff0c;…...

蓝桥杯物联网竞赛_STM32L071KBU6_关于sizo of函数产生的BUG

首先现象是我在用LORA发送信息的时候&#xff0c;左边显示长度是8而右边接收到的数据长度却是4 我以为是OLED显示屏坏了&#xff0c;又或者是我想搞创新用了const char* 类型强制转换数据的原因&#xff0c;结果发现都不是 void Function_SendMsg( unsigned char* data){unsi…...

Wpf 使用 Prism 实战开发Day22

客户端添加IDialogService 弹窗服务 在首页点击添加备忘录或待办事项按钮的时候&#xff0c;希望有一个弹窗&#xff0c;进行相对应的内容添加操作。 一.在Views文件夹中&#xff0c;再创建一个Dialog 文件夹&#xff0c;用于放置备忘录和待办事项的弹窗界面。 1.1 备忘录&…...

遍历列表

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 遍历列表中的所有元素是常用的一种操作&#xff0c;在遍历的过程中可以完成查询、处理等功能。在生活中&#xff0c;如果想要去商场买一件衣服&#…...

创建vue工程、Vue项目的目录结构、Vue项目-启动、API风格

环境准备 介绍&#xff1a;create-vue是Vue官方提供的最新的脚手架工具&#xff0c;用于快速生成一个工程化的Vue项目create-vue提供如下功能&#xff1a; 统一的目录结构 本地调试 热部署 单元测试 集成打包依赖环境&#xff1a;NodeJS 安装NodeJS 一、 创建vue工程 npm 类…...

为了更全面地分析开发人员容易被骗的原因和提供更加深入的防范措施

为了更全面地分析开发人员容易被骗的原因和提供更加深入的防范措施&#xff0c;我们可以进一步探讨以下几个方面&#xff1a; 深入技术细节 不安全的代码注释和文档&#xff1a; 原因&#xff1a;开发人员在代码注释中可能会无意间透露敏感信息&#xff0c;如API密钥、密码或系…...

虹科Pico汽车示波器 | 免拆诊断案例 | 2020款奔驰G350车行驶中急加速时发动机抖动

故障现象  一辆2020款奔驰G350车&#xff0c;搭载264 920 发动机&#xff0c;累计行驶里程约为2.8万km。车主反映&#xff0c;行驶中急加速超车时发动机抖动&#xff0c;同时发动机故障灯闪烁&#xff0c;发动机加速无力。 故障诊断 接车后反复试车发现&#xff0c;故障只在…...

大模型落地竞逐,云计算大厂“百舸争流”

作者 | 辰纹 来源 | 洞见新研社 从ChatGPT到Sora&#xff0c;从图文到视频&#xff0c;从通用大模型到垂直大模型……经过了1年多时间的探索&#xff0c;大模型进入到以落地为先的第二阶段。 行业的躁动与资本的狂热相交汇&#xff0c;既造就了信仰派的脚踏实地&#xff0c;也…...

物体检测算法-R-CNN,SSD,YOLO

物体检测算法-R-CNN&#xff0c;SSD&#xff0c;YOLO 1 R-CNN2 SSD3 Yolo总结 1 R-CNN R-CNN&#xff08;Region-based Convolutional Neural Network&#xff09;是一种基于区域的卷积神经网络&#xff0c;是第一个成功将深度学习应用到目标检测上的算法。它主要由三个步骤组…...

区块链开发:区块链软件开发包装相关解析

区块链开发是指设计、构建和维护基于区块链技术的应用程序或系统的过程。区块链是一种分布式账本技术&#xff0c;它通过去中心化的方式记录和验证数据&#xff0c;确保数据的透明性、不可篡改性和安全性。区块链开发者使用各种编程语言和框架来创建这些应用程序。 在加密货币领…...

一个月速刷leetcodeHOT100 day07 轮转数组 除自身以外的乘积 找到字符串中所有字母异位词

轮转数组 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: […...