【go语言开发】redis简单使用

本文主要介绍redis安装和使用。首先安装redis依赖库,这里是v8版本;然后连接redis,完成基本配置;最后测试封装的工具类

文章目录

  • 安装redis依赖库
  • 连接redis和配置
  • 工具类封装
  • 代码测试

欢迎大家访问个人博客网址:https://www.maogeshuo.com,博主努力更新中…

参考文件:

  • Yaml文件配置,Config使用
  • Log日志封装
  • 常用工具类封装

安装redis依赖库

命令行安装redis

go get github.com/go-redis/redis/v8

连接redis和配置

首先创建了一个 Redis 客户端,并连接到本地 Redis 服务器(默认端口为 6379)。连接完成后,使用Ping函数测试连接是否成功。

package coreimport ("context""fmt""github.com/go-redis/redis/v8""time"
)// https://zhuanlan.zhihu.com/p/637537337
// https://blog.csdn.net/qq_44237719/article/details/128920821var Redis *RedisClienttype RedisClient struct {client *redis.Clientctx    context.Context
}// InitRedis 初始化redis
func InitRedis() {redisConfig := Config.Redisclient := redis.NewClient(&redis.Options{Addr:     fmt.Sprintf("%s:%d", redisConfig.Host, redisConfig.Port),Password: redisConfig.Password,DB:       redisConfig.Db,})redisClient := &RedisClient{client: client,ctx:    context.Background(),}Redis = redisClient_, err := client.Ping(client.Context()).Result()if err != nil {LOG.Println("redis连接失败!")return}LOG.Println("redis连接成功!")
}

工具类封装

