go中redis使用的簡單介紹

目錄

一、Redis 簡介

二、Go中Redis的使用

1. 安裝Go Redis包

2. 單機模式

連接示例

3. 哨兵模式

依賴

連接示例

三、Redis集群

1. 集群模式

集群部署

部署結構

使用redis-cli創建集群

連接示例

四、常用數據結構與操作

1. 字符串(String)

2. 哈希(Hash)

3. 列表(List)

4. 集合(Set)

5. 有序集合(ZSet)

五、事務與批量操作

1. 事務

2. 管道技術

六、高可用性

1. 復制(主從)

2. 故障轉移

3. 連接池

七、監控與性能調優

1. 內置工具

2. 性能指標

3. 調試

八、實際案例

1. 高并發秒殺系統

說明

九、最佳實踐

1. 數據過期時間

2. 內存管理

3. 日志配置

4. 安全性

5. 監控

6. 備份恢復

7. 連接池管理

8. 數據持久化

十、總結


在Go語言中使用Redis進行數據存儲和管理可以帶來高效和靈活的優勢。下面的講解包括單機模式、哨兵模式和集群模式的部署及使用。


一、Redis 簡介

Redis是一個高性能的內存數據庫,支持多種數據結構,如字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(ZSet)等。它還支持事務、批量操作和流式數據處理。Redis常用于緩存、實時數據處理、計數器、消息隊列等場景。


二、Go中Redis的使用

1. 安裝Go Redis包

推薦使用github.com/go-redis/redis/v9,它支持單機、哨兵和集群模式。

安裝命令:

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

2. 單機模式

特點:單一Redis實例,簡單易用,適合開發和測試環境。

連接示例

package mainimport ("context""fmt""github.com/go-redis/redis/v9"
)func main() {ctx := context.Background()client := redis.NewClient(&redis.Options{Addr:     "localhost:6379",Password: "",DB:       0,})pong, err := client.Ping(ctx).Result()if err != nil {fmt.Printf("連接失敗:%v\n", err)return}fmt.Println(pong)  // 輸出:PONG// 示例:設置和獲取值if err := client.Set(ctx, "key", "value", 0).Err(); err != nil {fmt.Printf("設置失敗:%v\n", err)return}val, err := client.Get(ctx, "key").Result()if err != nil {fmt.Printf("獲取失敗:%v\n", err)return}fmt.Printf("值:%v\n", val)
}

說明

  • 使用redis.NewClient創建客戶端。
  • 使用Ping測試連接。
  • Set設置鍵值,Get讀取值。

3. 哨兵模式

特點:提供高可用性,當主庫故障時,自動故障轉移。

依賴

  • 必須安裝Redis哨兵服務。

連接示例

package mainimport ("context""fmt""github.com/go-redis/redis/v9"
)func main() {ctx := context.Background()client := redis.NewFailoverClient(&redis.FailoverOptions{MasterName:    "mymaster",SentinelAddrs: []string{"localhost:26379", "localhost:26380", "localhost:26381"},})pong, err := client.Ping(ctx).Result()if err != nil {fmt.Printf("連接失敗:%v\n", err)return}fmt.Println(pong)// 示例:設置和獲取值if err := client.Set(ctx, "key", "value", 0).Err(); err != nil {fmt.Printf("設置失敗:%v\n", err)return}val, err := client.Get(ctx, "key").Result()if err != nil {fmt.Printf("獲取失敗:%v\n", err)return}fmt.Printf("值:%v\n", val)
}

說明

  • 使用redis.NewFailoverClient創建客戶端。
  • 指定主庫名稱MasterName和哨兵地址。
  • 當主庫故障時,哨兵會自動將從庫提升為主庫。

三、Redis集群

1. 集群模式

特點:通過分片實現水平擴展,每個節點處理一部分數據,適合高并發場景。

集群部署

部署結構
  • 6節點:3主3從,每個主節點負責一個分片。
  • 每個分片有1主1從。
使用redis-cli創建集群
  1. 啟動6個Redis實例,分別指定不同端口。
  2. 使用redis-cli命令創建集群。

創建集局腳本:例如?start_cluster.sh

# 啟動6個節點,端口分別為30001到30006
for port in {30001..30006}; doredis-server --cluster-enabled yes --cluster-config-file node-${port}.conf --port ${port} --daemonize yes
done# 創建集群
redis-cli --cluster create 127.0.0.1:30001 127.0.0.1:30002 127.0.0.1:30003 127.0.0.1:30004 127.0.0.1:30005 127.0.0.1:30006 --cluster-replicas 1

