goredis常见基础命令

news2025/2/24 12:28:12

基本操作

//删除键
exists,err:= rdb.Exists(ctx,"key").Result()
if err!=nil{
	panic(err)
}
if exists>0{
	err = rdb.Del(ctx,"key").Err()
	if err!=nil{
		panic(err)
	}
}

string类型

//设置一个键值对
//0表示没有过期时间
err:=rdb.Set(ctx,"key1","value1",0).Err()

//根据key获取value
value,err:=rdb.Get(ctx,"key1").Result()

//设置一个key的值,并返回这个key的旧值
oldVal,err:=rdb.GetSet(ctx,"key1","newVal").Result()

//如果key不存在,则设置这个key的值
err:=rdb.setNX(ctx,"key2","value2",0).Err()

//批量查询key的值
vals,err:=rdb.MGet(ctx,"key1","key2").Result()

//批量设置key的值
err := rdb.MSet(ctx,"key1","value1","key2","value2").Err()

//针对一个key的数值进行递增操作,每次加1
val,err:=rdb.Incr(ctx,"key").Result()

//IncrBy函数,可以指定每次递增多少
valBy,err:=rdb.IncrBy(ctx,"key",2).Result()

//IncrByFloat函数,可以指定每次增长多少,加的是浮点数
valFloat,err := rdb.IncrByFloat(ctx,"key1",2.2).Result()

//递减1
val,err := rdb.Decr(ctx,"key",2).Result()

//递减指定的值
valBy,err:=rdb.DecrBy(ctx,"key",2).Result()

//删除key
rdb.Del(ctx,"key")

//删除多个key
err:=rdb.Del(ctx,"key1","key2","key3").Err()

//设置过期时间
rdb.Expire(ctx,"key",2*time.Second)

Hash类型

//设置字段值
//添加重复的字段不会报错,只会覆盖
err:=rdb.HSet(ctx,"user_1","username","zhang").Err()

//查询字段值
username,err:=rdb.HGet(ctx,"user_1","username").Result()

//查询全部字段和值
data,err:=rdb.HGetAll(ctx,"user_1").Result()
//data是一个map类型,使用循环迭代输出
for field,val:=range data{
	fmt.Println(filed,val)
}

//根据key和field字段,累加字段的数值
count, err := rdb.HIncrBy(ctx, "user_1", "count", 2).Result()
if err != nil {
	panic(err)
}
fmt.Println(count)

//返回字段所有字段名
//keys是一个string数组
keys, err := rdb.HKeys(ctx, "user_1").Result()
if err != nil {
	panic(err)
}
fmt.Println(keys)

//查询字段数量
size, err := rdb.HLen(ctx, "user_1").Result()
if err != nil {
	panic(err)
}
fmt.Println(size)

//查询多个字段值
//vals是一个数组
vals, err := rdb.HMGet(ctx, "user_1", "username", "count").Result()
if err != nil {
	panic(err)
}
fmt.Println(vals)

//批量设置字段值
data := make(map[string]interface{})
data["id"] = 1
data["username"] = "li"
//一次性保存多个hash字段值
err := rdb.HMSet(ctx, "key", data).Err()
if err != nil {
	panic(err)
}

//如果field字段不存在,则设置hash的值
err := rdb.HSetNX(ctx, "key", "id", 100).Err()
if err != nil {
	panic(err)
}

//删除字段
//删除不存在的字段不会报错
rdb.HDel(ctx, "key", "id")
//删除多个字段
rdb.HDel(ctx, "key", "id", "username")

//检测字段名是否存在
f, err := rdb.HExists(ctx, "key", "id").Result()
if err != nil {
	panic(err)
}
if f {
	fmt.Println("存在")
} else {
	fmt.Println("不存在")
}

List

//插入一个数据
rdb.LPush(ctx, "key", "data1")

//LPush支持一次插入任意个数据
err := rdb.LPush(ctx, "key", 1, 2, 3, 4, 5).Err()

//当列表存在时才从左边插入插入
err := rdb.LPushX(ctx, "key", "sss").Err()

//从列表的右边删除第一个数据,并返回删除的数据
val, err := rdb.RPop(ctx, "key").Result()
fmt.Println(val)

//从右边插入数据
rdb.RPush(ctx, "key", "data1")

//一次插入多个数据
err := rdb.RPush(ctx, "key", 1, 2, 3, 4, 5).Err()

//当列表存在时从右边插入数据
err := rdb.RPushX(ctx, "key", "rVal").Err()

//从列表的左边删除第一个数据,并返回
val, err := rdb.LPop(ctx, "key").Result()
fmt.Println(val)

//返回列表的长度
val, err := rdb.LLen(ctx, "key").Result()
fmt.Println(val)

