GO语言中Redis的相关知识记录
mhr18 2024-11-24 18:59 20 浏览 0 评论
最近看到这个github.com/go-redis/redis/v8已经更新了,今天下载下来用用
这里分享一个关于redis实战的书籍,分享链接,可以查底下留言获取
安装Redis包
go get github.com/go-redis/redis/v8
由于这个`v8`版本,使用了`context`这个包,`context`这个包是做什么的呢?
这个包提供上下文机制在`goroutine`之间传递`deadline`,`取消信号 `
或其请求相关的信息,其实说白了就是,如何优雅的管理`goroutine`
context包基本使用
//服务器会为每个程序创建一个根Context实例,
//goroutine接受根context的一个派生Context对象
//goroutine通过 context.Done()方法监听取消信号
//例子,WithCancel()的使用
//如何优雅地关闭一个goroutine
package main
import (
"context"
"fmt"
"time"
)
func f1(ctx context.Context) {
LOOPUP:
for {
fmt.Println("我在执行")
time.Sleep(time.Second)
//这里是使用select监听通道,如果发现ctx.done()中有值,则直接跳出循环
select {
case <-ctx.Done():
break LOOPUP
default:
}
}
}
func main() {
//创建一个取消信号的根context实例
ctx,cancelFunc :=context.WithCancel(context.Background())
go f1(ctx)
time.Sleep(time.Second*5)
//运行5秒后,发送退出信号
cancelFunc()
}
//也可以使用WithDeadline() 指定到期时间触发
nowtime :=time.Now().Add(time.Second*3) //当前时间+3秒
//3秒后停止
//这里的时间是一个time类型
ctx,_:=context.WithDeadline(context.Background(),nowtime)
go f1(ctx)
//也可以指定WithTimeout(),在多少秒后执行退出
//这里的时间是一个time.Duration类型,用法一样
func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc)
redis的基本操作
以下的命令只是简单演示几个常用的,redis里的命令,这个包都是支持的
创建Redis连接
package main
import (
"context"
"fmt"
"github.com/go-redis/redis/v8"
)
//定义一个根context对象
var ctx=context.Background()
var rdb *redis.Client
//创建连接对象,底层是使用的链接池
func init() {
rdb =redis.NewClient(&redis.Options{
Addr: "127.0.0.1:6379",
Password: "",
DB: 0,
})
}
字符串操作
//这里封装了一个函数,这里是基本的操作,别的命令都可以按这种写法实现
func redisString() {
//设置值
err :=rdb.Set(ctx,"set1","name1",0).Err()
fmt.Println(err)
//获取值
vaule ,_:=rdb.Get(ctx,"set1").Result()
fmt.Println("值是,",vaule)
//删除 删除成功 n>0
n,err :=rdb.Del(ctx,"set1").Result()
fmt.Println("删除,",n,err)
}
Hash操作
//hash操作
func redisHash() {
//写入数据
//第一种写法
err:=rdb.HSet(ctx,"hash1","name","tom","age",18).Err()
//第二种
err =rdb.HSet(ctx,"hash2",map[string]interface{}{"name":"tom2","age":18}).Err()
//第三种也可以使用切片来传入,但是值得是一样的类型
err =rdb.HSet(ctx,"hash3",[]string{"name","tome3","age","182"}).Err()
//获取值
res,_:=rdb.HGet(ctx,"hash1","name").Result()
fmt.Println(res)
//获取所有的信息 值
var reslutl map[string]string
reslutl,err=rdb.HGetAll(ctx,"hash2").Result()
fmt.Println(reslutl,err)
n,_:=rdb.HLen(ctx,"hash2").Result()
fmt.Println("key的数量",n)
}
Lists列表操作
//可以使用列表实现,队列或栈的操作,也可以使用brpop或blpop实现阻塞队列,这里就不写了
func redisLists() {
//向列表添加值
//err :=rdb.LPush(ctx,"list1","name1","name2","name3").Err()
//fmt.Println(err)
//查看列表中的元素
var result []string
result,_ =rdb.LRange(ctx,"list1",0,-1).Result()
fmt.Println("列表元素的值",result)
//弹出元素
res,err :=rdb.LPop(ctx,"list1").Result()
fmt.Println("弹出的元素",res,err)
}
Set集合
//set集合,这个可以抽奖,去重等操作
func redisSet() {
//向集合里添加数据
//err :=rdb.SAdd(ctx,"set11","mem1","mem2","mem3").Err()
//err =rdb.SAdd(ctx,"set22","mem2","mem3","mem4").Err()
var res []string
//查看元素
res,_=rdb.SMembers(ctx,"set11").Result()
fmt.Println("查看元素",res)
//查看元素个数
n,_:=rdb.SCard(ctx,"set11").Result()
fmt.Println("查看元素个数",n)
//取交集
res ,_=rdb.SInter(ctx,"set11","set22").Result()
fmt.Println("交集",res)
//取并集
res ,_ =rdb.SDiff(ctx,"set11","set22").Result()
fmt.Println("并集",res)
//取全集
res,_=rdb.SUnion(ctx,"set11","set22").Result()
fmt.Println("全集",res)
//删除指定元素
n,err :=rdb.SRem(ctx,"set11","mem1").Result()
fmt.Println(n,err)
//随机弹出
str:=rdb.SPop(ctx,"set22").Err()
fmt.Println(str)
}
Zset有序集合操作
//这个比较麻烦点,但是不难
func redisZset() {
//添加带分数的元素
//err :=rdb.ZAdd(ctx,"zset1",&redis.Z{Score: 50,Member: "tom1"},&redis.Z{Score: 60,Member: "tom2"}, &redis.Z{Score: 70,Member: "tom3"},&redis.Z{Score: 70,Member: "tom4"}).Err()
//_=rdb.ZAdd(ctx,"zset2",&redis.Z{Score: 100,Member: "tom4"},&redis.Z{Score: 90,Member: "tom5"},&redis.Z{Score: 85,Member: "tom6"}).Err()
//fmt.Println(err)
//查看集合里的元素
//var res []string
//res ,_ =rdb.ZRange(ctx,"zset1",0,-1).Result()
////参数,通过分数查询
//res,_=rdb.ZRangeByScore(ctx,"zset1",&redis.ZRangeBy{
//Min: "0",
//Max: "90",
//Offset: 0,
//Count: 0,
//}).Result()
//fmt.Println(res)
//var res2 []redis.Z
////带分数查询
//res2,_=rdb.ZRangeArgsWithScores(ctx,redis.ZRangeArgs{
//Key: "zset1",
//Start: 0,
//Stop: -1,
//ByScore: false,
//ByLex: false,
//Rev: true,
//Offset: 0,
//Count: 0,
//}).Result()
//fmt.Println("集合中的元素",res2)
//交集
var res []string
res ,_ =rdb.ZInter(ctx,&redis.ZStore{
Keys: []string{"zset1","zset2"},
Weights: nil,
Aggregate: "min",//这里 取值有,sum,min,max
}).Result()
fmt.Println("交集的数据",res)
var res2 []redis.Z
res2 ,_ =rdb.ZInterWithScores(ctx,&redis.ZStore{
Keys: []string{"zset1","zset2"},
Weights: nil,
Aggregate: "max",//取交集分值大的那个值
}).Result()
fmt.Println("交集带分数的数据",res2)
//并集
res,_=rdb.ZDiff(ctx,"zset1","zset2").Result()
fmt.Println("并集",res)
}
PS:
这里只是列出了常用的基本数据结构,还有些别的命令没有写,比如关于地理位置的Geo,和bitmaps和redis事务,在这个包中都是支持的,由于篇幅有 限,这里就不写了
如果有需要redis场景实战的pdf,可以查看评论区的留言
- 上一篇:Go语言如何操作Redis
- 下一篇:Go和Redis实现分布式锁
相关推荐
- 【推荐】一个开源免费、AI 驱动的智能数据管理系统,支持多数据库
-
如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!.前言在当今数据驱动的时代,高效、智能地管理数据已成为企业和个人不可或缺的能力。为了满足这一需求,我们推出了这款开...
- Pure Storage推出统一数据管理云平台及新闪存阵列
-
PureStorage公司今日推出企业数据云(EnterpriseDataCloud),称其为组织在混合环境中存储、管理和使用数据方式的全面架构升级。该公司表示,EDC使组织能够在本地、云端和混...
- 对Java学习的10条建议(对java课程的建议)
-
不少Java的初学者一开始都是信心满满准备迎接挑战,但是经过一段时间的学习之后,多少都会碰到各种挫败,以下北风网就总结一些对于初学者非常有用的建议,希望能够给他们解决现实中的问题。Java编程的准备:...
- SQLShift 重大更新:Oracle→PostgreSQL 存储过程转换功能上线!
-
官网:https://sqlshift.cn/6月,SQLShift迎来重大版本更新!作为国内首个支持Oracle->OceanBase存储过程智能转换的工具,SQLShift在过去一...
- JDK21有没有什么稳定、简单又强势的特性?
-
佳未阿里云开发者2025年03月05日08:30浙江阿里妹导读这篇文章主要介绍了Java虚拟线程的发展及其在AJDK中的实现和优化。阅前声明:本文介绍的内容基于AJDK21.0.5[1]以及以上...
- 「松勤软件测试」网站总出现404 bug?总结8个原因,不信解决不了
-
在进行网站测试的时候,有没有碰到过网站崩溃,打不开,出现404错误等各种现象,如果你碰到了,那么恭喜你,你的网站出问题了,是什么原因导致网站出问题呢,根据松勤软件测试的总结如下:01数据库中的表空间不...
- Java面试题及答案最全总结(2025版)
-
大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Sprin...
- 数据库日常运维工作内容(数据库日常运维 工作内容)
-
#数据库日常运维工作包括哪些内容?#数据库日常运维工作是一个涵盖多个层面的综合性任务,以下是详细的分类和内容说明:一、数据库运维核心工作监控与告警性能监控:实时监控CPU、内存、I/O、连接数、锁等待...
- 分布式之系统底层原理(上)(底层分布式技术)
-
作者:allanpan,腾讯IEG高级后台工程师导言分布式事务是分布式系统必不可少的组成部分,基本上只要实现一个分布式系统就逃不开对分布式事务的支持。本文从分布式事务这个概念切入,尝试对分布式事务...
- oracle 死锁了怎么办?kill 进程 直接上干货
-
1、查看死锁是否存在selectusername,lockwait,status,machine,programfromv$sessionwheresidin(selectsession...
- SpringBoot 各种分页查询方式详解(全网最全)
-
一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...
- 《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略
-
《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...
- LoadRunner(loadrunner录制不到脚本)
-
一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...
- Redis数据类型介绍(redis 数据类型)
-
介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...
- RMAN备份监控及优化总结(rman备份原理)
-
今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)