golang之Redis常用类型使用

代码仓库

  • Gitee:https://gitee.com/xiaoyinhui/go-study/tree/master/server/tests
  • Github:https://github.com/xiaoyin001/go-study/tree/master/server/tests

链接Redis

func newRedis() *redis.Client {// 更多 Options 的参数解释可以参考 go Redis 的文档// https://redis.uptrace.dev/zh/guide/go-redis-option.html#redis-clientreturn redis.NewClient(&redis.Options{Addr:     "localhost:6379",Password: "",DB:       0,})
}

1、string类型操作例子

func TestRedisString(t *testing.T) {// 更多相关命令可以参考 菜鸟教程// https://www.runoob.com/redis/redis-strings.htmlmRedis := newRedis()mCtx := context.Background()// 通过 redis 命令的形式插入 string类型的KVmErr := mRedis.Do(mCtx, "Set", "Key_String_01", "Value_String_01").Err()if mErr != nil {fmt.Println("Key_String_01-", mErr.Error())}// 通过 redis 命令的形式插入 string类型的KV 并设置过期时间(单位:秒)mErr = mRedis.Do(mCtx, "SetEx", "Key_String_02", 30, "Value_String_02").Err()if mErr != nil {fmt.Println("Key_String_02-", mErr.Error())}// 通过 go-redis 提供的方法插入string类型数据并可以设置过去时间(这里设置过期时间30秒)mErr = mRedis.Set(mCtx, "Key_String_03", "Value_String_03", time.Second*30).Err()if mErr != nil {fmt.Println("Key_String_03-", mErr.Error())}// 通过 redis 命令形式获取指定Key的值 string类型的KV// 查询的Key不存在,个人建议在获取Key之前还是需要看一下Key是否存在mValue, mErr := mRedis.Do(mCtx, "Get", "Key_String_00").Result()if mErr != nil {fmt.Println("Key_String_00-查询错误-", mErr.Error())} else {fmt.Println("Key_String_00 =", mValue)}// 查询的Key存在mValue = mRedis.Do(mCtx, "Get", "Key_String_01").String()fmt.Println("Key_String_01 =", mValue)// 通过 go-redis 提供的方法 查询string类型数据mStrValue, mErr := mRedis.Get(mCtx, "Key_String_02").Result()if mErr != nil {fmt.Println("Key_String_02-查询错误-", mErr.Error())}fmt.Println("Key_String_02 =", mStrValue)
}

2、Hash类型操作例子

func TestRedisHash(t *testing.T) {// 更多命令可以参考 菜鸟教程// https://www.runoob.com/redis/redis-hashes.htmlmRedis := newRedis()mCtx := context.Background()// 命令的形式插入 Hash类型的数据mErr := mRedis.Do(mCtx, "HSet", "Key_Hash_01", "Value_Hash_01-01K", "Value_Hash_01_01V").Err()if mErr != nil {fmt.Println("Key_Hash_01-01K-插入错误-", mErr.Error())}mErr = mRedis.Do(mCtx, "HSet", "Key_Hash_01", "Value_Hash_01_02K", "Value_Hash_01_02V").Err()if mErr != nil {fmt.Println("Key_Hash_01-02K-插入错误-", mErr.Error())}// 这里覆盖上面插入 Value_Hash_02_K 的哈希数据mErr = mRedis.Do(mCtx, "HSet", "Key_Hash_01", "Value_Hash_01_02K", "Value_Hash_02_New").Err()if mErr != nil {fmt.Println("Key_Hash_01-02K-覆盖插入错误-", mErr.Error())}// go-redis 提供的方法插入Hash类型的数据mErr = mRedis.HSet(mCtx, "Key_Hash_02", "Key_Hash_02_01K", "Value_Hash_02_01V").Err()if mErr != nil {fmt.Println("Key_Hash_02_01K-插入错误-", mErr.Error())}// 设置过期时间mOk, mErr := mRedis.Expire(mCtx, "Key_Hash_01", time.Second*30).Result()if mErr != nil {fmt.Println("Key_Hash_01-设置过期时间错误-", mErr.Error())}if mOk {fmt.Println("Key_Hash_01-设置超时成功")} else {fmt.Println("Key_Hash_01-设置超时失败")}// 命令行的形式获取 Hash类型的数据mValue, mErr := mRedis.Do(mCtx, "HGet", "Key_Hash_01", "Value_Hash_01-01K").Result()if mErr != nil {fmt.Println("Value_Hash_01-01K-获取失败-", mErr.Error())} else {fmt.Println("Value_Hash_01-01K =", mValue)}// go-redis 提供的方法进行查询mValue, mErr = mRedis.HGet(mCtx, "Key_Hash_02", "Key_Hash_02_01K").Result()if mErr != nil {fmt.Println("Value_Hash_02-01K-获取失败-", mErr.Error())} else {fmt.Println("Value_Hash_02-01K =", mValue)}
}

