【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
英文地址,請注明出處:http://en.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全棧開發工程…