在上面的腳本中,node-${port}.conf 是 Redis 集群模式下每個節點的配置文件,用于指定節點的運行參數。如果這些配置文件不存在,Redis 會自動生成一個默認的配置文件,但為了確保集群部署的正確性,最好手動創建這些配置文件。

例如:

# node-30001.conf
cluster-enabled yes
port 30001
bind 127.0.0.1
daemonize yes
logfile /var/log/redis/redis_30001.log
dir ./data/30001
save 60 1
appendonly yes

解釋:

  • cluster-enabled yes: 啟用集群模式。
  • port: 指定當前節點的端口。
  • bind: 綁定主機地址。
  • daemonize yes: 后臺運行。
  • logfile: 指定日志文件路徑。
  • dir: 指定數據文件存儲路徑。
  • save: 配置數據持久化策略。
  • appendonly: 啟用 AOF 持久化。

然后給腳本賦予執行權限并運行:

chmod +x start_cluster.sh
./start_cluster.sh

連接示例

package mainimport ("context""fmt""github.com/go-redis/redis/v9"
)func main() {// 集群節點地址addresses := []string{"localhost:30001","localhost:30002","localhost:30003","localhost:30004","localhost:30005","localhost:30006",}clusterClient := redis.NewClusterClient(&redis.ClusterOptions{Addrs: addresses,})pong, err := clusterClient.Ping(context.Background()).Result()if err != nil {fmt.Printf("連接失敗:%v\n", err)return}fmt.Println(pong)// 設置鍵值對if err := clusterClient.Set(context.Background(), "key", "value", 0).Err(); err != nil {fmt.Printf("設置失敗:%v\n", err)return}// 獲取值val, err := clusterClient.Get(context.Background(), "key").Result()if err != nil {fmt.Printf("獲取失敗:%v\n", err)return}fmt.Printf("值:%v\n", val)
}

說明

  • 使用redis.NewClusterClient創建集群客戶端。
  • 初始化時提供所有節點地址。
  • 集群模式下,Redis自動處理數據分片和請求路由。

四、常用數據結構與操作

1. 字符串(String)

// 設置過期時間
err = client.Set(context.Background(), "key", "value", 10*time.Second).Err()// 遞增計數器
num, err := client.Incr(context.Background(), "counter").Result()// 遞減計數器
num, err := client.Decr(context.Background(), "counter").Result()

2. 哈希(Hash)

// 設置字段值
err = client.HSet(context.Background(), "hashKey", "field", "value").Err()// 獲取字段值
value, err := client.HGet(context.Background(), "hashKey", "field").Result()

3. 列表(List)

// 從左邊推入元素
err = client.LPush(context.Background(), "listKey", "value").Err()// 彈出左邊第一個元素
value, err := client.LPop(context.Background(), "listKey").Result()

4. 集合(Set)

// 添加元素
err = client.SAdd(context.Background(), "setKey", "element").Err()// 移除元素
err = client.SRem(context.Background(), "setKey", "element").Err()// 獲取所有元素
members, err := client.SMembers(context.Background(), "setKey").Result()

5. 有序集合(ZSet)

// 添加元素并設置分數
err = client.ZAdd(context.Background(), "zsetKey", &redis.Z{Member: "element", Score: 100}).Err()// 獲取元素的分數
score, err := client.ZScore(context.Background(), "zsetKey", "element").Result()// 獲取排名
rank, err := client.ZRank(context.Background(), "zsetKey", "element").Result()

五、事務與批量操作

1. 事務

// 開始事務
ctx := context.Background()
tx, err := client.Tx(ctx)// 執行事務中的操作
_, err = tx.Pipeline()(function(ctx context.Context) (_redis.CMDCb, error) {_, err := tx.Get(ctx, "balance").Result()if err != nil {return nil, err}_, err := tx.Incr(ctx, "balance").Result()if err != nil {return nil, err}return nil, nil},
)if err != nil {fmt.Printf("事務執行失敗:%v\n", err)
}

2. 管道技術

// 創建管道
pipe := client.Pipeline()// 執行多個命令
cmds, err := pipe.Set(context.Background(), "key1", "value1", 0).Set(context.Background(), "key2", "value2", 0).Exec(context.Background())if err != nil {fmt.Printf("管道執行失敗:%v\n", err)return
}// 打印結果
for _, cmd := range cmds {fmt.Printf("%v\n", cmd)
}

