百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

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,可以查看评论区的留言

相关推荐

【推荐】一个开源免费、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、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...

取消回复欢迎 发表评论: