【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.hqwc.cn/news/527604.html

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

相关文章

二叉树进阶--二叉搜索树的进一步优化--AVL树 Self-balancing binary search tree

前言: 在上一次的文章中,我们详细介绍了二叉树的进阶树型,即BS树(二叉搜索树),但在文章的结尾,二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表…

【物联网】-智能社会的分类

万物感知 感知物理世界,变成数字信号 (温度、空间、触觉、嗅觉、听觉、视觉) 万物互联 将数据变成online,使智能化 (宽联接、广联接、多联接和深联接) 万物智能 基于大数据和人工智能的应用 &#…

多模太与交叉注意力应用

要解决的问题 对同一特征点1从不同角度去拍,在我们拿到这些不同视觉的特征后,就可以知道如何从第一个位置到第二个位置,再到第三个位置 对于传统算法 下面很多点检测都是错 loftr当今解决办法 整体流程 具体步骤 卷积提取特征,…

双体系Java学习之循环结构

循环结构 package struct;public class WhileDemo01 {public static void main(String[] args) {//输出1-100int i 0;while (i<100){i;System.out.println(i);}} }package struct;public class WhileDemo02 {public static void main(String[] args) {//死循环while (true)…

OpenCV filter2D函数详解

OpenCV filter2D函数简介 OpenCV filter2D将图像与内核进行卷积&#xff0c;将任意线性滤波器应用于图像。支持就地操作。当孔径部分位于图像之外时&#xff0c;该函数根据指定的边界模式插值异常像素值。 该函数实际上计算相关性&#xff0c;而不是卷积&#xff1a; filter…

C++20四大特性之Ranges

C20 Ranges 1.基础概念2.使用 在之前的文章已经写过另外三大特性&#xff0c;直通点&#xff1a; C那些事之C20协程开篇 盘点C20模块那些事 C20&#xff1a;从0到1学懂concept 那么&#xff0c;本篇将开始学习另外一个特性ranges。 ranges是C20的主要特性之一&#xff0c;其中&…

WebRTC简介及实战应用 — 从0到1实现实时音视频聊天等功能

一、WebRTC简介 WebRTC 是由一家名为 Gobal IP Solutions,简称 GIPS 的瑞典公司开发的。Google 在 2011 年收购了 GIPS,并将其源代码开源。然后又与 IETF 和 W3C 的相关标准机构合作,以确保行业达成共识。其中: Web Real-Time Communications (WEBRTC) W3C 组织:定义浏览…

Nginx的页面优化,安全优化,日志分割,配置防盗链,图片缓存,解决部分问题

一、隐藏版本号 他人可以使用调试代理工具&#xff08;fiddler工具&#xff09;、浏览器插件等&#xff0c;通过识别网站的响应头信息来获取你的 Nginx 版本号。为了增强服务器的安全和隐私&#xff0c;可以进行隐藏版本号&#xff0c;也可以在 nginx.h 文件中修改服务名称和版…

力扣同类题:重排链表

很明显做过一次 class Solution { public:void reorderList(ListNode* head) {if(!head||!head->next)return;ListNode *fasthead,*lowhead;ListNode *prenullptr,*curnullptr,*nextnullptr;while(fast->next!nullptr){fastfast->next;if(fast->next)fastfast->…

Yolov8-pose关键点检测:特征融合涨点篇 | 广义高效层聚合网络(GELAN) | YOLOv9

💡💡💡本文独家改进:即结合用梯度路径规划(CSPNet)和(ELAN)设计了一种广义的高效层聚合网络(GELAN),高效结合YOLOv8-pose,实现涨点。 将GELAN添加在backbone和head处,提供多个yaml改进方法 Yolov8-Pose关键点检测专栏介绍:https://blog.csdn.net/m0_6377421…

开源组件安全风险及应对

在软件开发的过程中&#xff0c;为了提升开发效率、软件质量和稳定性&#xff0c;并降低开发成本&#xff0c;使用开源组件是开发人员的不二选择&#xff08;实际上&#xff0c;所有软件开发技术的演进都是为了能够更短时间、更低成本地构建软件&#xff09;。这里的开源组件指…

2023年终总结——跌跌撞撞不断修正

目录 一、回顾1.一月&#xff0c;鼓足信心的开始2.二月&#xff0c;焦躁不安3.三月&#xff0c;路还是要一步一步的走4.四月&#xff0c;平平淡淡的前行5.五月&#xff0c;轰轰烈烈的前行6.六月&#xff0c;看事情更底层透彻了7.七月&#xff0c;设计模式升华月8.八月&#xff…