六、高可用性

1. 復制(主從)

  • 設置主從復制,確保數據安全。
  • 主庫寫入,數據同步到從庫。
  • 從庫可用于讀分離,提高讀性能。

2. 故障轉移

  • 使用哨兵模式實現自動故障轉移。
  • 集群模式下,節點故障自動遷移。

3. 連接池

// 配置連接池
pool := &redis.Pool{Dial: func(context.Context) (redis.Conn, error) {return client.DialContext(context.Background())},MaxActive:   10,  // 最大活躍連接數MaxIdle:      5,   // 最大空閑連接數IdleTimeout: 5 * time.Minute,
}// 使用連接池
conn := pool.Get(context.Background())
defer conn.Close()

七、監控與性能調優

1. 內置工具

  • redis-cli: 命令行工具,執行各種Redis命令。
  • redis-benchmark: 性能基準測試工具。
# 基準測試
redis-benchmark -h 127.0.0.1 -p 6379 -t set,lpush -n 10000 -q

2. 性能指標

  • 內存使用: 使用info memory查看內存狀態。
  • 拒絕策略: 配置maxmemory-policy避免內存溢出。
  • 過期時間: 設置合理的expire,控制鍵生命周期。

3. 調試

  • 使用slowlog記錄慢查詢。
  • 監控blocked clientsmaster_repl_offset

八、實際案例

1. 高并發秒殺系統

需求:在高并發下,確保商品庫存正確。

解決方案

  • 使用Redis的事務和分布鎖。
  • 數據結構:Hash存儲商品庫存。
package mainimport ("context""fmt""sync""time""github.com/go-redis/redis/v9"
)// 秒殺函數
func doSecKill(ctx context.Context, client *redis.Client, productId string, userId string) (bool, error) {// 鎖名稱:秒殺鎖lockKey := "lock:sec:kill"// 商品庫存KeystockKey := "stock:" + productId// 嘗試獲取鎖,防止超賣lock, err := client.LockNew(lockKey, 100*time.Millisecond).Acquire(ctx, time.Second*5).Result()if err != nil {return false, err}defer lock.Release(ctx)// 檢查庫存是否充足currentStock, err := client.HGet(ctx, stockKey, "quantity").Int64()if err != nil || currentStock <= 0 {return false, fmt.Errorf("庫存不足")}// 減少庫存_, err = client.HIncrBy(ctx, stockKey, "quantity", -1).Result()if err != nil {return false, fmt.Errorf("秒殺失敗:%v", err)}return true, nil
}func main() {client := redis.NewClient(&redis.Options{Addr:     "localhost:6379",Password: "",DB:       0,})var wg sync.WaitGroupfor i := 0; i < 100; i++ {wg.Add(1)go func(userId int) {defer wg.Done()ctx := context.Background()success, err := doSecKill(ctx, client, "product001", fmt.Sprintf("user%d", userId))if success {fmt.Printf("用戶%d秒殺成功\n", userId)} else {fmt.Printf("用戶%d秒殺失敗:%v\n", userId, err)}}(i)}wg.Wait()
}

說明

  • 使用Redis的分布鎖確保秒殺過程的原子性。
  • 使用Hash結構存儲庫存信息,實現并發安全的扣減操作。

九、最佳實踐

1. 數據過期時間

  • 為鍵設置合理的TTL,避免內存膨脹。

2. 內存管理

  • 監控used_memory,確保內存使用在可控范圍內。
  • 配置maxmemorymaxmemory-policy

3. 日志配置

  • 開啟Redis日志,記錄操作和錯誤信息。
  • 使用slowlog跟蹤慢查詢。

4. 安全性

  • 設置強密碼。
  • 配置防火墻,限制訪問來源。

5. 監控

  • 使用Prometheus、Grafana監控Redis性能。
  • AlertManager配置告警規則。

6. 備份恢復

  • 定期備份RDB或AOF文件。
  • 配置主從復制,確保數據安全。

7. 連接池管理

  • 合理配置連接池參數,避免連接耗盡。

8. 數據持久化

  • 選擇RDB或AOF,根據需求配置持久化策略。

十、總結