/*------------------------------------ 字符 操作 ------------------------------------*/// Set 设置 key的值
func (this *RedisClient) Set(key, value string) bool {result, err := this.client.Set(this.ctx, key, value, 0).Result()if err != nil {LOG.Println(err)return false}return result == "OK"
}// SetEX 设置 key的值并指定过期时间
func (this *RedisClient) SetEX(key, value string, ex time.Duration) bool {result, err := this.client.Set(this.ctx, key, value, ex).Result()if err != nil {LOG.Println(err)return false}return result == "OK"
}// Get 获取 key的值
func (this *RedisClient) Get(key string) (bool, string) {result, err := this.client.Get(this.ctx, key).Result()if err != nil {LOG.Println(err)return false, ""}return true, result
}// GetSet 设置新值获取旧值
func (this *RedisClient) GetSet(key, value string) (bool, string) {oldValue, err := this.client.GetSet(this.ctx, key, value).Result()if err != nil {LOG.Println(err)return false, ""}return true, oldValue
}// Incr key值每次加一 并返回新值
func (this *RedisClient) Incr(key string) int64 {val, err := this.client.Incr(this.ctx, key).Result()if err != nil {LOG.Println(err)}return val
}// IncrBy key值每次加指定数值 并返回新值
func (this *RedisClient) IncrBy(key string, incr int64) int64 {val, err := this.client.IncrBy(this.ctx, key, incr).Result()if err != nil {LOG.Println(err)}return val
}// IncrByFloat key值每次加指定浮点型数值 并返回新值
func (this *RedisClient) IncrByFloat(key string, incrFloat float64) float64 {val, err := this.client.IncrByFloat(this.ctx, key, incrFloat).Result()if err != nil {LOG.Println(err)}return val
}// Decr key值每次递减 1 并返回新值
func (this *RedisClient) Decr(key string) int64 {val, err := this.client.Decr(this.ctx, key).Result()if err != nil {LOG.Println(err)}return val
}// DecrBy key值每次递减指定数值 并返回新值
func (this *RedisClient) DecrBy(key string, incr int64) int64 {val, err := this.client.DecrBy(this.ctx, key, incr).Result()if err != nil {LOG.Println(err)}return val
}// Del 删除 key
func (this *RedisClient) Del(key string) bool {result, err := this.client.Del(this.ctx, key).Result()if err != nil {return false}return result == 1
}// Expire 设置 key的过期时间
func (this *RedisClient) Expire(key string, ex time.Duration) bool {result, err := this.client.Expire(this.ctx, key, ex).Result()if err != nil {return false}return result
}/*------------------------------------ list 操作 ------------------------------------*/// LPush 从列表左边插入数据,并返回列表长度
func (this *RedisClient) LPush(key string, date ...interface{}) int64 {result, err := this.client.LPush(this.ctx, key, date).Result()if err != nil {LOG.Println(err)}return result
}// RPush 从列表右边插入数据,并返回列表长度
func (this *RedisClient) RPush(key string, date ...interface{}) int64 {result, err := this.client.RPush(this.ctx, key, date).Result()if err != nil {LOG.Println(err)}return result
}// LPop 从列表左边删除第一个数据,并返回删除的数据
func (this *RedisClient) LPop(key string) (bool, string) {val, err := this.client.LPop(this.ctx, key).Result()if err != nil {LOG.Println(err)return false, ""}return true, val
}// RPop 从列表右边删除第一个数据,并返回删除的数据
func (this *RedisClient) RPop(key string) (bool, string) {val, err := this.client.RPop(this.ctx, key).Result()if err != nil {fmt.Println(err)return false, ""}return true, val
}// LIndex 根据索引坐标,查询列表中的数据
func (this *RedisClient) LIndex(key string, index int64) (bool, string) {val, err := this.client.LIndex(this.ctx, key, index).Result()if err != nil {LOG.Println(err)return false, ""}return true, val
}// LLen 返回列表长度
func (this *RedisClient) LLen(key string) int64 {val, err := this.client.LLen(this.ctx, key).Result()if err != nil {LOG.Println(err)}return val
}// LRange 返回列表的一个范围内的数据,也可以返回全部数据
func (this *RedisClient) LRange(key string, start, stop int64) []string {vales, err := this.client.LRange(this.ctx, key, start, stop).Result()if err != nil {LOG.Println(err)}return vales
}// LRem 从列表左边开始,删除元素data, 如果出现重复元素,仅删除 count次
func (this *RedisClient) LRem(key string, count int64, data interface{}) bool {_, err := this.client.LRem(this.ctx, key, count, data).Result()if err != nil {fmt.Println(err)}return true
}// LInsert 在列表中 pivot 元素的后面插入 data
func (this *RedisClient) LInsert(key string, pivot int64, data interface{}) bool {err := this.client.LInsert(this.ctx, key, "after", pivot, data).Err()if err != nil {LOG.Println(err)return false}return true
}/*------------------------------------ set 操作 ------------------------------------*/// SAdd 添加元素到集合中
func (this *RedisClient) SAdd(key string, data ...interface{}) bool {err := this.client.SAdd(this.ctx, key, data).Err()if err != nil {LOG.Println(err)return false}return true
}// SCard 获取集合元素个数
func (this *RedisClient) SCard(key string) int64 {size, err := this.client.SCard(this.ctx, "key").Result()if err != nil {LOG.Println(err)}return size
}// SIsMember 判断元素是否在集合中
func (this *RedisClient) SIsMember(key string, data interface{}) bool {ok, err := this.client.SIsMember(this.ctx, key, data).Result()if err != nil {LOG.Println(err)}return ok
}// SMembers 获取集合所有元素
func (this *RedisClient) SMembers(key string) []string {es, err := this.client.SMembers(this.ctx, key).Result()if err != nil {LOG.Println(err)}return es
}// SRem 删除 key集合中的 data元素
func (this *RedisClient) SRem(key string, data ...interface{}) bool {_, err := this.client.SRem(this.ctx, key, data).Result()if err != nil {LOG.Println(err)return false}return true
}// SPopN 随机返回集合中的 count个元素,并且删除这些元素
func (this *RedisClient) SPopN(key string, count int64) []string {vales, err := this.client.SPopN(this.ctx, key, count).Result()if err != nil {LOG.Println(err)}return vales
}/*------------------------------------ hash 操作 ------------------------------------*/// HSet 根据 key和 field字段设置,field字段的值
func (this *RedisClient) HSet(key, field, value string) bool {err := this.client.HSet(this.ctx, key, field, value).Err()if err != nil {return false}return true
}// HGet 根据 key和 field字段,查询field字段的值
func (this *RedisClient) HGet(key, field string) string {val, err := this.client.HGet(this.ctx, key, field).Result()if err != nil {LOG.Println(err)}return val
}// HMGet 根据key和多个字段名,批量查询多个 hash字段值
func (this *RedisClient) HMGet(key string, fields ...string) []interface{} {vales, err := this.client.HMGet(this.ctx, key, fields...).Result()if err != nil {panic(err)}return vales
}// HGetAll 根据 key查询所有字段和值
func (this *RedisClient) HGetAll(key string) map[string]string {data, err := this.client.HGetAll(this.ctx, key).Result()if err != nil {LOG.Println(err)}return data
}// HKeys 根据 key返回所有字段名
func (this *RedisClient) HKeys(key string) []string {fields, err := this.client.HKeys(this.ctx, key).Result()if err != nil {LOG.Println(err)}return fields
}// HLen 根据 key,查询hash的字段数量
func (this *RedisClient) HLen(key string) int64 {size, err := this.client.HLen(this.ctx, key).Result()if err != nil {LOG.Println(err)}return size
}// HMSet 根据 key和多个字段名和字段值,批量设置 hash字段值
func (this *RedisClient) HMSet(key string, data map[string]interface{}) bool {result, err := this.client.HMSet(this.ctx, key, data).Result()if err != nil {LOG.Println(err)return false}return result
}// HSetNX 如果 field字段不存在,则设置 hash字段值
func (this *RedisClient) HSetNX(key, field string, value interface{}) bool {result, err := this.client.HSetNX(this.ctx, key, field, value).Result()if err != nil {LOG.Println(err)return false}return result
}// HDel 根据 key和字段名,删除 hash字段,支持批量删除
func (this *RedisClient) HDel(key string, fields ...string) bool {_, err := this.client.HDel(this.ctx, key, fields...).Result()if err != nil {LOG.Println(err)return false}return true
}// HExists 检测 hash字段名是否存在
func (this *RedisClient) HExists(key, field string) bool {result, err := this.client.HExists(this.ctx, key, field).Result()if err != nil {LOG.Println(err)return false}return result
}