//返回列表一个范围内的数据
//0到-1就是全部
vals, err := rdb.LRange(ctx, "key", 0, -1).Result()
fmt.Println(vals)

//从列表的左边开始,删除第一个100
del, err := rdb.LRem(ctx, "key", 1, 100).Result()
fmt.Println(del)

//如果有多个100,则从左边开始,删除前两个100
rdb.LRem(ctx, "key", 2, 100)

//如果存在多个100,则从右边开始删除2个100
//第二个参数表示从右边开始删除几个等于100得元素
rdb.LRem(ctx, "key", -2, 100)

//如果存在多个100,第二个参数为0,表示删除所有元素等于100得数据
rdb.LRem(ctx, "key", 0, 100)

//根据索引查找对应元素,索引从0开始
val, err := rdb.LIndex(ctx, "key", 5).Result()

//在列表中元素为5的前边加入4
err := rdb.LInsert(ctx, "Key", "before", 5, 4).Err()

//只留下索引是0到2的
rdb.LTrim(ctx, "key1", 0, 2)

Set

无序集合元素不能重复

//添加100到集合中
err := rdb.SAdd(ctx, "key", 100).Err()
if err != nil {
	panic(err)
}

//将100,200,300添加到集合中
//向集合中添加已经存在的元素将会报错
rdb.SAdd(ctx, "key", 100, 200, 300)

//获取大小
size, err := rdb.SCard(ctx, "key").Result()
if err != nil {
	panic(err)
}
fmt.Println(size)

//判断元素是否存在
ok, _ := rdb.SIsMember(ctx, "key", 100).Result()
if ok {
	fmt.Println("存在")
}

//获取所有元素
es, _ := rdb.SMembers(ctx, "key").Result()
fmt.Println(es)

//删除集合元素
//删除不存在的元素不会报错
rdb.SRem(ctx, "key", 100)

//删除多个
rdb.SRem(ctx, "key", 200, 300)

//随机返回集合中的元素,并删除
//val是随机删除的元素
val, _ := rdb.SPop(ctx, "key").Result()
fmt.Println(val)

//随机删除多个
vals, _ := rdb.SPopN(ctx, "key", 3).Result()
fmt.Println(vals)

sorted set/zset

它为每个成员关联了一个分数(score),这个分数被用来对集合中的成员进行排序。虽然成员必须是唯一的,但是分数可以重复

l1 := redis.Z{
	Score:  1.0,
	Member: "zhang",
}
//添加元素,如果元素存在,则更新分数
err := rdb.ZAdd(ctx, "key", l1).Err()
if err != nil {
	panic(err)
}
err = rdb.ZAdd(ctx, "key", redis.Z{3.8, "zhang"}).Err()
if err != nil {
	panic(err)
}

//返回元素个数
size, err := rdb.ZCard(ctx, "key").Result()
if err != nil {
	panic(err)
}
fmt.Println(size)

//统计某个范围的元素个数
//范围[1,5]
size, err = rdb.ZCount(ctx, "key", "1", "5").Result()
if err != nil {
	panic(err)
}
fmt.Println(size)

// 如果加上( 则表示大于或者小于,相当于去掉了等于关系。
size, err = rdb.ZCount(ctx, "key", "(1", "5").Result()
if err != nil {
	panic(err)
}
fmt.Println(size)

//增加元素分数
rdb.ZIncrBy(ctx, "key", 2, "zhang")

//返回全部数据
//元素按分数从小到大
vals, err := rdb.ZRange(ctx, "key", 0, -1).Result()
if err != nil {
	panic(err)
}
for _, val := range vals {
	fmt.Println(val)
}

//ZRevRange的结果是按分数从大到小排序
//根据分数范围返回集合元素,元素根据分数从小到大排序,支持分页
//初始化查询条件
op := redis.ZRangeBy{
	"1",
	"10",
	0, // 类似sql的limit, 表示开始偏移量
	5, // 一次返回多少数据
}
vals, err = rdb.ZRangeByScore(ctx, "key", &op).Result()
if err != nil {
	panic(err)
}
for _, val := range vals {
	fmt.Println(val)
}

// ZRevRangeByScore用法类似ZRangeByScore,区别是元素根据分数从大到小排序。

//返回元素和分数
vals, err = rdb.ZRangeByScoreWithScores(ctx, "key", &op).Result()
if err != nil {
	panic(err)
}
for _, val := range vals {
	fmt.Println(val.Member)
	fmt.Println(val.Score)
}

//删除集合元素
rdb.ZRem(ctx, "key", "zhang")

//删除多个
rdb.ZRem(ctx, "key", "li", "wang")

