【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.rhkb.cn/news/273631.html

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

相关文章

系统学习c++类和对象——深度理解默认成员函数

前言:类和对象是面向对象语言的重要概念。 c身为一门既面向过程,又面向对象的语言。 想要学习c, 首先同样要先了解类和对象。 本节就类和对象的几种构造函数相关内容进行深入的讲解。 目录 类和对象的基本概念 封装 类域和类体 访问限定符…

Everything:文件查找工具,一搜即得

名人说:东边日出西边雨,道是无晴却有晴。——刘禹锡 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、软件介绍①Everything②核心功能③原理 二、下载安装①下载②安装 三、使用方法①文…

吴恩达机器学习笔记十六 如何debug一个学习算法 模型评估 模型选择和训练 交叉验证测试集

如果算法预测出的结果不太好,可以考虑以下几个方面: 获得更多的训练样本 采用更少的特征 尝试获取更多的特征 增加多项式特征 增大或减小 λ 模型评估(evaluate model) 例如房价预测,用五个数据训练出的模型能很好的拟合这几个数据&am…

Linux调试器--gdb的介绍以及使用

文章目录 1.前言 ✒️2.介绍gdb✒️3.Debug模式和Release模式的区别✒️4.如何使用gdb✒️1️⃣.在debug模式下编译2️⃣.进入调试3️⃣ .调试命令集合⭐️⭐️ 1.前言 ✒️ 🕗在我们之前的学习中已经学会了使用vim编译器编写c/c代码,但是对于一个程序员…

OpenCV 图像的几何变换

一、图像缩放 1.API cv2.resize(src, dsize, fx0,fy0,interpolation cv2.INTER_LINEAR) 参数: ①src :输入图像 ②dsize:绝对尺寸 ③fx,fy:相对尺寸 ④interpolation:插值方法 2.代码演示 import cv2 …

Python——读写属性

采用读写属性的目的就是把录入的数据控制在合理区间。 如:学生的年龄(age),学生的身高(height)... 方法一:利用实例方法来控制 class Student:def __init__(self,name"",age0):self.…

Linux:kubernetes(k8s)prestop事件的使用(10)

他的作用是在结束pod容器之后进行的操作 apiVersion: v1 # api文档版本 kind: Pod # 资源对象类型 metadata: # pod相关的元数据,用于描述pod的数据name: nginx-po # pod名称labels: # pod的标签type: app #这个是随便写的 自定义的标签version: 1.0.0 #这个…

PostgreSQL 安装部署

文章目录 一、PostgreSQL部署方式1.Yum方式部署2.RPM方式部署3.源码方式部署4.二进制方式部署5.Docker方式部署 二、PostgreSQL部署1.Yum方式部署1.1.部署数据库1.2.连接数据库 2.RPM方式部署2.1.部署数据库2.2.连接数据库 3.源码方式部署3.1.准备工作3.2.编译安装3.3.配置数据…

C语言 --- 指针(5)

目录 一.sizeof和strlen对比 1.sizeof 2.strlen 3.strlen 和sizeof的对比 二.数组和指针笔试题目详解 回顾:数组名的理解 1.一维数组 2.字符数组 代码1: 代码2: 代码3: 代码4: 代码5: 代码6&am…

SSM整合项目(使用Vue3 + Element-Plus创建项目基础页面)

1.配置Vue启动端口 1.修改vue.config.js const {defineConfig} require(vue/cli-service) module.exports defineConfig({transpileDependencies: true }) module.exports {devServer: {port: 9999 //启动端口} }2.启动 2.安装Element Plus 命令行输入 npm install eleme…

【leetcode热题】排序链表

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 示例 1: 输入:head [4,2,1,3] 输出:[1,2,3,4]示例 2: 输入:head [-1,5,3,4,0] 输出:[-1,0,3,4,5]示例 3: 输入…

骑行瓦恭村的记忆

昆富公路是一条蜿蜒的丝带,引领着校长骑行这群热爱骑行的骑友,穿越时光的隧道,直达心灵深处那个被岁月抚摸得斑斑点点的小村庄——瓦恭村。大普吉隧道如同时光的门扉,每一次穿越,都伴随着轰鸣的排气扇声音,…

新规正式发布 | 百度深度参编《生成式人工智能服务安全基本要求》

2024年2月29日,全国网络安全标准化技术委员会( TC260 )正式发布《生成式人工智能服务安全基本要求》(以下简称《基本要求》)。《基本要求》规定了生成式人工智能服务在安全方面的基本要求,包括语料安全、模…

HarmonyOS 关系型数据 整体测试 进行 初始化 增删查改 操作

好啊 前面的文章 HarmonyOS 数据持久化 关系型数据库之 初始化操作 HarmonyOS 数据持久化 关系型数据库之 增删改逻辑编写 HarmonyOS 数据持久化 关系型数据库之 查询逻辑编写 我们分别编写了 初始化数据库表 增删查改操作 的逻辑代码 那么 下面我们就来整体操作一下 然后 这…

Python中的并发编程:多线程与多进程的比较【第124篇—多线程与多进程的比较】

Python中的并发编程:多线程与多进程的比较 在Python编程领域中,处理并发任务是提高程序性能的关键之一。本文将探讨Python中两种常见的并发编程方式:多线程和多进程,并比较它们的优劣之处。通过代码实例和详细的解析,…

Helix QAC—源码级静态自动化测试工具

Helix QAC概述 Helix QAC是一款源码级静态自动化测试工具,主要用于C/C代码的完全自动化静态分析工作,提供一个高效、健壮和自动化的环境来引入和执行编码标准。Helix QAC根据尽早、更频繁测试的理念,在软件生命周期最早期软件开发阶段应用识别…

Linux学习——线程的控制

目录 ​编辑 一,线程的创建 二,线程的退出 1,在子线程内return 2,使用pthread_exit(void*) 三,线程等待 四,线程获取自己的id值 五,线程取消 六,线程分离 一,线程的创建 在对…

JavaEE企业开发新技术2

目录 2.7 Field类的基本概念 文字性概念描述: Field类 2.8 Field的基本操作-1 2.9 Field的基本操作-2 分析: 2.10 Field 的综合练习 总结: 和equals的区别: 使用 比较 使用equals比较 2.7 Field类的基本概念 文字性…

IAR全面支持小华全系芯片,强化工控及汽车MCU生态圈

IAR Embedded Workbench for Arm已全面支持小华半导体系列芯片,加速高端工控MCU和车用MCU应用的安全开发 嵌入式开发软件和服务的全球领导者IAR与小华半导体有限公司(以下简称“小华半导体”)联合宣布,IAR Embedded Workbench fo…

微信小程序开发系列(二十四)·wxml语法·列表渲染·wx:for-item 和 wx:for-index

目录 1. 如果需要对默认的变量名和下标进行修改,可以使用wx:for-item 和 wx:for-index 2. 将 wx:for 用在 标签上,以渲染一个包含多个节点的结构块 方法一 方法二 3. 总结 3.1 wx:for-item 和 wx:for-index总结 3.2 总结 1. 如果需要对默…