3、List类型操作例子

func TestRedisList(t *testing.T) {// 更多命令可以参考 菜鸟教程// https://www.runoob.com/redis/redis-lists.htmlmRedis := newRedis()mCtx := context.Background()mIsSleep = false//  Lpush 命令将一个或多个值插入到列表头部 【LPUSH KEY_NAME VALUE1.. VALUEN】// 命令的形式插入 List类型数据mErr := mRedis.Do(mCtx, "LPush", "Key_List_01", "Value_List_01").Err()if mErr != nil {fmt.Println("Value_List_01-插入错误-", mErr.Error())}// 可以插入单个也可以插入多个数据mErr = mRedis.Do(mCtx, "LPush", "Key_List_01", "Value_List_02", "Value_List_03", "Value_List_04").Err()if mErr != nil {fmt.Println("Value_List_02~04-插入错误-", mErr.Error())}// 使用 go-redis 提供的方法插入 List类型数据(同样也可以插入多个数据)mErr = mRedis.LPush(mCtx, "Key_List_01", "Value_List_05").Err()if mErr != nil {fmt.Println("Value_List_05-插入错误-", mErr.Error())}// 设置超时时间mOk, mErr := mRedis.Expire(mCtx, "Key_List_01", time.Second*50).Result()if mErr != nil {fmt.Println("Key_List_01-设置超时错误-", mErr.Error())} else {if mOk {fmt.Println("Key_List_01-超时设置成功", mOk)} else {fmt.Println("Key_List_01-超时设置失败", mOk)}}// 使用命令的形式取出 List类型数据// Lpop 命令用于移除并返回列表的第一个元素mValue, mErr := mRedis.Do(mCtx, "LPop", "Key_List_01").Result()if mErr != nil {fmt.Println("LPop-Key_List_01-取出List中数据失败-", mErr.Error())} else {fmt.Println("LPop-Key_List_01 Value=", mValue)}// Rpop 命令用于移除列表的最后一个元素,返回值为移除的元素mValue, mErr = mRedis.Do(mCtx, "RPop", "Key_List_01").Result()if mErr != nil {fmt.Println("RPop-Key_List_01-取出List中数据失败-", mErr.Error())} else {fmt.Println("RPop-Key_List_01 Value=", mValue)}// 使用 go-redis 提供的方法进行插入 List类型数据mErr = mRedis.LPush(mCtx, "Key_List_01", "Value_List_06").Err()if mErr != nil {fmt.Println("Value_List_06-数据插入失败-", mErr.Error())}// 使用 go-redis 提供的方法取出 List类型数据// Rpop 命令用于移除列表的最后一个元素,返回值为移除的元素mValue, mErr = mRedis.RPop(mCtx, "Key_List_01").Result()if mErr != nil {fmt.Println("RPop()-Key_List_01-取出List中数据失败-", mErr.Error())} else {fmt.Println("RPop()-Key_List_01 Value=", mValue)}// Lpop 命令用于移除并返回列表的第一个元素mValue, mErr = mRedis.LPop(mCtx, "Key_List_01").Result()if mErr != nil {fmt.Println("LPop()-Key_List_01-取出List中数据失败-", mErr.Error())} else {fmt.Println("LPop()-Key_List_01 Value=", mValue)}/*总结:1、Push数据不存在覆盖这一说,就如同Push的意思一样,往指定Key下面的List中追加数据2、在Push数据的时候看是需要将数据从头插入还是插入在尾部,L对应前、R对应尾3、在Pop取数据的时候也同上类似,也有L、R的区分,代表这从头还是尾取出数据*/
}

