久仰大名,Redis 初試
3 | 6,799 |
i5 迷你工作機上線,原本 CPU 太鳥、RAM 太少、SSD 不夠快等限制一掃而空,加上對 Docker、Hyper-V 逐漸上手,以前沒機會實際摸過的新玩意,花幾分鐘便能在我的電腦上與我相見歡。一則以喜一則以憂,能阻止我學東西的硬體限制變少了,但再也無法以沒環境沒機會學當成推拖藉口...
終於,我摸到大名鼎鼎的光速資料庫 Redis 了!
與 Redis 的第一次接觸,我打算用 Docker 架台 Redis 伺服器,學習使用管理工具查詢,最後寫支 .NET 程式讀寫資料結束第一回合。
到現在才開始看 Redis 起步算晚,但好處是學習資源豐富,我主要參考以下文章:
- 使用 Docker 安裝 Redis yb m@rcus
- Redis 管理工具 - Another Redis Desktop Manager by m@rcus
- 建立 .NET 6 + Redis 本機開發環境 by 余小章
- docker-compose 安装redis by longxin111
- StackExchange.Redis Basic Usage
以下是我在 Windows Docker Desktop 安裝 Redis 及測試的過程記錄。
- Docker 容器的資料關閉後會消失,故要對映到本機磁碟才能永久保存。先建立兩個目錄放設定檔及資料,我建了 X:\dockers\redis,其下加入 conf 及 data 子目錄。
- 從
http://download.redis.io/redis-stable/redis.conf
下載範例設定檔 redis.conf 放在 X:\dockers\redis\conf\redis.conf - 我只改了三處,拿掉 bind 127.0.0.1 允許非本機連線,data 由 ./ 改為 /data、requirepass 設了密碼
- 建立 x:\dockers\redis\docker-compose.yml,redis Docker Image 的標準版 OS 使用 Debian,我則選 OS 只有 5MB 的 alpine 版,更省空間(缺點是功能較少,像是互動環境沒有 bash,只有 sh,但用到機會不多影響不大)。volumes 要將 /data 跟 /etc/redis/redis.conf 對映到 X:\dockers\redis 下的目錄與檔案:
version: '3.8' services: myredis: container_name: myredis image: redis:7.0.7-alpine restart: always ports: - 6379:6379 privileged: true command: redis-server /etc/redis/redis.conf --appendonly yes volumes: - /x/dockers/redis/data:/data - /x/dockers/redis/conf/redis.conf:/etc/redis/redis.conf
- 執行
docker-compose up -d
啟動 Redis 伺服器 - 用
docker -it
登入 Docker 容器跑 Redis-cli ping 測試
- 執行
winget install qishibo.AnotherRedisDesktopManager
安裝 GUI 管理工具
- 建立 .NET 6 Console 專案,參照 StackExchange.Redis 及 MSTest.TestFramework (借用 Assert API) Program.cs 程式如下:
dotnet new console -o redis-demo cd redis-demo dotnet add package StackExchange.Redis dotnet add package MSTest.TestFramework
using Microsoft.VisualStudio.TestTools.UnitTesting; using StackExchange.Redis; var redis = ConnectionMultiplexer.Connect("127.0.0.1:6379,password=P@ssW0rd"); var db = redis.GetDatabase(); // 一般字串保存 db.StringSet("name", "Jeffrey"); Assert.AreEqual("Jeffrey", (string)db.StringGet("name")!); // 設定 10 分鐘後過期 db.StringSet("expireIn10Min", "darkthread", TimeSpan.FromMinutes(10)); Assert.AreEqual("darkthread", (string)db.StringGet("expireIn10Min")!); // 設定 1 秒後過期 db.StringSet("expireIn1Sec", "almost gone", TimeSpan.FromSeconds(1)); Assert.IsNotNull((string)db.StringGet("expireIn1Sec")!); Thread.Sleep(2000); // 過期後應為 null Assert.IsNull((string)db.StringGet("expireIn1Sec")!); // 測試訂閱與發佈 var sub = redis.GetSubscriber(); var received = false; sub.Subscribe("testChannel", (channel, message) => { Console.WriteLine($"channel: {channel}, message: {message}"); received = true; }); Assert.IsFalse(received); sub.Publish("testChannel", "hello"); Thread.Sleep(1000); Assert.IsTrue(received); Console.WriteLine("test ok");
通過測試:
使用 Another Redis Desktop Manager 也能看到寫入資料,成功!
Tutorial of setting up Redis Docker container, installing GUI tool and writing C# program to do basic test.
Comments
# by 理科羊
redis 管理工具的阿吉大大的名字少了一個c
# by Jeffrey
to 理科羊,感謝指正,並向 m@rcus 大人致歉。
# by PaulWang
RDM 個人還是比較喜歡使用 resp 雖然被官方收購了? 不過還是可以找到source code自己cmake