//根据索引范围删除元素
//删除第零个到第一个
rdb.ZRemRangeByRank(ctx, "key", 0, 1)

//根据范围删除元素,"("和")"可以使用
rdb.ZRemRangeByScore(ctx, "key", "2", "5")

//查询元素对应的分数
score, _ := rdb.ZScore(ctx, "key", "zhang").Result()
fmt.Println(score)

//根据元素名,查询集合元素在集合中的排名,从0开始,从小到大
rk, _ := rdb.ZRank(ctx, "key", "zhang").Result()
fmt.Println(rk)
//ZRevRank是按分数从大到小排序

发布订阅

可用于消息的传输

三个部分:发布者,订阅者,Channel(频道)

在这里插入图片描述

发布者和订阅者是redis客户端,channel是redis服务端,发布者将消息发送到某个频道,订阅这个频道的订阅者就能接收到这条消息

Subscribe

订阅channel

// 订阅channel1这个channel
sub := rdb.Subscribe(ctx, "channel1")
// sub.Channel() 返回go channel,可以循环读取redis服务器发过来的消息
for msg := range sub.Channel() {
	// 打印收到的消息
	fmt.Println(msg.Channel)
	fmt.Println(msg.Payload)
}
//或者
for {
	msg, err := sub.ReceiveMessage(ctx)
	if err != nil {
		panic(err)
	}
	fmt.Println(msg.Channel, msg.Payload)
}

publish

将消息发送给指定的channel

rdb.Publish(ctx,"channel1","message")

PSubscribe

用法跟Subscribe一样,区别是PSubscribe订阅通道(channel)支持模式匹配。

// 订阅channel1这个channel
sub := rdb.PSubscribe(ctx,"ch_user_*")
// 可以匹配ch_user_开头的任意channel

Unsubscribe

取消订阅

// 订阅channel1这个channel
sub := rdb.Subscribe(ctx,"channel1")
// 取消订阅
sub.Unsubscribe(ctx,"channel1")

PubSubNumSub

查询指定的channel有多少个订阅者

// 查询channel_1通道的订阅者数量
	chs, _ := rdb.PubSubNumSub(ctx, "channel_1").Result()
	for ch, count := range chs {
		fmt.Println(ch)    // channel名字
		fmt.Println(count) // channel的订阅者数量
	}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2304391.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux网络】序列化、守护进程、应用层协议HTTP、Cookie和Session

⭐️个人主页:小羊 ⭐️所属专栏:Linux 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 1、序列化和反序列化2、守护进程2.1 什么是进程组?2.2 什么是会话? 3、应用层协议HTTP3.1 HTTP协议3.2 HT…

system verilog的流操作符

流操作符&#xff0c;有分为操作对象是一整个数组和单独的数据两种&#xff0c;例如bit [7:0] a[4]和bit [31:0] b&#xff0c;前者操作对象是数组&#xff0c;后者是单独一个较大位宽的数。 流操作符有<<和>>&#xff0c;代表从右向左打包和从左向右打包。 打包的…

LLM2CLIP论文学习笔记:强大的语言模型解锁更丰富的视觉表征

1. 写在前面 今天分享的一篇论文《LLM2CLIP: P OWERFUL L ANGUAGE M ODEL U NLOCKS R ICHER V ISUAL R EPRESENTATION》&#xff0c; 2024年9月微软和同济大学的一篇paper&#xff0c; 是多模态领域的一篇工作&#xff0c;主要探索了如何将大模型融合到Clip模型里面来进一步提…

