Redis in .NET Core 入門:(1) 安裝和主要功能簡介

solenovex發表於2019-01-20

Redis(https://redis.io/), 是一個記憶體中的資料結構儲存系統,它可以用作資料庫、快取和訊息中介軟體。

 

安裝Redis

我很少在開發機中直接裝各種資料庫,我一般使用Docker,針對Redis也不例外,我還是使用Docker。

這是Redis在DockerHub裡的地址:https://hub.docker.com/_/redis,裡面有文件。

啟動docker,下載redis映象:docker pull redis

 

然後執行映象併發布埠6379:

 

然後執行redis-cli(這是Redis的一個命令列管理工具):

 

進入redis-cli之後,我們可以設定一個key-value來試試:

當你輸入的時候,它是有提示的。

通過get key(key為name),可以獲得其對應的值。

 

準備.NET Core專案

建立一個.NET Core 控制檯專案,並安裝Redis的.NET Core客戶端。

Redis有很多C#的客戶端,這裡有個列表:https://redis.io/clients#c

我這使用的是 StackExchange.Redis (https://stackexchange.github.io/StackExchange.Redis/)。

安裝StackExchange.Redis

 

使用StackExchange.Redis

ConnectionMultiplexer已經實現了IDisposable介面,之所以沒有使用using表示式,是因為該物件應該重複利用的,具體請看文件。

我之前通過redis-cli設定了key為name的值,這裡我通過name這個key把相對應的值找出來,並列印在控制檯:

如果所示,連線上了資料庫,並把值輸出到了控制檯,OK。

使用C#寫入值

這個也沒什麼特別的,看程式碼:

 

執行結果:

 

Redis 的資料型別

Redis的主要資料型別有這些:

  • Key:就是key的意思。。。。
  • String:字串
  • List:有序字串的集合
  • Hashes:有點像物件,裡面可以有若干個欄位,欄位都有自己的值,欄位和值都是字串型別的。
  • Set:無序唯一字串的集合
  • Sorted-Set:跟Set很像,但是每一個字串元素都對應一個浮點數值,該數值叫做分數。它裡面的元素通常是按照分數來排序的。

 

Redis 如何持久化

一共有兩種方式:

  • AOF(Append-only file)
  • RDB(Redis database file)

首先需要知道Redis的操作都是在記憶體中完成的,因為這樣速度快。

AOF

然後你可以啟用AOF,它會把每個操作都記錄到系統檔案裡。所以如果Redis伺服器重啟了,它會根據AOF這個檔案來重建整個資料集。

這個檔案會很快就變得很大,但是Redis很聰明,它會使用裡面最新版本的資料,並壓縮檔案到可控大小。

RDB

RDB是Redis的預設模式,它有點像資料庫的快照,建立一些時間點的資料,如果發生災難,你可以從這些資料裡進行恢復。

當達到一些條件的時候,例如資料集裡面在某段時間內新新增了一定條目的資料,Redis就會把資料做個快照,並寫入一個RDB檔案。

 

最佳實踐是兩者都用,使用AOF因為其速度和可用性,使用RDB做災難恢復。

 

Redis的配置檔案

https://raw.githubusercontent.com/antirez/redis/4.0/redis.conf 這是Redis 4.0 的一個標準配置檔案。

RDB 快照相關

先看快照部分,也就是和RDB有關的部分:

裡面的save 900 1.。。。這部分是指,900秒過後,如果至少1個key改變了,那麼就做一個快照。

下面的就是300秒過後,如果10個key改變了,那就做一個快照。。。

這些就是進行快照動作的觸發條件。

 

AOF相關

AOF模式預設是不開啟的,也就是no。如果想開啟,那就改成yes即可。

 

使用自定義配置執行Redis容器

RDB & AOF

把上述檔案下載到本地,進行修改:

我新增了一個RDB的條件,5秒內1個Key被修改就會觸發快照動作。

 

然後我啟用了AOF:

 

首先把之前的容器刪除吧,然後再建立一個。

這次建立docker容器的時候需要使用volume:

說明一下:

-v這部分是指volume,redis.conf在我電腦裡的位置是:D:\Projects\Redis\redis.conf,所以我把該位檔案的位置掛載到了容器裡的/usr/local/etc/redis/redis.conf這個地方。

然後執行redis這個映象,同時執行裡面的redis-server,而redis-server的配置檔案就是/usr/local/etc/redis/redis.conf。

 

現在這個redis-server執行起來了。

 

再開啟一個redis-cli,還是使用容器:

 

然後我設定一個key的值:

這時就達到了RDB的最後一個條件,所以觸發了快照動作。

我就不再實驗了。。。

 

我再開啟一下redis容器的bash,然後看一下aof檔案是否生成:

可以看到每次操作後aof檔案都會更新(裡面可以認為就是事務的log)。

 

Master-Slave Replication 主從複製

簡單講一下Redis的主從複製,首先把之前的容器都刪掉。。。

然後我們先建立docker 網路:

 

然後建立redis master的容器,不過首先修改一下redis.conf裡的bind地址,原來是127.0.0.1,改為 bind 0.0.0.0:

這樣的話其它的ip地址也可以連線過來了。

 

然後建立master容器:

注意裡面使用了之前建立的橋接網路。

 

檢查一下redis-net這個網路:

可以看到該網路裡有一個容器master-redis,其ip為172.20.0.2。

 

然後把redis.conf再複製一份,名字為redis2.conf。

在redis2.conf的Replication部分裡,把下面這部分取消註釋,並修改為:

注意這個ip地址和master-redis的ip要一樣。

 

現在我們可以執行這個redis的slave容器了:

 

然後我們可以看到主從複製成功了:

 

開啟master的redis-cli:

 

操作一些操作,可以看到master和slave都幾乎同步的做了一些動作,也就是主從複製:

 

設定密碼

把之前的容器都清理掉。。。

主從複製的master通常需要設定密碼,修改redis.conf檔案,找到requirepass這部分,取消註釋並設定密碼:

 

在slave的redis2.conf裡,找到masterauth這部分,填寫master的密碼:

首先我填寫一個錯誤的密碼。

然後執行兩個容器,看看什麼效果:

可以看到提示密碼不正確,無法進行復制。

 

然後刪掉slave容器,再把redis2.conf的密碼修正一下: 

 

然後再執行slave容器:

這次可以看到連線成功了。

 

其它的配置方式

redis-server的命令列引數

如上圖,這就對port和replicaof進行配置,而沒有使用redis2.conf(所以該命令前面的-v部分也是沒有什麼作用的)。

 

CONFIG SET

前面我們使用了自定義的配置檔案來執行Redis,但是這樣的話需要重啟Redis Server。

而如果使用CONFIG SET(https://redis.io/commands/config-set)的話,那就不需要重啟redis server直接就可以修改配置,但是這樣做不會修改redis.conf等配置檔案的。

 

首先需要使用redis-cli,然後進行配置即可,例如:

這就是新增了一個快照的設定:每20秒如果有兩個變化就做一個快照。

相關文章