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秒如果有兩個變化就做一個快照。