redis在go语言中的使用

news2024/11/15 12:26:58

redis在go语言中的使用

以下说明以读者有redis基础的前提下进行

未学习redis的可以到b站1小时浅学redis了解大概,学会如何使用

【GeekHour】一小时Redis教程_哔哩哔哩_bilibili

以下开发环境以windows为测试环境,旨在练习redis在go语言中的使用

redis使用的是5.0.14的windows版本(正常开发项目redis都是在linux上使用,windows的redis版本很低),但基础功能都有,满足学习要求;

下载链接:https://github.com/tporadowski/redis/releases
(官网是没有windows版本的)

下载完成后,打开黑窗口,输入redis-cli显示

image-20240217171150476

即为成功,可以选择性下载redis的gui工具redisInsight,官网链接:

RedisInsight | The Best Redis GUI

使用时截图:

image-20240217171350265

左侧会显示key,点击后右侧会显示value的值,使用和查找起来较为方便,能够增加学习效率,当然还有很多功能,这里就不赘述

1引入go-redis库

为什么使用这个库,而不是其他的库呢?

理由:

  1. 性能高效: Go-Redis实现了高性能的Redis客户端,具有低延迟和高吞吐量。它采用了异步的方式处理多个并发请求,从而提高了性能。
  2. 完整支持Redis功能: Go-Redis库提供了对Redis的全面支持,包括对基本数据结构(字符串、哈希、列表、集合等)的操作,事务,流水线(pipeline)等功能。
  3. 易用性: Go-Redis提供了简单而直观的API,易于使用。它封装了与Redis的底层通信细节,使得开发者可以专注于业务逻辑而不必过多关注底层实现。
  4. 连接池: Go-Redis包含了连接池的支持,这有助于有效地管理和复用与Redis的连接,减少了连接的创建和销毁开销,提高了性能。
  5. Active development和社区支持: Go-Redis是一个活跃的项目,有一个庞大的社区支持。这意味着它经常得到更新和改进,并且有丰富的文档和社区资源可供参考。
  6. 灵活性: Go-Redis允许开发者选择不同的执行模式,如同步、异步和流水线,以满足不同场景下的需求。

总之,这个库用的人多,并且功能齐全,很适合在go语言中与redis交互;(好用就完事了!!!)

2在go项目中的初始化

其实很简单,和mysql初始化优点相似;

为了方便学习,初始化都写在一个文件中

如下:

package main

import (
	"fmt"
	"github.com/go-redis/redis/v8"
	"context"
)

func main() {
	// 创建一个新的Redis客户端实例
	client := redis.NewClient(&redis.Options{
		Addr:     "localhost:6379", // Redis服务器地址
		Password: "",               // 可选:如果有密码的话
		DB:       0,                // 使用的数据库编号
	})

	// 使用Ping测试连接
	pong, err := client.Ping(context.Background()).Result()
	if err != nil {
		fmt.Println("连接Redis出错:", err)
		return
	}
	fmt.Println("连接成功,Ping结果:", pong)

	// 在程序结束时关闭连接
	defer client.Close()
	
	// 在这里可以继续执行其他与Redis相关的操作
}
测试运行成功会输出:
连接成功,Ping结果: PONG 


基础键值对相关操作

在go中简单设置键值对并查找键值对

简单设置一个键值对,来试试是否能够查找成功:

在go中设置key方法:Set
// 生成测试用的key
testKey := "test_key"
// 设置key的值,演示Set方法

err = client.Set(context.Background(), testKey, "Hello, Redis!", 0).Err()
if err != nil {
    fmt.Println("设置key出错:", err)
    return
}
fmt.Println("设置key成功")
//解释:
//通过创建testKey变量,你定义了一个测试用的键。

//使用client.Set方法设置了键test_key的值为字符串"Hello, Redis!",并指定了过期时间为0,表示不设置过期时间。

//通过检查错误(err != nil)来确保设置操作是否成功。如果设置失败,你输出了错误信息;否则,你输出了"设置key成功"。
检测key对应的value的值的方法:Get
// 获取key的值,演示Get方法
	value, err := client.Get(context.Background(), testKey).Result()