4、Set(集合)类型操作例子

func TestRedisSet(t *testing.T) {// 更多命令可以参考 菜鸟教程// https://www.runoob.com/redis/redis-sets.htmlmRedis := newRedis()mCtx := context.Background()// 通过命令的形式插入 集合类型数据// SAdd 命令将一个或多个成员元素加入到集合中,已经存在于集合的成员元素将被忽略mErr := mRedis.Do(mCtx, "SAdd", "Key_Set_01", "Value_Set_01", "Value_Set_02").Err()if mErr != nil {fmt.Println("Value_Set_01~02-Add失败-", mErr.Error())}// 通过 go-redis 提供的方法进行Add数据mErr = mRedis.SAdd(mCtx, "Key_Set_01", "Value_Set_03", "Value_Set_04").Err()if mErr != nil {fmt.Println("Value_Set_03~04-Add失败-", mErr.Error())}for i := 0; i < 10; i++ {mValue := "Value_Set_0" + strconv.Itoa(i)mRedis.SAdd(mCtx, "Key_Set_01", mValue)}// 通过命令的形式获取 集合类型的数据mValue, mErr := mRedis.Do(mCtx, "SMembers", "Key_Set_01").Result()if mErr != nil {fmt.Println("SMembers-Key_Set_01-查询集合数据错误-", mErr.Error())} else {fmt.Println("SMembers-Key_Set_01 Value=", mValue)}// 通过 go-redis 提供的方法进行查询 集合类型数据mValue, mErr = mRedis.SMembers(mCtx, "Key_Set_01").Result()if mErr != nil {fmt.Println("SMembers()-Key_Set_01-查询集合数据错误-", mErr.Error())} else {fmt.Println("SMembers()-Key_Set_01 Value=", mValue)}// 通过命令设置过期时间// 具体的可以参考菜鸟教程:https://www.runoob.com/redis/keys-expire.htmlmRes, mErr := mRedis.Do(mCtx, "Expire", "Key_Set_01", 30).Int64()if mErr != nil {fmt.Println("Key_Set_01-设置超时错误-", mErr.Error())} else {if mRes == 1 {fmt.Println("Key_Set_01-设置超时成功")} else {fmt.Println("Key_Set_01-设置超时失败")}}/*总结:添加的数据并不是按照插入的顺序进行存放的,存放的数据是无序且不重复*/
}

5、ZSte(有序集合)类型操作例子

func TestRedisZSet(t *testing.T) {// 更多命令可以参考 菜鸟教程// https://www.runoob.com/redis/redis-sorted-sets.htmlmRedis := newRedis()mCtx := context.Background()mItem := redis.Z{}// 通过命令的形式添加 有序集合类型数据// ZAdd 命令用于将一个或多个成员元素及其分数值加入到有序集当中// 已经是有序集合的成员,那么更新这个成员的分数值,并通过重新插入这个成员元素,来保证该成员在正确的位置上mErr := mRedis.Do(mCtx, "ZAdd", "Key_ZSet_01", 10, "Value_ZSet_00").Err()if mErr != nil {fmt.Println("Value_ZSet_00:10-添加失败-", mErr.Error())}// 通过 go-redis 提供的方法添加 有序集合类型数据mItem.Score = 10mItem.Member = "Value_ZSet_01"mErr = mRedis.ZAdd(mCtx, "Key_ZSet_01", mItem).Err()if mErr != nil {fmt.Println("Key_ZSet_01-添加数据错误-", mErr.Error())}mItem.Score = 9mItem.Member = "Value_ZSet_02"mRedis.ZAdd(mCtx, "Key_ZSet_01", mItem)mItem.Member = "Value_ZSet_03"mRedis.ZAdd(mCtx, "Key_ZSet_01", mItem)mItem.Member = "Value_ZSet_04"mRedis.ZAdd(mCtx, "Key_ZSet_01", mItem)mItem.Score = 11mItem.Member = "Value_ZSet_01"mRedis.ZAdd(mCtx, "Key_ZSet_01", mItem)// 命令方式获取 有序集合指定区间(排序下标)内的成员// ZRevRange 返回有序集中,指定区间内的成员,成员的位置按分数值递减(从大到小)来排列mValue, mErr := mRedis.Do(mCtx, "ZRevRange", "Key_ZSet_01", 0, 2).Result()if mErr != nil {fmt.Println("ZRevRange-Key_ZSet_01-获取指定区间内成员数据错误-", mErr.Error())} else {fmt.Println("ZRevRange-Key_ZSet_01-获取指定区间内成员数据- Value=", mValue)}// 通过 go-redis 提供的方法进行// ZRevRange 返回有序集中,指定区间内的成员,成员的位置按分数值递减(从大到小)来排列mValue, mErr = mRedis.ZRevRange(mCtx, "Key_ZSet_01", 0, 2).Result()if mErr != nil {fmt.Println("ZRevRange()-Key_ZSet_01-获取指定区间内成员数据错误-", mErr.Error())} else {fmt.Println("ZRevRange()-Key_ZSet_01-获取指定区间内成员数据- Value=", mValue)}/*总结:1、插入的数据排序是从大到小2、插入的数据跟集合一样,里面的成员是不可重复的,但是这里的 Score(可以理解为权重分数,越大排名越靠前) 是可以重复的*/
}

