i5 迷你工作機上線,原本 CPU 太鳥、RAM 太少、SSD 不夠快等限制一掃而空,加上對 Docker、Hyper-V 逐漸上手,以前沒機會實際摸過的新玩意,花幾分鐘便能在我的電腦上與我相見歡。一則以喜一則以憂,能阻止我學東西的硬體限制變少了,但再也無法以沒環境沒機會學當成推拖藉口...

終於,我摸到大名鼎鼎的光速資料庫 Redis 了!

與 Redis 的第一次接觸,我打算用 Docker 架台 Redis 伺服器,學習使用管理工具查詢,最後寫支 .NET 程式讀寫資料結束第一回合。

到現在才開始看 Redis 起步算晚,但好處是學習資源豐富,我主要參考以下文章:

以下是我在 Windows Docker Desktop 安裝 Redis 及測試的過程記錄。

  1. Docker 容器的資料關閉後會消失,故要對映到本機磁碟才能永久保存。先建立兩個目錄放設定檔及資料,我建了 X:\dockers\redis,其下加入 conf 及 data 子目錄。
  2. http://download.redis.io/redis-stable/redis.conf 下載範例設定檔 redis.conf 放在 X:\dockers\redis\conf\redis.conf
  3. 我只改了三處,拿掉 bind 127.0.0.1 允許非本機連線,data 由 ./ 改為 /data、requirepass 設了密碼
  4. 建立 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
    
  5. 執行 docker-compose up -d 啟動 Redis 伺服器
  6. docker -it 登入 Docker 容器跑 Redis-cli ping 測試
  7. 執行 winget install qishibo.AnotherRedisDesktopManager 安裝 GUI 管理工具
  8. 建立 .NET 6 Console 專案,參照 StackExchange.Redis 及 MSTest.TestFramework (借用 Assert API)
    dotnet new console -o redis-demo
    cd redis-demo
    dotnet add package StackExchange.Redis 
    dotnet add package MSTest.TestFramework
    
    Program.cs 程式如下:
    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

Be the first to post a comment

Post a comment


70 + 12 =