//result作用是:等待并返回实际的 Redis 命令执行结果。  这种异步操作和等待结果的方式有助于确保代码在获取 Redis 操作结果时不会阻塞整个程序,以便更好地处理并发性能。
	if err != nil {
		fmt.Println("获取key出错:", err)
		return
	}
	fmt.Printf("获取key的值:%s\n", value)
}
//成功运行时会返回:
//获取key的值:Hello, Redis!

redisInsight截图:
image-20240217172811496

获取指定键的当前值并设置一个新的值:GetSet
// 使用 GETSET 获取testKey原有的值存入到oldValue中,并设置新值为NewValue
	oldValue, err := client.GetSet(context.Background(), testKey, "NewValue").Result()
	if err != nil {
		fmt.Println("GETSET 操作出错:", err)
		return
	}

	fmt.Printf("旧值:%s\n", oldValue)

	// 获取更新后testKey中的值并存到newValue中
	newValue, err := client.Get(context.Background(), testKey).Result()
	if err != nil {
		fmt.Println("获取key出错:", err)
		return
	}
	fmt.Printf("新值:%s\n", newValue)

其实还是很简单的,都是一些重复代码段;

批量设置key的值:MSet
// 准备要设置的键值对
keyValues := map[string]interface{}{
    "key1": "value1",
    "key2": "value2",
    "key3": "value3",
}

// 使用 MSet 方法批量设置键值对
err = client.MSet(context.Background(), keyValues).Err()
if err != nil {
    fmt.Println("批量设置键值对出错:", err)
    return
}
//这个M的意思其实是mutiple(多个),不止针对普通string,对于HGet等等都能变成HMGet,批量增加

成功image-20240217180202018

增加整数的值的两个方法:Incr,Incrby

前者可以将值每次增加1,当要增加的值不存在时,会先自动置为0进行操作。下例就是

	// 示例使用的键名
	key := "myKey"

	// 使用 INCR 递增键的值, myKey初值为空,自动置为0+1了
	newValue, err := client.Incr(context.Background(), key).Result()
	if err != nil {
		fmt.Println("INCR 操作出错:", err)
		return
	}
	fmt.Printf("INCR 后 %s 的值为 %d\n", key, newValue)

	// 使用 INCRBY 指定增量递增键的值    1+5=6;
	increment := 5
	newValue, err = client.IncrBy(context.Background(), key, int64(increment)).Result()
	if err != nil {
		fmt.Println("INCRBY 操作出错:", err)
		return
	}
	fmt.Printf("INCRBY %d 后 %s 的值为 %d\n", increment, key, newValue)

image-20240218081020253

在实际开发中还是要看需要什么用什么

设置过期时间

之前的Set方法中,最后一个参数是0,表示的就是过期时间设置,默认以秒为单位,当为0时,表示永不过期,写10,就是10s后过期,写其他单位的数字就需要加单位,如1*time.Minute就是1分钟;

而正规一点的过期时间设置方法是:

使用Expire方法:直接设置key在生成后多少时间过期,比如10秒后过期

// 设置 key 的值
	err := client.Set(context.Background(), "myKey", "myValue", 0).Err()
	if err != nil {
		fmt.Println("设置 key 的值出错:", err)
		return
	}
	// 给 key 设置过期时间为 10 秒
	err = client.Expire(context.Background(), "myKey", 10*time.Second).Err()
	if err != nil {
		fmt.Println("给 key 设置过期时间出错:", err)
		return
	}

使用ExpireAt方法:表示过期的具体时间点,比如直接写成25年的1月1号0点0分过期;

// 设置 key 的值
	err := client.Set(context.Background(), "myKey", "myValue", 0).Err()
	if err != nil {
		fmt.Println("设置 key 的值出错:", err)
		return
	}

	// 给 key 设置过期时间为 10 秒后的某个特定时间
	expirationTime := time.Now().Add(10 * time.Second)
	err = client.ExpireAt(context.Background(), "myKey", expirationTime).Err()
	if err != nil {
		fmt.Println("给 key 设置过期时间出错:", err)
		return
	}