一点点笔记,以便以后翻阅。

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

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

相关文章

阶段性总结:如何快速上手一个新的平台或者技术

作为研发一枚&#xff0c;为了实现客户的各种需求&#xff0c;为了避免重复造轮子&#xff0c;通常需要快速调查到哪个轮子&#xff08;比如各种平台&#xff0c;或者开发包等&#xff09;好用&#xff0c;然后快速熟悉和上手。在接触到一个新的平台或者技术的时候&#xff0c;…

更新表的统计信息并清空缓存--DM8达梦数据库

更新表的统计信息并清空缓存--DM8达梦数据库 环境介绍1 收集 <表> 上所有对象信息&#xff0c;含索引2 清理缓存的执行计划3 达梦数据库学习使用列表 环境介绍 在某些环境刚完成数据迁移, 10万行以上大表数据量有修改1/3 ,查询条件已经创建索引,执行计划不好,或执行计划…

开发指南031-安装ssl证书

为增强安全性&#xff0c;平台可安装ssl证书。对于平台不同的组成部分需要采用不同的方式&#xff0c;使用不同的证书格式&#xff1a; 一、前端 前端采用nginx部署&#xff0c;安装证书步骤如下&#xff08;linux window版一样&#xff09;&#xff1a; 1、conf目录下增加cert…

软考阅卷将完成?!软考成绩有望六月底公布!

2024上半年软考考试已于5月25日-28日举行&#xff0c;考完试后大家最关心的事情莫过于查分了。 一、最新消息 1、不同地区在报名时对成绩公布的时间有所预示&#xff0c;但并没有一个统一的日期举个例子&#xff0c;江苏考区预计在6月下旬公布成绩&#xff0c;而黑龙江考区则预…

力扣2476.二叉搜索树最近节点查询