代码测试

func TestRedis() {core.Redis.Set("test", "value1")if ok, s := core.Redis.Get("test"); ok {core.LOG.Println("test: ", s)}core.Redis.SetEX("test2", "value2", 10*time.Minute)if okEx, sEx := core.Redis.Get("test2"); okEx {core.LOG.Println("test2: ", sEx)}
}

在这里插入图片描述

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

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

相关文章

Linux进程详细介绍

文章目录 Linux进程1、计算机体系结构和操作系统管理1.1、计算机体系结构 -- 硬件1.2、操作系统(Operator System) -- 软件 2、进程2.1、进程基本概念2.2、进程标识符2.2.1、获取当前进程标识符和当前进程的父进程标识符2.2.2、通过系统调用创建进程 -- …

基于SpringBoot+MYSQL的网上订餐系统

目录 1、 前言介绍 2、主要技术 3、系统功能分析 3.1、用户功能分析 3.2、管理员功能分析 4、系统结构分析 4.1、逻辑结构 4.2、物理结构 5、数据库设计 5.1、数据库E-R图设计 5.2、数据库表设计 6、运行截图(部分) 6.1、用户功能模块的实现 6.2、管理员功能模块的…

Echarts+D3气泡图

EchartsD3气泡图&#xff08;相邻效果&#xff0c;气泡之间不叠加&#xff09; <template><div ref"chart" style"width: 500px; height: 500px"></div> </template><script setup> import * as echarts from echarts/core …

不同用户同时编辑商品资料导致的db并发覆盖

背景 这个问题的背景来源于有用户反馈&#xff0c;他在商品系统中对商品打的标签不见了&#xff0c;影响到了前端页面上商品的资料显示 不同用户编辑同一商品导致的数据覆盖问题分析 查询操作日志发现用户B确实编辑过商品资料&#xff0c;并且日志显示确实打上了标签&#x…

前端从普通登录到单点登录(SSO)

随着前端登录场景的日益复杂化和技术思想的不断演进&#xff0c;前端在登录方面的知识结构变得越来越复杂。对于前端开发者来说&#xff0c;在日常工作中根据不同的登录场景提供合适的解决方案是我们的职责所在&#xff0c;本文将梳理前端登录的演变过程。 1、无状态的HTTP H…

【面试题】webpack的五大核心、构建流程、性能优化

【面试题】webpack的五大核心、webpack的构建流程、webpack的性能优化 webpack是什么?webpack的五大核心webpack的构建流程webpack性能优化 webpack是什么? js静态模块打包工具。 功能 将多个文件打包成更小的文件&#xff0c;(压缩)翻译 babal-loader es6进行降级兼容。 …

合泰HT66F2390----定时器中断学习笔记

前言 无需多言 直接开始定时器中断 的学习 通过上次的PWM学习&#xff0c;上次用的是周期型TM定时器模块 这次使用标准型TM定时器模块&#xff08;STM&#xff09; 代码 #include <HT66F2390.h>void Timer0_Init(void){_stm0c0 0b00001000;_stm0c1 0b11000001;_stm…

基于巨控GRM561/562/563Y西门子1200PLC发邮件

巨控GRM560,GRM600系列同比之前的GRM530&#xff0c;除短信&#xff0c;微信&#xff0c;电话语音播报增加了邮件发送功能&#xff0c;简单介绍一下PLC发邮件。 1在博途中建立好DB块 2.打开GRMDEV6&#xff0c;新建工程&#xff0c;做好数据采集&#xff0c;这里以DB4.D0&#…