哈希键值对操作:

HGet

先举个例子方便理解,比如,原来的Get命令只能生成简单的键值对,但使用HGet,可以将多个键值对变成同一个哈希表对应的键值对,例如:

image-20240217210237677

这样就清楚了吧,代码示例:

创建和获取哈希类型
// 准备哈希名、字段和值
	hashName := "user:1"
	fieldName := "username"
	fieldValue := "JohnDoe"

	// 使用 HSet 方法设置哈希字段的值
	err := client.HSet(context.Background(), hashName, fieldName, fieldValue).Err()
	if err != nil {
		fmt.Println("设置哈希字段的值出错:", err)
		return
	}

	// 使用 HGet 方法获取哈希字段的值
	result, err := client.HGet(context.Background(), hashName, fieldName).Result()
	if err != nil {
		fmt.Println("获取哈希字段的值出错:", err)
		return
	}

批量创建哈希类型中的键值对

一看就会

	// 准备哈希名
	hashName := "user:1"

	// 使用 HMSet 一次性设置多个键值对
	keyValueMap := map[string]interface{}{
		"username": "JohnDoe",
		"email":    "john@example.com",
		"age":      "30",
	}

	err := client.HMSet(context.Background(), hashName, keyValueMap).Err()
	if err != nil {
		fmt.Println("一次性设置多个键值对出错:", err)
		return
	}

	fmt.Printf("成功一次性设置多个键值对到哈希表 %s\n", hashName)
}

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

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

相关文章

Java 面向对象进阶 14 抽象类和抽象方法(黑马)

抽象类不能实例化(创建对象): 抽象类中不一定有抽象方法: 有抽象方法的类一定是抽象类: 可以有构造方法:(作用:在创建子类对象时,给属性进行赋值的) Perso…

Springboot展示本地图片

