30天學會Go--第7天 GO語言 Redis 學習與實踐

30天學會Go–第7天 GO語言 Redis 學習與實踐

文章目錄

  • 30天學會Go--第7天 GO語言 Redis 學習與實踐
    • 前言
    • 一、Redis 基礎知識
      • 1.1 Redis 的核心特性
      • 1.2 Redis 常見使用場景
    • 二、安裝 Redis
      • 2.1 在 Linux 上安裝
      • 2.2 在 Windows 上安裝
      • 2.3 使用 Docker 安裝 Redis
    • 三、Redis 常用命令
      • 3.1 基本操作
      • 3.2 數據結構操作
        • 字符串(String)
        • 哈希(Hash)
        • 列表(List)
        • 集合(Set)
        • 有序集合(Sorted Set)
    • 四、在 Go 中使用 Redis
      • 4.1 安裝 go-redis
      • 4.2 使用示例
        • 代碼示例
      • 4.3 代碼解讀
    • 五、Redis 高級功能
      • 5.1 發布/訂閱(Pub/Sub)
        • 代碼示例
      • 5.2 使用 Redis 實現分布式鎖
        • 代碼示例
    • 六、總結

前言

Redis 是一個高性能的開源內存數據庫,常用于緩存、消息隊列、會話存儲等場景。它支持多種數據結構(如字符串、哈希、列表、集合、有序集合等)和豐富的操作命令,具有極高的性能和靈活性。

以下是 Redis 的基礎知識、安裝、常用命令,以及在 Go 中使用 Redis 的方法。

go語言官方編程指南:https://pkg.go.dev/stdopen in new window

go語言的官方文檔學習筆記很全,推薦去官網學習

30天學會Go–第7天 GO語言 Redis 學習與實踐(改):30天學會Go–第7天 GO語言 Redis 學習與實踐(改)

本章講redis有所欠缺,請移步新的blog

30天學會Go–第6天 GO語言 RESTful API 學習與實踐:30天學會Go–第6天 GO語言 RESTful API 學習與實踐-CSDN博客


一、Redis 基礎知識

1.1 Redis 的核心特性

  • 內存存儲:所有數據存儲在內存中,讀寫速度極快。
  • 多種數據結構:支持字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)等。
  • 持久化:支持將內存數據持久化到磁盤(RDB 和 AOF 兩種方式)。
  • 高可用:支持主從復制、哨兵模式和集群模式,提供高可用性和擴展性。
  • 豐富的功能:如發布/訂閱(Pub/Sub)、事務、Lua 腳本等。

1.2 Redis 常見使用場景

  • 緩存:將經常訪問的數據存儲到 Redis 中,提高讀取性能。
  • 會話存儲:存儲用戶登錄狀態等會話信息。
  • 排行榜:利用有序集合(Sorted Set)實現排行榜功能。
  • 消息隊列:使用列表(List)或發布/訂閱功能實現消息隊列。
  • 分布式鎖:利用 Redis 的原子操作實現分布式鎖。

二、安裝 Redis

2.1 在 Linux 上安裝

  1. 下載 Redis:
    wget http://download.redis.io/redis-stable.tar.gz
    
  2. 解壓并編譯:
    tar xzf redis-stable.tar.gz
    cd redis-stable
    make
    
  3. 啟動 Redis:
    src/redis-server
    

2.2 在 Windows 上安裝

  1. 下載 Redis for Windows:
    • Redis 官方不支持 Windows,但可以下載社區版:https://github.com/microsoftarchive/redis/releases
  2. 解壓后運行 redis-server.exe 啟動服務。

2.3 使用 Docker 安裝 Redis

  1. 拉取 Redis 鏡像:
    docker pull redis
    
  2. 啟動 Redis 容器:
    docker run -d --name redis -p 6379:6379 redis
    

三、Redis 常用命令

