【golang学习笔记 gin 】1.2 redis 的使用

安装redis

go get -u github.com/gin-gonic/gin
go get -u github.com/go-redis/redis/v8

创建相关目录

gotest->conifg->database.go->redis.go->controller ->index.go->model->user.go->router->router.gomain.go 

在这里插入图片描述

封装Redis

package config
import ("github.com/go-redis/redis/v8""context""time"
)
var rdb *redis.Client
var Ctx = context.Background()func InitRedis() {rdb = redis.NewClient(&redis.Options{Addr:     "localhost:6379", // Redis 服务器地址Password: "",                // Redis 密码DB:       0,                 // 选择的数据库})// 检查 Redis 连接_, err := rdb.Ping(Ctx).Result()if err != nil {panic(err)}
}//StringSet 设置字符串
func  Set(key, value string, expiration time.Duration) error {
return rdb.Set(Ctx, key, value, expiration).Err()
}
// StringGet 获取字符串
func  Get(key string) (string, error) {
return rdb.Get(Ctx, key).Result()
}
// StringDel 删除字符串
func  Del(key string) error {
return rdb.Del(Ctx, key).Err()
}
// IncrBy 自增
func IncrBy(key string, value int64)(int64, error){return  rdb.IncrBy(Ctx, key, value).Result()
}
// DecrBy 自减
func DecrBy(key string, value int64)(int64, error){return  rdb.DecrBy(Ctx, key, value).Result()
}
// StringExpire 设置过期时间
func Expire(key string, expiration time.Duration) error {
return rdb.Expire(Ctx, key, expiration).Err()
}
// StringExists 检查是否存在
func StringExists(key string) (bool, error) {
count, err := rdb.Exists(Ctx, key).Result()
return count >
0, err
}// HashSet 设置 hash 字段
func HashSet(key, field, value string) error {
return rdb.HSet(Ctx, key, field, value).Err()
}
// HashMSet 批量设置 hash
func HashMSet(key string, fields map[string]interface{
}) error {
return rdb.HMSet(Ctx, key, fields).Err()
}
// HashGet 获取 hash 字段
func HashGet(key, field string) (string, error) {
return rdb.HGet(Ctx, key, field).Result()
}
// HashGetAll 获取所有字段
func HashGetAll(key string) (map[string]string, error) {
return rdb.HGetAll(Ctx, key).Result()
}
// HashDel 删除字段
func HashDel(key string, fields ...string) error {
return rdb.HDel(Ctx, key, fields...).Err()
}
// HashExists 判断字段是否存在
func HashExists(key, field string) (bool, error) {
exists, err := rdb.HExists(Ctx, key, field).Result()
return exists, err
}
// HashIncrBy 自增 hash 字段
func HashIncrBy(key, field string, value int64) (int64, error) {
return rdb.HIncrBy(Ctx, key, field, value).Result()
}// ListLPush 从左侧插入
func ListLPush(key string, values ...interface{
}) error {
return rdb.LPush(Ctx, key, values...).Err()
}
// ListRPush 从右侧插入
func ListRPush(key string, values ...interface{
}) error {
return rdb.RPush(Ctx, key, values...).Err()
}
// ListLPop 从左侧弹出
func ListLPop(key string) (string, error) {
return rdb.LPop(Ctx, key).Result()
}
// ListRPop 从右侧弹出
func ListRPop(key string) (string, error) {
return rdb.RPop(Ctx, key).Result()
}
// ListRange 获取范围 [start, stop]
func ListRange(key string, start, stop int64) ([]string, error) {
return rdb.LRange(Ctx, key, start, stop).Result()
}
// ListLen 获取长度
func ListLen(key string) (int64, error) {
return rdb.LLen(Ctx, key).Result()
}
// ListDel 删除整个 list
func ListDel(key string) error {
return rdb.Del(Ctx, key).Err()
}// SetAdd 添加元素
func SetAdd(key string, members ...interface{
}) error {
return rdb.SAdd(Ctx, key, members...).Err()
}
// SetMembers 获取所有元素
func SetMembers(key string) ([]string, error) {
return rdb.SMembers(Ctx, key).Result()
}
// SetIsMember 判断是否是成员
func SetIsMember(key string, member interface{
}) (bool, error) {
exists, err := rdb.SIsMember(Ctx, key, member).Result()
return exists, err
}
// SetRem 删除元素
func SetRem(key string, members ...interface{
}) error {
return rdb.SRem(Ctx, key, members...).Err()
}
// SetCard 获取集合大小
func SetCard(key string) (int64, error) {
return rdb.SCard(Ctx, key).Result()
}
// SetPop 随机弹出一个元素
func SetPop(key string) (string, error) {
return rdb.SPop(Ctx, key).Result()
}// ZAdd 添加元素(score, member)
func ZAdd(key string, members ...*redis.Z) error {
return rdb.ZAdd(Ctx, key, members...).Err()
}
// ZRange 获取升序范围
func ZRange(key string, start, stop int64) ([]string, error) {
return rdb.ZRange(Ctx, key, start, stop).Result()
}
// ZRevRange 获取降序范围
func ZRevRange(key string, start, stop int64) ([]string, error) {
return rdb.ZRevRange(Ctx, key, start, stop).Result()
}
// ZRangeWithScores 获取带分数的元素
func ZRangeWithScores(key string, start, stop int64) ([]redis.Z, error) {
return rdb.ZRangeWithScores(Ctx, key, start, stop).Result()
}
// ZScore 获取成员分数
func ZScore(key, member string) (float64, error) {
return rdb.ZScore(Ctx, key, member).Result()
}
// ZRem 删除成员
func ZRem(key string, members ...string) error {
var interfaceMembers []interface{
}
for _, member := range members {
interfaceMembers = append(interfaceMembers, member)
}
return rdb.ZRem(Ctx, key, interfaceMembers...).Err()
}
// ZCard 获取有序集合大小
func ZCard(key string) (int64, error) {
return rdb.ZCard(Ctx, key).Result()
}
// ZRank 获取升序排名
func ZRank(key, member string) (int64, error) {
return rdb.ZRank(Ctx, key, member).Result()
}
// ZRevRank 获取降序排名
func ZRevRank(key, member string) (int64, error) {
return rdb.ZRevRank(Ctx, key, member).Result()
}

全局引用 main.go

package main
import ("gotest/router""gotest/config"
)func main() {config.InitRedis() // 初始化Redis客户端r := router.SetupRouter() // 使用路由设置函数来初始化路由和中间件等。r.Run(":8080")            // 监听并在 0.0.0.0:8080 上启动服务。默认情况下,Gin使用的是HTTP协议。如果你需要HTTPS,可以使用`r.RunTLS(":8080", "certfile", "keyfile")`。
}

测试调用

package controller
import ("fmt""github.com/gin-gonic/gin""gotest/config""gotest/model"
)
func RedisHandler(c *gin.Context) {key := "name"value := "我成功設置了redis"err := config.Set(key, value,0) // 调用封装好的Set函数if err != nil {c.JSON(500, gin.H{"error": err.Error()})return}name,err := config.Get("name");if err != nil {c.JSON(500, gin.H{"error": err.Error()})return}c.JSON(200, gin.H{"message": "Set success","data":name,})
}
}

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

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

相关文章

Java学习之——“IO流“的进阶流之序列化流的学习

一、核心概念:什么是序列化与反序列化?序列化 (Serialization): 将一个对象(在内存中的状态)转换成一个字节序列的过程。这个字节序列包含了对象的数据、对象的类型以及对象中存储的属性等信息。反序列化 (Deserializa…

机器学习04——决策树(信息增益、信息增益率、ID3、C4.5、CART、剪枝、连续值缺失值处理)

上一章:机器学习03——线性模型 下一章:机器学习05——多分类学习与类别不平衡 机器学习实战项目:【从 0 到 1 落地】机器学习实操项目目录:覆盖入门到进阶,大学生就业 / 竞赛必备 文章目录一、决策树的基本流程&#…

(论文速读)从语言模型到通用智能体

论文题目:From Multimodal LLMs to Generalist Embodied Agents: Methods and Lessons(从多模式大型语言模型到多面手具身代理:方法和教训)会议:CVPR2025摘要:我们研究了多模态大型语言模型(Multimodal Large Language…

【Epiq Solutions】Matchstiq™ G20 和 Matchstiq™ G40 AI SDR

Matchstiq™ G20 和 Matchstiq™ G40 产品简介 Matchstiq™ G20 和 Matchstiq™ G40 是 Epiq Solutions 推出的 紧凑型、高性能软件定义无线电(SDR)平台,专为满足 严苛 SWaP-C(体积、重量、功耗受限)场景下的战术与移动…

基于Echarts+HTML5可视化数据大屏展示-旅游智慧中心

效果展示&#xff1a; 代码结构&#xff1a;主要代码实现 index.html布局 <!DOCTYPE html> <html lang"en" style"font-size: 97.5px;"> <head><meta http-equiv"Content-Type" content"text/html; charsetUTF-8"…

Docker 镜像的使用

1.镜像的基本信息[roothost1 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu latest 802541663949 2 weeks ago 78.1MB hello-world latest 1b44b5a3e06a 4 weeks ago 10.1kB执行 docker images 命令时加上 --no…

网络编程;套接字;TCP通讯;UDP通讯;0909

思维导图TCP服务器端和客户端通讯服务器端 代码#include<myhead.h> #define SER_IP "192.168.109.12"//我的虚拟机的ip #define SER_PORT 8888 int main() {//1.创建一个用于连接的套接字文件描述符int sfd socket(AF_INET,SOCK_STREAM,0);if(sfd-1){perror(&…

贪心算法应用:柔性制造系统(FMS)刀具分配问题详解

Java中的贪心算法应用&#xff1a;柔性制造系统(FMS)刀具分配问题详解 1. 问题背景与定义 柔性制造系统(Flexible Manufacturing System, FMS)是现代智能制造中的关键组成部分&#xff0c;它能够灵活地适应不同产品的生产需求。在FMS中&#xff0c;刀具分配是一个核心优化问题&…

不止是DELETE:MySQL多表关联删除的JOIN语法实战详解

MySQL 的 ​​DELETE​​ 语句用于从数据库表中删除记录。这是一项非常强大且危险的操作&#xff0c;因为一旦执行&#xff0c;数据通常无法恢复。理解其语法和安全实践至关重要。以下是 MySQL 删除语句的详细指南。一、 核心语法&#xff1a;DELETE​​DELETE​​ 语句用于删除…

ubuntu 系統使用過程中黑屏問題分析

背景&#xff1a; 工欲善其事&#xff0c;必先利其器。作为程序员&#xff0c;想要得到更好的发展&#xff0c;遇到问题直接baidu, google 虽然可以得到一些参考或者答案&#xff0c;但是也会降低自己的思考能力&#xff0c;本文以ubuntu 使用过程中黑屏这一问题为背景&#x…

Redis(45)哨兵模式与集群模式有何区别?

Redis 提供了两种高可用性解决方案&#xff1a;哨兵模式和集群模式。它们各自有不同的特点和适用场景。以下是详细的对比和结合代码的示例&#xff1a; 哨兵模式&#xff08;Sentinel&#xff09; 特点高可用性&#xff1a; Sentinel 通过监控、通知、故障转移等功能&#xff0…

微信小程序如何进行分包处理?

目录 分包是什么&#xff1f; 为什么要分包&#xff1f; 分包前后结构对比 具体操作步骤 第 1 步&#xff1a;规划分包结构 第 2 步&#xff1a;修改 app.json 进行配置 第 3 步&#xff1a;创建分包目录并移动文件 第 4 步&#xff1a;处理组件和工具函数的引用 第 5…

Go语言极速入门与精要指南从零到精通的系统化学习路径

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 持续学习&#xff0c;不断…

git 切换仓库后清理分支缓存

我明白了&#xff0c;从您的截图可以看到远程仓库中有 feature/v1.4_20250903 分支&#xff0c;但本地 git branch -r 看不到&#xff0c;这是因为之前更换过仓库地址后需要重新获取远程仓库的所有信息。让我们执行以下步骤来解决这个问题&#xff1a; 首先执行 git fetch --al…

考研倒计时101天---路由选择协议

路由选择协议&#xff1a;RIP 与 OSPFRIP 协议&#xff08;基于距离向量算法&#xff09;RIP&#xff08;Routing Information Protocol&#xff09;是一种内部网关协议&#xff08;IGP&#xff09;&#xff0c;采用距离向量算法进行路由选择。其主要特点如下&#xff1a;工作机…

「类 vs 实例」对比 ,「类 - 原型 - 实例」的关系

坚持的本身就是意义 目录直观类比类 (Class) vs 实例 (Instance)对比表示例代码类 - 原型 - 实例关系图解释&#xff1a;类 (class Person)原型 (Person.prototype)实例 (new Person(...))总结&#xff1a;直观类比 类&#xff08;Class&#xff09; 图纸 / 模板实例&#xf…

第一课、Cocos Creator 3.8 安装与配置

介绍说明 本文主要介绍在windows系统中&#xff0c;安装开发Cocos使用的软件工具&#xff0c;主要包含&#xff1a;安装CocosDashboard控制面板、CocosCreator3.8编辑器和脚本编辑器 VS Code 。 一、Cocos Dashboard 的安装 说明&#xff1a;Cocos Dashboard 主要作用是能够同…

从航空FACE的一个落地方案漫谈汽车HPC软件架构的思维转变(2/3)FACE的“段”同Autosar的“层”概念区别探索

文章目录PART THREE&#xff1a;段和层的概念比较一、“段”更强调“功能闭环责任归属”&#xff0c;而非“单纯的层级堆叠”二、“段”规避“层”的“刚性依赖陷阱”&#xff0c;适配航空系统的“灵活组合需求”三、“段”贴合航空工业的“工程化语言习惯”&#xff0c;降低跨…

金融量化指标--6InformationRatio信息比率

InformationRatio信息比率计算公式添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09;一、信息比率&#xff08;IR&#xff09;是什么&#xff1f;核心概念&#xff1a;信息比率衡量的是投资组合经理相对于某个基准指数&#xff08;Benchmark&#xff09;&…

Java全栈开发面试实录:从基础到微服务的实战经验分享

Java全栈开发面试实录&#xff1a;从基础到微服务的实战经验分享 一、初识面试场景 我叫李明&#xff0c;28岁&#xff0c;毕业于复旦大学计算机科学与技术专业&#xff0c;硕士学历。在互联网行业已经有5年的工作经验&#xff0c;先后在两家中型互联网公司担任Java全栈开发工程…