计算机毕业设计SpringBoot+Vue.jst网上超市系统(源码+LW文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

HTTP SSE 实现

参考&#xff1a; SSE协议 SSE技术详解&#xff1a;使用 HTTP 做服务端数据推送应用的技术 一句概扩 SSE可理解为&#xff1a;服务端和客户端建立连接之后双方均保持连接&#xff0c;但仅支持服务端向客户端推送数据。推送完毕之后关闭连接&#xff0c;无状态行。 下面是基于…

二分图检测算法以及最大匹配算法(C++)

上一节我们学习了有向图中的最大连通分量. 本节我们来学习二分图. 二分图是一种特殊的图结构, 能够帮助我们高效地解决这些匹配和分配问题. 本文将带你了解二分图的基本概念, 判定方法, 最大匹配算法以及实际应用场景. 环境要求 本文所用样例在Windows 11以及Ubuntu 24.04上面…

Keepalive基础

一。简介和功能 vrrp协议的软件实现&#xff0c;原生设计目的是为了高可用ipvs服务 功能&#xff1a; 1.基于vrrp协议完成地址流动 2.为vip地址所在的节点生成ipvs规则&#xff08;在配置文件中预先定义&#xff09; 3.为ipvs集群的各RS做健康状况检测 4.基于脚本调用接口…

计算机毕业设计SpringBoot+Vue.jst0图书馆管理系统(源码+LW文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

【Java消息队列】应对消息丢失、重复、顺序与积压的全面策略

应对消息丢失、重复、顺序与积压的全面策略 引言kafka消息丢失生产者消费者重复消费顺序消费消息积压生产者消费者其他RabbitMQ消息丢失生产者事务机制,保证生产者发送消息到 RabbitMQ Server发送方确认机制,保证消息能从交换机路由到指定队列保证消息在 RabbitMQ Server 中的…

【论文解读】TransMLA: Multi-Head Latent Attention Is All You Need

论文链接 1. 论文背景与问题动机 现代大规模语言模型&#xff08;LLM&#xff09;在推理时往往遇到通信瓶颈&#xff0c;主要原因在于自注意力机制中需要缓存大量的 Key-Value&#xff08;KV&#xff09;对。例如&#xff0c;对于 LLaMA‑65B 这种模型&#xff0c;即使采用 8…

登录-06.JWT令牌-生成和校验

一.JWT令牌的生成和校验 JWT令牌生成 想要生成JWT令牌&#xff0c;那么就要首先引入JWT令牌的相关依赖&#xff0c; <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.11.2</version>…

【Git】多人协作

文章目录 完成准备工作多人协作场景一场景二远程分支删除后&#xff0c;本地 git branch -a 依然能看到的解决办法 完成准备工作 在之前&#xff0c;我们所完成的工作如下&#xff1a; 基本完成 Git 的所有本地库的相关操作&#xff0c;git基本操作&#xff0c;分支理解&#…

邮件安全之发件人伪造

电子邮件工作原理 电子邮件传输过程中主要涉及到SMTP、IMAP、POP3三种协议&#xff0c;具体功能如下&#xff1a; SMTP:全称Simple Mail Transfer Protocol&#xff0c;即简单邮件传输协议&#xff0c;主要用于发送邮件&#xff0c;使用端口号25。 IMAP:全称Internet Mail Acce…

使用 AIStor 和 OpenSearch 增强搜索功能

在这篇文章中&#xff0c;我们将探讨搜索&#xff0c;特别是 OpenSearch 如何帮助我们识别模式或查看不断增长的数据中的趋势。例如&#xff0c;如果您正在查看运营数据&#xff0c;如果您的服务似乎是随机的&#xff0c;那么您需要尽可能回溯以识别模式并找出原因。这不仅适用…

【LLM】R1复现项目(SimpleRL、OpenR1、LogitRL、TinyZero)持续更新

note &#xff08;1&#xff09;未来的工作需亟待解决&#xff1a; 支持大规模 RL 训练&#xff08;PPO、GRPO 等&#xff09;的开源基础框架用于稳定训练的 GRPO 训练超参的自动化调优RL 训练数据的配比&#xff08;难度、领域、任务等&#xff09;基于 Instruct 模型训练 R…

买股票的最佳时机 - 2

买卖股票的最佳时机 III 题目描述&#xff1a; 提示&#xff1a; 1 < prices.length < 1050 < prices[i] < 105 分析过程&#xff1a; 写动态规划&#xff0c;我们需要考虑一下问题&#xff1a; 定义状态状态转移方程初始条件 遍历顺序 4种状态&#xff1a; …

Python基于flask的智慧交通可视化,大数据智慧交通数据可视化系统

博主介绍&#xff1a;✌程序员徐师兄、8年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战*✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447…

【Unity】鱼群效果模拟

鱼群效果模拟 文章目录 鱼群效果模拟Boid算法实现方式version1_CPUversion2_GPUversion3_Multilaterationversion4_Bitonic_Sorting &#xff08;GPU友好&#xff09;version5_Skinning &#xff08;TODO&#xff09; 细节项优化项参考链接 Boid算法 Boid算法是一种模拟群体行…

云图库平台(五)——后端图片模块开发

目录 一、需求分析二、库表设计三、图片的处理如何实现图片的上传和下载创建图片的业务流程如何对图片进行解析 四、创建并使用对象存储五、后端操作对象存储初始化客户端通用能力类文档上传文件下载 一、需求分析 管理员功能&#xff1a; 图片的上传和创建&#xff1a;仅管理…

postman调用ollama的api

按照如下设置&#xff0c;不需要设置key 保持长会话的方法 # 首次请求 curl http://localhost:11434/api/generate -d {"model": "deepseek-r1:32b","prompt": "请永久记住&#xff1a;110&#xff0c;1-12&#xff0c;之后所有数学计算必…