1. 创建本地图片目录 在resources下创建目录static/image 2. 修改配置文件 在application.yml中新增 spring:mvc:static-path-pattern: /** 3. 编写拦截器类,继承自HandlerInterceptor 重写preHandle方法 public boolean preHandle(HttpServletRequest request…

Uniapp真机调试没有检测到设备,请插入设备或启动模拟器后刷新再试

最近用HbuilderX开发遇到了一个问题,之前插上手机就能调试,但最近再写app的时候,插上手机,也打开了开发者模式,但就是检测不到设备。 后来发现是要打开MIDI模式。vivo手机路径为:系统管理与升级->开发者…

RK3568平台开发系列讲解(Linux系统篇)编写I2C客户端驱动程序

🚀返回专栏总目录 文章目录 一、定义和注册I2C驱动程序二、在设备树中实例化I2C设备——新方法三、总结沉淀、分享、成长,让自己和他人都能有所收获!😄 配置I2C设备基本上分为两个步骤。 定义并注册I2C驱动程序定义并注册I2C设备在DT中,I2C设备属于非存储器映射设备系列…

HQYJ 2024-2-21 作业

复习课上内容(已完成)结构体字节对齐,64位没做完的做完,32位重新都做一遍,课上指定2字节对齐的做一遍,自己验证(已完成)两种验证大小端对齐的代码写一遍复习指针内容(已完…

人脸美型SDK解决方案,包括瘦脸、大眼、瘦鼻等功能

为了满足市场不断升级的美颜需求,美摄科技凭借其在人脸识别与图像处理领域的深厚积累,推出了一款高效且易集成的人脸美型SDK解决方案。该方案旨在通过先进的算法和丰富的调节功能,帮助企业客户快速实现用户脸部形状的精准美化,进而…

MFC 多文档程序的基本编程

下载了一个openGL mfc的多文档程序,以此来学习mfc多文档模式的编程; 它每次新建一个文档,会在窗口绘制一个三角形、一个矩形;如果没有了图形刷新一下; 先看一下为什么每次打开新文档会绘制图形; 生成工程之后主要有5个类,比单文档程序多了一个子框架类; 可以打开多个…

微信小程序开发学习笔记——3.2page内的onload及data差值表达式

>>跟着b站up主“咸虾米_”学习微信小程序开发中,把学习记录存到这方便后续查找。 课程连接:https://www.bilibili.com/video/BV19G4y1K74d?p16&vd_source9b149469177ab5fdc47515e14cf3cf74 一、注册页面 https://developers.weixin.qq.com…

C#之WPF学习之路(2)

目录 控件的父类 DispatcherObject类 DependencyObject类 DependencyObject 类的关键成员和方法 Visual类 Visual 类的主要成员和方法 UIElement类 UIElement 类的主要成员和功能 FrameworkElement类 FrameworkElement 类的主要成员和功能 控件的父类 在 WPF (Windo…

idea 打不开项目 白屏

使用IDEA打开项目, 不知名原因崩溃了, 直接出现缩略图白屏。 解决过程: 尝试过重启IDEA,重启过电脑,重新引入相同项目(使用不同路径,存在缓存记录,依然打不开)&#xff…

亿道丨三防平板pad丨三防平板是指哪三防丨三防工业级平板电脑

三防工业级平板电脑成为许多行业中的重要工具。本文将介绍三防工业级平板电脑的特点以及其在各个领域中的广泛应用。 三防工业级平板电脑的特点 三防工业级平板电脑是指具备防水、防尘和防震功能的平板电脑。这些特点使得它们能够在恶劣环境中工作,如沙尘飞扬的工地…

easyexcel写入long类型数据精度丢失

1. 前言 在使用easyExcel导出Excel中 发现 long类型的数据格式精度丢失了 问题如下 尾数都成了00000 精度发生了丢失 2. 解决 将long类型的字段转成String 写入到Excel中增加解析器 LongStringConverter 例如 /*** 文件导出** param outputStream outputStream* param cla…

【Rust敲门砖】 Windows环境下配置及安装环境

一、安装C环境 rust底层是依赖C环境的连接器,所以需要先安装C/C编译环境, 有两种选择:安装微软的msvc或者安装mingw/cygwin。 如果使用msvc的Visual Studio,只需要安装好C/C编译环境,然后一路默认就行了,缺点是体积比较大,下载安…

外包干了3个月,技术退步明显

先说一下自己的情况,本科生,19年通过校招进入广州某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

深度学习神经网络实战:多层感知机,手写数字识别

目的 利用tensorflow.js训练模型,搭建神经网络模型,完成手写数字识别 设计 简单三层神经网络 输入层 28*28个神经原,代表每一张手写数字图片的灰度隐藏层 100个神经原输出层 -10个神经原,分别代表10个数字 代码 // 导入 Ten…

SQL Server —— While语句循环

一:简介 while 循环是有条件的循环控制语句。满足条件后,再执行循环体中的SQL语句。 while: break, 如果有多条语句可以在while后面添加begin-end。关于while的语法 while(条件) -- begin -- 语句1 -- 语句2 -- break 根据情况是否添加break -- end 二…

LeetCode LCR 055.二叉搜索树迭代器

实现一个二叉搜索树迭代器类BSTIterator ,表示一个按中序遍历二叉搜索树(BST)的迭代器: BSTIterator(TreeNode root) 初始化 BSTIterator 类的一个对象。BST 的根节点 root 会作为构造函数的一部分给出。指针应初始化为一个不存在…

音视频技术-声反馈啸叫的产生与消除

目录 1.均衡调节: 2.移频法: 3.移相法: 4.比较法: 在扩音系统中,产生啸叫危害很大,一方面影响会议、演出等活动的正常进行,另一方面严重的啸叫会导致音响设备的损坏。 “啸叫”是“声反馈”的俗称,形成的机制复杂,消除的手段多样,专业调音师也对

RSA之前端加密后端解密

RSA之前端加密后端解密 RSA加密解密方式有: (1)公钥加密,私钥解密; (2)私钥加密,公钥解密; 此文章中以下我使用的是前端公钥加密,后端私钥解密; …

Springboot集成Druid实现监控功能

Druid是阿里巴巴开发的号称为监控而生的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource等等等,秒杀一切。Druid可以很好的监控DB池连接和SQL的执行情况&#…