3.1 基本操作

  • 連接 Redis

    redis-cli
    
  • 設置鍵值對

    SET key value
    
  • 獲取鍵值

    GET key
    
  • 刪除鍵

    DEL key
    
  • 檢查鍵是否存在

    EXISTS key
    
  • 設置過期時間(秒)

    EXPIRE key seconds
    
  • 查看剩余過期時間

    TTL key
    

3.2 數據結構操作

字符串(String)
  • 增加值(適用于數值類型)

    INCR key
    INCRBY key increment
    DECR key
    DECRBY key decrement
    
哈希(Hash)
  • 設置哈希字段
    HSET key field value
    
  • 獲取哈希字段值
    HGET key field
    
  • 獲取所有字段和值
    HGETALL key
    
列表(List)
  • 從左插入元素

    LPUSH key value1 value2
    
  • 從右插入元素

    RPUSH key value1 value2
    
  • 獲取列表范圍內的元素

    LRANGE key start stop
    
  • 彈出最左邊的元素

    LPOP key
    
集合(Set)
  • 添加元素到集合
    SADD key member1 member2
    
  • 獲取集合中的所有元素
    SMEMBERS key
    
  • 檢查元素是否存在
    SISMEMBER key member
    
有序集合(Sorted Set)
  • 添加元素并設置分數
    ZADD key score1 member1 score2 member2
    
  • 獲取有序集合中的元素
    ZRANGE key start stop WITHSCORES
    

四、在 Go 中使用 Redis

在 Go 中使用 Redis,通常使用第三方庫 go-redis。

4.1 安裝 go-redis

運行以下命令安裝:

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

4.2 使用示例

以下是一個簡單的示例,展示如何在 Go 中使用 Redis。

代碼示例
package mainimport ("context""fmt""github.com/redis/go-redis/v9"
)var ctx = context.Background()func main() {// 1. 連接到 Redisrdb := redis.NewClient(&redis.Options{Addr:     "localhost:6379", // Redis 地址Password: "",               // 如果沒有設置密碼,留空DB:       0,                // 使用默認數據庫})// 2. 寫入數據err := rdb.Set(ctx, "key", "value", 0).Err()if err != nil {panic(err)}// 3. 讀取數據val, err := rdb.Get(ctx, "key").Result()if err != nil {panic(err)}fmt.Println("key:", val)// 4. 檢查鍵是否存在exists, err := rdb.Exists(ctx, "key").Result()if err != nil {panic(err)}fmt.Println("key exists:", exists)// 5. 刪除鍵err = rdb.Del(ctx, "key").Err()if err != nil {panic(err)}fmt.Println("key deleted")
}

4.3 代碼解讀

  1. 連接 Redis

    • 使用 redis.NewClient 創建 Redis 客戶端。
    • 配置地址、密碼和數據庫編號。
  2. 寫入數據

    • 使用 Set 方法寫入鍵值對。
    • 第三個參數為過期時間,0 表示不過期。
  3. 讀取數據

    • 使用 Get 方法讀取鍵的值。
  4. 檢查鍵是否存在

    • 使用 Exists 方法檢查鍵是否存在。
  5. 刪除鍵

    • 使用 Del 方法刪除鍵。

五、Redis 高級功能

5.1 發布/訂閱(Pub/Sub)

Redis 支持發布/訂閱模式,可以實現消息廣播。

代碼示例
// 發布消息
rdb.Publish(ctx, "channel1", "Hello, Redis!").Err()// 訂閱消息
sub := rdb.Subscribe(ctx, "channel1")
ch := sub.Channel()
for msg := range ch {fmt.Println("Received message:", msg.Payload)
}

5.2 使用 Redis 實現分布式鎖

Redis 的原子操作可以用來實現分布式鎖。

代碼示例
// 加鎖
ok, err := rdb.SetNX(ctx, "lock_key", "lock_value", 10*time.Second).Result()
if err != nil || !ok {fmt.Println("Failed to acquire lock")return
}// 執行業務邏輯
fmt.Println("Lock acquired, executing task...")// 解鎖
rdb.Del(ctx, "lock_key")