在Go語言中使用Redis,特別是結合哨兵和集群模式,可以實現高可用和高擴展性的系統。合理選擇數據結構,使用事務和管道技術,可以提升性能。同時,注重監控和維護,確保Redis的穩定運行。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903233.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903233.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903233.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

北京工業大學25計專上岸經驗分享

1.個人情況介紹 本科就讀于河北雙非&#xff0c;專業為計算機科學與技術&#xff0c;四級三次498&#xff0c;六級兩次460&#xff0c;拿過幾次校級獎學金&#xff0c;競賽經歷有藍橋杯國三、數學競賽省二。本科成績排名靠前&#xff0c;保研保7排8&#xff0c;遺憾選擇考研繼…

在 Ubuntu 24.04 系統上安裝和管理 Nginx

1、安裝Nginx 在Ubuntu 24.04系統上安裝Nginx&#xff0c;可以按照下面的步驟進行&#xff1a; 1.1、 更新系統軟件包列表 在安裝新軟件之前&#xff0c;需要先更新系統的軟件包列表&#xff0c;確保獲取到最新的軟件包信息。打開終端&#xff0c;執行以下命令&#xff1a; …

HarmonyOS4+NEXT星河版入門與項目實戰(26)-----版本控制與代碼托管

引言 隨著移動應用開發技術的不斷進步,華為推出的鴻蒙操作系統(HarmonyOS)以及其配套的集成開發環境DevEco Studio逐漸成為開發者關注的焦點。對于新手開發者來說,掌握版本控制和代碼托管不僅是提高工作效率的關鍵,也是團隊協作的重要基礎。本文將介紹如何在使用DevEco S…

利用Arcgis自己繪制shp文件

1.選擇自己想要創建的shp文件的位置 我是直接創建在連接文件夾中 2.右鍵-新建-shp 3.設置名稱、要素類型、空間參考 4、點擊創建要素 5、右側選擇圖層、創建面 6、開始繪制&#xff0c;雙擊任意位置結束繪制 之后可以改一下shp文件的名字

【C/C++】深入理解指針(六)

文章目錄 深入理解指針(六)1.sizeof和strlen的對比1.1 sizeof1.2 strlen1.3 sizeof和strlen的對? 2.數組和指針筆試題解析2.1 ?維數組2.2 字符數組代碼1&#xff1a;代碼2&#xff1a;代碼3&#xff1a;代碼4&#xff1a;代碼5&#xff1a;代碼6&#xff1a; 2.3 ?維數組 3.…

探索大語言模型(LLM):語言模型從海量文本中無師自通

文章目錄 引言&#xff1a;當語言模型學會“自己教自己”一、自監督學習&#xff1a;從“無標簽”中挖掘“有監督”信號二、語言模型的自監督訓練范式&#xff1a;兩大經典路徑1. 掩碼語言模型&#xff08;Masked Language Modeling, MLM&#xff09;——以BERT為例2. 自回歸語…

2025.5.4機器學習筆記:PINN文獻閱讀

2025.5.4周報 文獻閱讀題目信息摘要創新點網絡架構實驗結論不足以及展望 文獻閱讀 題目信息 題目&#xff1a; Physics-Informed Neural Network Approach for Solving the One-Dimensional Unsteady Shallow-Water Equations in Riverine Systems期刊&#xff1a; Journal o…

Unity Post Processing 小記 【使用泛光實現燈光亮度效果】

一、前言 本篇適用于Unity 2018 - 2019及以上版本&#xff0c;以默認渲染管線為例。文章內容源于個人研究嘗試與網絡資料收集&#xff0c;可能存在不準確之處。初衷是因新版本制作時老的Bloom插件失效&#xff0c;經研究后分享開啟Bloom效果的方法。若在項目中使用Post Proces…

牟乃夏《ArcGIS Engine地理信息系統開發教程》學習筆記3-地圖基本操作與實戰案例

目錄 一、開發環境與框架搭建 二、地圖數據加載與文檔管理 1. 加載地圖文檔&#xff08;MXD&#xff09; 2. 動態添加數據源 三、地圖瀏覽與交互操作 1. 基礎導航功能 2. 書簽管理 3. 量測功能 四、要素選擇與屬性查詢 1. 屬性查詢 2. 空間查詢 五、視圖同步與鷹眼…

Qt指ModbusTcp協議的使用