力扣2476.二叉搜索树最近节点查询 二叉搜索树 中序遍历 严格递增数组 在数组上做二分 找到第一个>q的元素的下标j若j < n 则a[j]为maxx若j-1>0 && a[j] ! p 则a[j-1]为minx class Solution {vector<int> a;void dfs(TreeNode* node){if(node null…

glm4、qwen、MiniCPM-Llama3-V代码层面差异性分析

让我们详细解读这个glm4下的 RotaryEmbedding 类&#xff0c;逐行解释代码的工作原理。 类的定义和初始化 class RotaryEmbedding(nn.Module):def __init__(self, dim, rope_ratio1, original_implFalse, deviceNone, dtypeNone):super().__init__()inv_freq 1.0 / (10000 *…

【Altium】Sheet Symbol器件页面符和对应原理图端口同步

【更多软件使用问题请点击亿道电子官方网站】 1、文档目标&#xff1a; 更给原理图端口后&#xff0c;如何同步到对应的sheet symbol 2、应用场景&#xff1a; 使用层次结构原理图设计的情况下&#xff0c;修改了某张原理图上的端口之后&#xff0c;其对应的sheet symbol上的…

APK打包 |应用图标 | 应用名称设置

在 Android 项目中&#xff0c;设置应用的图标和名称是必要的步骤。这些设置通常在 AndroidManifest.xml 和资源文件中进行配置。以下是如何设置应用的图标和名称的详细步骤。 1. 设置应用图标 准备图标资源 首先&#xff0c;准备好你的应用图标。图标应该有多个尺寸&#x…

Java网络爬虫入门

文章目录 1、导入依赖2、CrawlerFirst 1、导入依赖 <dependencies><!-- HttpClient --><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.3</version></…

面试题之CSS

1. 引入样式的方式 外部样式 link import 区别 内部样式 /* 写在头部标签 */ <style></style>行内样式 2. 三行代码画三角形 .triangle{width:0px;border:100px solid;border-color:transparent transparent transparent red; }3.属性的继承 可继承的属性 …

win10重装系统如何操作,附上详细系统重装图文教程(2024年新)

win10重装系统如何操作呢&#xff1f;电脑使用时间长了&#xff0c;会出现各种各样的问题&#xff0c;如重要的系统文件被删除导致电脑无法正常运行&#xff0c;电脑运行内存空间不足&#xff0c;电脑卡顿等。Win10重装系统很简单&#xff0c;这里分享超详细的重装系统方法&…

【设计模式】面向对象的优点

面向过程 我们知道面向过程是以过程&#xff08;函数、方法、操作&#xff09;作为组织代码的基本单元&#xff0c;数据与方法相分离是其主要的特点。而面向对象是以类、对象作为组织代码的基本单元&#xff0c;数据与方法往往相关联。 面向过程编程语言的特点是不支持类和对…

【跟我学RISC-V】(三)openEuler特别篇

写在前面 这篇文章是跟我学RISC-V指令集的第三期&#xff0c;距离我上一次发文已经过去一个多月了&#xff0c;在这个月里我加入了oerv的实习项目组&#xff0c;并且还要准备期末考试&#xff0c;比较忙。 在这篇文章里我会隆重、详细地介绍一个对RISC-V支持非常友好的Linux发…

判断当前设备为移动端自适应 平板和pc端为375移动端样式

在libs的setRem.js中&#xff1a; let html document.querySelector("html"); function setRem() {let ui_w 375;let cl_w document.documentElement.clientWidth || document.body.clientWidth;cl_w > 750 ? cl_w 375 : "";html.style.fontSize …

Less基础

1. Less入门 1.1 有了 CSS&#xff0c;为什么还需要 Less CSS基本上是设计师的工具&#xff0c;不是程序员的工具。在程序员的眼里&#xff0c;CSS是很头痛的事情&#xff0c;它并不像其它程序语言&#xff0c;比如说PHP、Javascript等等&#xff0c;有自己的变量、常量、条件…

高性能网络SIG月度动态:自研 IPPROTO_SMC 贡献 Linux 社区,virtio 增加多项优化

高性能网络 SIG&#xff08;Special Interest Group&#xff09; &#xff1a;在这个万物互联的时代&#xff0c;云上的网络通信效率对各种服务至关重要&#xff0c;高性能网络兴趣组致力于利用 XDP、RDMA、VIRTIO 等新高效通信技术&#xff0c;结合软硬件一体化的思想&#xf…

【每天学会一个渗透测试工具】Nessus安装及使用指南

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 其他扫描工具&#xff1a; AWVS和Xray&#xff1a;应用漏洞扫描工具 fscan&#xff1a;虽然能扫主机&#xff0c;但比较老了…

01- ES6语法

1.ES6相关概念 1.1 什么是ES6 1.1.1 简介 ES6&#xff0c; 全称 ECMAScript 6.0 &#xff0c;是 JavaScript 的下一个版本标准&#xff0c;2015.06 发版。 ES6 主要是为了解决 ES5 的先天不足&#xff0c;比如 JavaScript 里并没有类的概念&#xff0c;但是目前浏览器的 Ja…

Linux、Windows安全加固

为了减少系统被黑客入侵&#xff0c;对操作系统的安全加固是网络安全和主机安全必不可少的一部分。 一、Linux安全加固 1.不使用默认的ssh端口&#xff0c;修改默认ssh22端口号 sudo vim /etc/ssh/ssh_config 去掉#注释&#xff0c;修改端口号并保存 2.关闭不必要的系统服务…

日常学习记录

1、力扣sql 15题 2、八股 回顾java基础 3、sql网课还差一节