六、總結

Redis 是一個功能強大且靈活的內存數據庫,在 Go 中使用 Redis 非常簡單。通過學習 Redis 的基本命令和在 Go 中的集成,你可以輕松實現緩存、消息隊列、分布式鎖等功能。

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

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

相關文章

Vue項目開發 如何實現父組件與子組件數據間的雙向綁定?

在 Vue.js 中,實現父組件與子組件數據之間的雙向綁定,可以通過以下幾種方式。下面我將介紹幾種常見的方法,并解釋它們的實現原理和適用場景。 1. 使用 v-model 實現雙向綁定 v-model 是 Vue.js 中最常見的雙向綁定方式,它可以使…

React第十七章(useRef)

useRef 當你在React中需要處理DOM元素或需要在組件渲染之間保持持久性數據時,便可以使用useRef。 import { useRef } from react; const refValue useRef(initialValue) refValue.current // 訪問ref的值 類似于vue的ref,Vue的ref是.value,其次就是vu…

【C++】內存分布、new、delete、 operator new、operator delete

內存分布 在C語言和C中,程序內存被劃分成六個部分: 內核空間、棧、內存映射段、堆、數據段、代碼段 棧:又稱堆棧,主要為非靜態局部變量、函數參數、返回值等,棧的生長方向是向下生長的 內存映射段:高效的…

代碼隨想錄算法訓練營day37|動態規劃part5

今天的幾道題目都比較簡單,思路也比較相似,都是利用完全背包。完全背包和01背包的不同點在于完全背包每個元素可以取多次,而01背包只能取1次,所以在dp一維數組遍歷時,完全背包仍然要從前往后遍歷,并且無論是…

混合云策略在安全領域受到青睞

Genetec 發布了《2025 年物理安全狀況報告》,該報告根據超過 5,600 名該領域領導者(其中包括 100 多名來自澳大利亞和新西蘭的領導者)的回應,揭示了物理安全運營的趨勢。 報告發現,澳大利亞和新西蘭的組織采用混合云策…

FastAPI解決跨域報錯net::ERR_FAILED 200 (OK)

目錄 一、跨域問題的本質 二、FastAPI中的CORS處理 1. 安裝FastAPI和CORS中間件 2. 配置CORS中間件 3. 運行FastAPI應用 三、解決跨域報錯的步驟 四、案例:解決Vue.js與FastAPI的跨域問題 1. Vue.js前端應用 2. FastAPI后端API 3. 配置CORS中間件 4. 運行和測試 五…

為什么 JavaScript 中的 `new` 運算符報錯?

在 JavaScript 中,new 運算符通常用于創建一個新對象并調用構造函數來初始化對象。然而,new 運算符可能會引發一些錯誤,通常是由于以下原因導致的: 構造函數沒有正確的定義: 如果使用 new 運算符調用的函數沒有正確地定…

霍爾效應電流傳感器

適用于大電流,低功耗的電流檢測: TVS選型: RS232的隔離電路: 單片機采集200伏高壓 如何做隔離電路: 采用線性光電耦合器HCNR200實現高壓直流母線電壓的精確采樣。還是用電阻分壓,只是在ADC檢測階段加上隔離芯片:

如何設置Java爬蟲的異常處理?

在Java爬蟲中設置異常處理是非常重要的,因為網絡請求可能會遇到各種問題,如連接超時、服務器錯誤、網絡中斷等。通過合理的異常處理,可以確保爬蟲的穩定性和健壯性。以下是如何在Java爬蟲中設置異常處理的步驟和最佳實踐: 1. 使用…

ceph /etc/ceph-csi-config/config.json: no such file or directory