三大数学软件之Maple

相信钻研数学的小伙伴们对MATLAB、SPSS这样的重量级软件并不陌生&#xff0c;这些大型软件能求解复杂的运算&#xff0c;解决各领域的数学问题。今天博主为大家带来了一款名不见经传的软件——Maple&#xff0c;作为三大数学软件之一&#xff0c;Maple同样拥有不菲的计算能力&a…

栈和队列之队列

1.队列 1.1队列的概念 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出 FIFO(First In First Out) 入队列&#xff1a;进行插入操作的一端称为队尾 出队列&#xff1a;进行删除操作的一端称为队…

Git 撤销修改

如果我们在我们的工作区写了很长时间代码&#xff0c;发现出现错误&#xff0c;想回退到之前的版本&#xff0c;这时改怎么做呢&#xff1f; 情况一&#xff1a;对于工作区的代码&#xff0c;还没有 add 我们当然也可以使用git diff 查看与上次提交的差异&#xff0c;进行手动删…

【场景题】让你设计一个订单号生成服务,该怎么做?

方案 当设计订单号生成服务时&#xff0c;我们需要考虑唯一性、数据量、可读性、基因法、可扩展性、高性能和高可用性等多个方面。根据这些考虑&#xff0c;一个简单的订单号生成服务设计方案可以采取以下措施&#xff1a; 使用Snowflake算法或第三方分布式ID生成器&#xff…

PackagesNotFoundError:学习利用报错信息找到解决方法

反思&#xff1a;之前看到报错经常是直接复制报错信息去网上搜&#xff0c;但很多情况下报错信息里其实就给出了解决方案 报错信息&#xff1a; Collecting package metadata (current_repodata.json): done Solving environment: unsuccessful initial attempt using frozen …

FRM模型十五:净值归因之Fama_French三因子模型

文章目录 一、起源二、构建因子三、投资组合的净值归因1. 市场因子2. 规模因子3.价值因子4. 基于净值的归因方法 三、代码实现 一、起源 在多因子模型推出之前&#xff0c;CAPM模型被视为资产定价的第一标准。随着市场不断发展&#xff0c;发现了越来越多CAPM模型无法解释的现…

超详细的Scrapy框架的基本使用教程

Scrapy的介绍 scrapy的工作流程&#xff08;重点&#xff01;&#xff01;&#xff01;&#xff09; 如下图所示&#xff1a; 爬虫&#xff1a; 负责向引擎提供要爬取网页的URL&#xff0c;引擎会把这个URL封装成request对象并传递给调度器&#xff0c;把引擎传递过来的resp…

安卓app软件开发的费用

我们公司总结的开发价格根据安卓APP&#xff0c;苹果APP行业的报价&#xff0c;开发的APP软件费用主要受到两个方面的影响。安卓和苹果APP软件应用的复杂性&#xff0c;第二个是定制开发的APP软件&#xff0c;开发成本和人员的投入成本&#xff0c;以下就是不同的报价费用是怎么…

面试经典150题【51-60】

文章目录 面试经典150题【51-60】71.简化路径155.最小栈150.逆波兰表达式求值224.基本计算器141.环形链表2.两数相加21.合并两个有序链表138.随机链表的复制19.删除链表的倒数第N个节点82.删除链表中的重复元素II 面试经典150题【51-60】 71.简化路径 先用split(“/”)分开。然…

四平方和 刷题笔记

/* 四平方和 直接暴力搜索 可能会超时 使用二分辅助搜索 先枚举出 c*cd*d并存入数组 用式子算出 a*ab*b还剩下多少查找sum数组里面是否存在符合条件的数 查找方式使用二分搜索 当逼近答案后 检查一下是否为所需的数 如果是 直接输出 */ #include <cstring> #includ…

rabbitmq基础(1)

1、背景 能实现消息队列的框架软件有很多&#xff0c;kafka、rabbitmq、RocketMq、activeMq、Redis&#xff08;非专业&#xff09;&#xff0c;各有各的特点和优缺点。但是之前的公司数据需求规模并非很大&#xff0c;所以采用rabbitmq作为消息队列。 2、rabbitMq的基础架构…

C++面试宝典【配文档,全方面学习】

原word文档[链接: https://pan.baidu.com/s/1CKnm7vHDmHSDskAgxgZgKA?pwdr4wv 提取码: r4wv 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 --来自百度网盘超级会员v5的分享] 一、C / C基础 1、简述C的内存分区&#xff1f; 一个C、C程序的内存分区主要有5个…