Go语言操作redis数据库的方法
来源:脚本之家
2023-01-07 12:04:03
0浏览
收藏
怎么入门Golang编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《Go语言操作redis数据库的方法》,涉及到goredis、数据库,有需要的可以收藏一下
先上命令速查网站,菜鸟yyds
https://www.runoob.com/redis/redis-strings.html
操作redis的包是go-redis/redis
官方文档 https://redis.uptrace.dev/guide/
github https://github.com/go-redis/redis
创建项目
创建test文件夹
创建 Redis_test.go 文件
直接上代码,代码解释全写在注释里
package test
import (
"context"
"encoding/json"
"fmt"
"github.com/go-redis/redis/v8"
"testing"
"time"
)
var ctx = context.Background()
var rdb *redis.Client
func init() {
rdb = redis.NewClient(&redis.Options{
// 端口需要改,这里是docker的端口
Addr: "localhost:49153",
Password: "redispw", // no password set
DB: 0, // use default DB
PoolSize:15,
MinIdleConns: 10, //在启动阶段创建指定数量的Idle连接,并长期维持idle状态的连接数不少于指定数量;。
//超时
//DialTimeout: 5 * time.Second, //连接建立超时时间,默认5秒。
//ReadTimeout: 3 * time.Second, //读超时,默认3秒, -1表示取消读超时
//WriteTimeout: 3 * time.Second, //写超时,默认等于读超时
//PoolTimeout: 4 * time.Second, //当所有连接都处在繁忙状态时,客户端等待可用连接的最大等待时长,默认为读超时+1秒。
})
}
// 基础使用
func Test_Base(t *testing.T) {
// 添加key
//0表示没有过期时间
rdb.Set(ctx, "testKey", "xxx", 0)
// 获取值
val, err := rdb.Get(ctx, "testKey").Result()
if err != nil {
fmt.Println("错误", err)
}
fmt.Println("值:", val)
// 设置key过期时间 成功true
rdb.Expire(ctx, "testKey", time.Second*60)
// 存在返回1
rdb.Exists(ctx, "testKey")
// key不存在时设置值
rdb.SetNX(ctx, "unkey", "val", 0)
rdb.Set(ctx, "testKey2", "xxx", 0)
// 删除key 可删除多个
rdb.Del(ctx, "testKey2", "testKey")
}
// 字符串
func Test_String(t *testing.T) {
// 设置值
rdb.Set(ctx, "strKey", 100, 0)
rdb.Set(ctx, "straey", 100, 0)
// key自增1
rdb.Incr(ctx, "strKey")
// 增加 66
rdb.IncrBy(ctx, "straey", 66)
// -1
rdb.Decr(ctx, "straey")
// -5
rdb.DecrBy(ctx, "straey", 5)
// 过期时间
rdb.TTL(ctx, "strKey")
// str*ey : *为任意字符串
// str[kKac]ey : 匹配[] 内的单个字符 strkey,strKey,straey,strcey
// str?ey : ? 任意单个字符
// 扫描key
iter := rdb.Scan(ctx, 0, "str?ey", 0).Iterator()
for iter.Next(ctx) {
fmt.Println("keys", iter.Val(), ": val", rdb.Get(ctx, iter.Val()).Val())
}
if err := iter.Err(); err != nil {
panic(err)
}
}
// 哈希
func Test_Hash(t *testing.T) {
rdb.HMSet(ctx,"hkey1","name","shushan","age",99,"b",true)
// 以结构体存入 注意redis tag
type User struct {
Name string `json:"name,omitempty" redis:"name"`
Age int `json:"age,omitempty" redis:"age"`
B bool `json:"b,omitempty" redis:"b"`
//...
}
user1 := User{
Name: "shushan2",
Age: 55,
B: true,
}
// 结构体序列化反序列化map 你也可以用其他包进行转化为map,但是注意转化后的键名大小写问题
m := make(map[string]interface{})
buf,_ := json.Marshal(user1)
_ = json.Unmarshal(buf,&m)
// 存入
rdb.HSet(ctx, "user4", m)
// 取出绑定到结构体 map也行
var user User
rdb.HGetAll(ctx,"user4").Scan(&user)
fmt.Printf(" %#v \n ",user)
// test.User{Name:"shushan2", Age:55, B:true}
// 获取key下的所有值 *匹配方式与string的所有原理一样
iter := rdb.HScan(ctx,"user4",0,"*",0).Iterator()
for iter.Next(ctx) {
fmt.Println("keys", iter.Val())
}
if err := iter.Err(); err != nil {
panic(err)
}
}
// 列表
func Test_List(t *testing.T) {
// 添加
rdb.LPush(ctx,"listKey1",111,222,333,444)
rdb.RPush(ctx,"listKey1",5555)
// 不存在不添加
rdb.LPushX(ctx,"unlistKey",111)
var intf []int
// 根据索引获取 绑定到数组
rdb.LRange(ctx,"listKey1",0,10).ScanSlice(&intf)
fmt.Println(intf)
var i int
// 弹出
rdb.LPop(ctx,"listKey1").Scan(&i)
fmt.Println(i)
//....
}
// 集合
func Test_Set(t *testing.T) {
// 添加
rdb.SAdd(ctx,"setKey1","m1","onlyk1")
rdb.SAdd(ctx,"setKey2","m2","xca")
sl,_:= rdb.SDiff(ctx,"setKey1","setKey2").Result()
fmt.Println(sl)
// onlyk1,m1
//随机移除
var val string
rdb.SPop(ctx,"setKey1").Scan(&val)
fmt.Println(val)
// .....
}
// 管道
func Test_Pipe(t *testing.T) {
// 官方描述
// Redis 管道允许客户端命令服务器通过执行任务而通过执行任务来提高您的性能。
// 在管道中,像命令命令一样将编写 + 使用命令来执行任务,并将其用于执行任务,执行任务不是一个地执行100个命令。
// 理解为命令就像石头,一次运送一个石头
// 使用管道等于 用车装石头 Exec 时就运送过去
pipe := rdb.Pipeline()
incr := pipe.Set(ctx, "pip_test","bt",0)
pipe.Expire(ctx, "pip_test", time.Hour)
// 提交
cmds, err := pipe.Exec(ctx)
if err != nil {
fmt.Println(err)
}
for _, cmd := range cmds {
fmt.Println(cmd.String())
}
// 该值得Exec提交后有效
fmt.Println(incr.Val())
}
其他操作都可以查看go-redis的源码或者直接打出rdb.命令,go-redis 的函数命名方式和redis的命令是差不多的
理论要掌握,实操不能落!以上关于《Go语言操作redis数据库的方法》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!
版本声明
本文转载于:脚本之家 如有侵犯,请联系study_golang@163.com删除
Go语言中Goroutine的设置方式
- 上一篇
- Go语言中Goroutine的设置方式
- 下一篇
- Go语言中序列化与反序列化示例详解
评论列表
-
- 知性的酸奶
- 这篇文章真是及时雨啊,大佬加油!
- 2023-02-09 10:42:18
-
- 壮观的云朵
- 很好,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢师傅分享技术贴!
- 2023-02-07 20:57:11
-
- 平淡的龙猫
- 太详细了,收藏了,感谢博主的这篇博文,我会继续支持!
- 2023-02-06 12:25:46
-
- 柔弱的鸡
- 感谢大佬分享,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢师傅分享文章!
- 2023-01-22 05:26:24
-
- 勤恳的火车
- 这篇文章内容真及时,楼主加油!
- 2023-01-17 04:47:17
-
- 典雅的镜子
- 这篇文章真是及时雨啊,很详细,赞 ??,已加入收藏夹了,关注up主了!希望up主能多写Golang相关的文章。
- 2023-01-12 23:27:22
-
- 虚拟的狗
- 太全面了,码起来,感谢大佬的这篇技术贴,我会继续支持!
- 2023-01-12 03:21:38
-
- 无辜的大船
- 这篇技术文章出现的刚刚好,太全面了,赞 ??,已收藏,关注up主了!希望up主能多写Golang相关的文章。
- 2023-01-10 09:12:47
查看更多
最新文章
-
- Golang · Go教程 | 4小时前 | 并发 · Go教程 · trace.NewTask go tool trace Go runtime/trace 执行跟踪 trace.WithRegion
- Go runtime/trace 怎样按任务标记跟踪区间
- 391浏览 收藏
-
- Golang · Go教程 | 5小时前 | flag · go · Go 命令行参数 flag.TextVar encoding.TextUnmarshaler
- Go flag.TextVar 怎样把自定义类型接入命令行
- 184浏览 收藏
-
- Golang · Go教程 | 6小时前 | 错误处理 · 模板 · Go教程 · html/template · 模板渲染 Go html/template missingkey 模板缺失字段 Execute错误
- Go html/template 缺失字段的严格渲染配置与错误处理
- 371浏览 收藏
-
- Golang · Go教程 | 6小时前 | html · go · 模板 · url · Go html/template 自动转义 URL上下文 template.URL
- Go html/template 怎样避免 URL 上下文误用
- 326浏览 收藏
-
- Golang · Go教程 | 6小时前 |
- Go text/template.ParseFS 怎样加载嵌入文件模板
- 208浏览 收藏
-
- Golang · Go教程 | 6小时前 |
- Go database/sql.NamedArg 怎样给 SQL 参数命名
- 311浏览 收藏
-
- Golang · Go教程 | 7小时前 | HTTP · go · Gin · Gin ShouldBindBodyWith 请求体重复绑定 ShouldBind binding.JSON
- Gin ShouldBindBodyWith 怎么让同一个请求体绑定两次
- 134浏览 收藏
-
- Golang · Go教程 | 8小时前 | go · 文件系统 · Go os.ReadDir Go File.ReadDir Go DirEntry Go 目录遍历
- Go os.ReadDir 怎样高效读取目录条目
- 269浏览 收藏
-
- Golang · Go教程 | 8小时前 | go · Go go/types.Config Go Importer Go 类型检查 types.Check
- Go go/types.Config 怎样给类型检查接入导入器
- 222浏览 收藏
-
- Golang · Go教程 | 8小时前 |
- Go maphash.Hash 怎样用固定种子复现哈希结果
- 341浏览 收藏
-
- Golang · Go教程 | 8小时前 | Go 字节切片 encoding/binary AppendByteOrder
- Go binary.ByteOrder.Append 怎样把整数追加到现有字节切片
- 373浏览 收藏
-
- Golang · Go教程 | 8小时前 | go · IPv6 Go ipv4 netip.ParsePrefix CIDR
- Go netip.ParsePrefix 怎样解析 CIDR 字符串
- 334浏览 收藏
查看更多
课程推荐
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
查看更多
AI推荐
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 566次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 608次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 637次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 595次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 416次使用
查看更多
相关文章
-
- MySQL 明明加了索引,为什么查询还是很慢?先查这 6 个点
- 2026-06-27 374浏览
-
- 接口返回的数据和数据库不一致怎么办?按数据生命周期排查
- 2026-06-27 398浏览
-
- Golang 实现Redis 协议解析器的解决方案
- 2022-12-23 109浏览
-
- go+redis实现消息队列发布与订阅的详细过程
- 2023-01-07 161浏览
-
- go实现Redis读写分离示例详解
- 2022-12-30 319浏览