環境 rook-ceph 部署的 ceph。 問題 kubectl describe pod dragonfly-redis-master-0Warning FailedMount 7m59s (x20 over 46m) kubelet MountVolume.MountDevice failed for volume "pvc-c63e159a-c940-4001-bf0d-e6141634cc55" : rpc error: cod…

【計網筆記】習題

物理層 不屬于物理層接口規范定義范疇的是(C) A. 接口形狀 B. 引腳功能 C. 物理地址 D. 信號電平 【2023-912】光網絡只能通過導向型介質傳播。() 【2017-408】若信道在無噪聲情況下的極限數據傳輸速率不小于信噪比為30dB條件下的…

最新 AI 編程工具全面對比:v0、Bolt.new、Cursor、Windsurf

隨著人工智能的快速發展,越來越多的 AI 驅動的開發工具應運而生,旨在提升開發效率、優化開發流程,并減輕開發者的工作負擔。在這個背景下,四款新興的 AI 編程工具:v0、Bolt.new、Cursor 和 Windsurf,各具特…

【C++算法】35.位運算_兩整數之和

文章目錄 題目鏈接:題目描述:解法C 算法代碼: 題目鏈接: 371. 兩整數之和 題目描述: 解法 筆試的話直接 return ab; 接下來講一下這題的解法: 位運算(異或運算-無進位相加&#xff…

PyCharm+Selenium+Pytest配置小記

1、下載ChromeDriver: Chrome130以后的Driver下載: Chrome for Testing availabilityhttps://googlechromelabs.github.io/chrome-for-testing/ (1)查看自己Crome瀏覽器的版本:設置-->關于 Chrome; &…

【C++】虛函數

類中聲明函數成員的時候,在函數的前面加上virtual關鍵字,則該成員為虛函數 虛函數的特點 如果在類中定義的虛函數,那么系統會為這個類維護一個虛函數表類中會多出4個字節的指針去指向這個虛函數表,在虛函數表中保存了虛函數的首…

如何在UI自動化測試中創建穩定的定位器?

如何在UI自動化測試中創建穩定的定位器? 前言1. 避免使用絕對路徑2. 避免在定位器中使用索引3. 避免多個類名的定位器4. 避免動態和自動生成的ID5. 確保定位器唯一6. 處理隱藏元素的策略7. 謹慎使用基于文本的定位器8. 使用AI創建穩定的定位器 總結 前言 在自動化測…

明日宣講 香港科技大學廣州|數據科學與分析學域碩博招生宣講會【湖南大學專場】

📣📣📣明日宣講 香港科技大學廣州|數據科學與分析學域碩博招生宣講會【湖南大學專場】 時間:2024年12月10日(星期二)15:00 地點:湖南大學信息科學與工程學院624會議室 報名鏈接&…

BurpSuite-8(FakeIP與爬蟲審計)

聲明:學習視頻來自b站up主 瀧羽sec,如涉及侵權馬上刪除文章 感謝瀧羽sec 團隊的教學 視頻地址:IP偽造和爬蟲審計_嗶哩嗶哩_bilibili 一、FakeIP 1.配置環境 BurpSuite是java環境下編寫的,而今天的插件是python編寫的&#xff0c…

2024 一帶一路暨金磚國家技能發展與技術創新大賽【網絡安全防護治理實戰技能賽項】樣題(中職組)

2024 一帶一路暨金磚國家技能發展與技術創新大賽【網絡安全防護治理實戰技能賽項】樣題(中職組) 1.基礎設置和安全強化(xxx 分)1.3. 任務內容: 2.安全監測和預警(xxx 分)2.1. 任務一:建立目錄安…

Qt C++ 顯示多級結構體,包括結構體名、變量名和值

文章目錄 mainwindow.hmainwindow.cppstructures.hmain.cpp QTreeView 和 QStandardItemModel 來實現。以下是實現這一功能的步驟和示例代碼: 定義多級結構體: 假設你有一個多級結構體,如下所示: struct SubStruct {int subValue…