Modbus 是一套通信“語言”&#xff08;協議&#xff09;&#xff0c;而 RS485 / RS232 / TCP 是通信“管道”&#xff08;物理接口&#xff09;。 編寫modubusTcp程序&#xff0c;避免不了調試&#xff0c;首先用到的兩個工具助手 poll是主機,slave是從機。主機也就是發送數據…

探索大語言模型(LLM):自監督學習——從數據內在規律中解鎖AI的“自學”密碼

文章目錄 自監督學習&#xff1a;從數據內在規律中解鎖AI的“自學”密碼一、自監督學習的技術內核&#xff1a;用數據“自問自答”1. 語言建模&#xff1a;預測下一個單詞2. 掩碼語言模型&#xff08;MLM&#xff09;&#xff1a;填補文本空缺3. 句子順序預測&#xff08;SOP&a…

CentOS7.9安裝Python 3.10.11并包含OpenSSL1.1.1t

1. 安裝編譯 Python 所需的依賴包 yum -y install gcc make zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel libffi-devel wget2. 安裝 OpenSSL 1.1.1 或更新版本 &#xff08;自定義路徑安裝的 OpenSSL 1.1.1 不會影響系統原有的…

qt事件過濾與傳遞機制

當點擊 QLabel 時&#xff0c;正常情況下并不會直接觸發 MyWidget 的 mousePressEvent 函數&#xff0c;原因在于事件的傳遞機制和事件過濾器的存在。下面詳細分析這個過程&#xff1a; 事件傳遞機制 在 Qt 里&#xff0c;事件的傳遞是從子控件往父控件冒泡的。不過&#xff…

ubuntu 安裝ollama后,如何讓外網訪問?

官網下載linux版本&#xff1a;https://ollama.com/download/linux 1、一鍵安裝和運行 curl -fsSL https://ollama.com/install.sh | sh 2、下載和啟動deepseek-r1大模型 ollama run deepseek-r1 這種方式的ollama是systemd形式的服務&#xff0c;會隨即啟動。默認開啟了 …

kotlin與MVVM結合使用總結(三)

1. MVVM 架構詳細介紹及源碼層面理解 整體架構 MVVM&#xff08;Model - View - ViewModel&#xff09;架構是為了解決視圖和數據模型之間的耦合問題而設計的。它通過引入 ViewModel 作為中間層&#xff0c;實現了視圖和數據的分離&#xff0c;提高了代碼的可維護性和可測試性…

A系統使用iframe嵌套B系統時登錄跨域問題!

我這邊兩個項目都是獨立的&#xff0c;問題是做了跨域配置之后點擊登錄接口調用成功但是頁面沒有跳轉進去 顯示以下報錯 這個錯誤明確指出了問題的核心原因&#xff1a;由于跨站點Cookie設置未正確聲明SameSiteNone&#xff0c;導致瀏覽器攔截了Cookie。這是現代瀏覽器&#x…

消息唯一ID算法參考

VUE // src/utils/idGenerator.js/*** 雪花算法風格的 ID 生成器**//*** 前綴 w代表web端,m代表手機端**/ const DEFAULT_PREFIX = w; const DEFAULT_TOTAL_LENGTH = 16; const CHARS

《WebGIS之Vue零基礎教程》(5)計算屬性與偵聽器

1 計算屬性 1) 什么是計算屬性 :::info 計算屬性就是基于現有屬性計算后的屬性 ::: 2) 計算屬性的作用 計算屬性用于對原始數據的再次加工 3) 案例 :::warning **需求** 實現如下效果 ::: 使用表達式實現 html Document 請輸入一個字符串: 反轉后的字符串: {{msg.split(…

洞悉 NGINX ngx_http_access_module基于 IP 的訪問控制實戰指南

一、模塊概述 ngx_http_access_module 是 NGINX 核心模塊之一&#xff0c;用于基于客戶端 IP 地址或 UNIX 域套接字限制訪問。它通過簡單的 allow/deny 規則&#xff0c;對請求進行最先匹配原則的過濾。與基于密碼&#xff08;auth_basic&#xff09;、子請求&#xff08;auth…

數據中臺-數據質量管理系統:從架構到實戰

一、數據質量管理系統核心優勢解析? ? (一)可視化驅動的敏捷數據治理? 在數據治理的復雜流程中,Kettle 的 Spoon 圖形化界面堪稱一把利器,為數據工程師們帶來了前所未有的便捷體驗。想象一下,你不再需要花費大量時間和精力去編寫冗長且復雜的 SQL 腳本,只需通過簡單…