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 上安裝
- 下載 Redis:
wget http://download.redis.io/redis-stable.tar.gz
- 解壓并編譯:
tar xzf redis-stable.tar.gz cd redis-stable make
- 啟動 Redis:
src/redis-server
2.2 在 Windows 上安裝
- 下載 Redis for Windows:
- Redis 官方不支持 Windows,但可以下載社區版:https://github.com/microsoftarchive/redis/releases
- 解壓后運行
redis-server.exe
啟動服務。
2.3 使用 Docker 安裝 Redis
- 拉取 Redis 鏡像:
docker pull redis
- 啟動 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 代碼解讀
-
連接 Redis:
- 使用
redis.NewClient
創建 Redis 客戶端。 - 配置地址、密碼和數據庫編號。
- 使用
-
寫入數據:
- 使用
Set
方法寫入鍵值對。 - 第三個參數為過期時間,
0
表示不過期。
- 使用
-
讀取數據:
- 使用
Get
方法讀取鍵的值。
- 使用
-
檢查鍵是否存在:
- 使用
Exists
方法檢查鍵是否存在。
- 使用
-
刪除鍵:
- 使用
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 中的集成,你可以輕松實現緩存、消息隊列、分布式鎖等功能。