Redis(https://redis.io/), 是一個內存中的數據結構存儲系統,它能夠用做數據庫、緩存和消息中間件。git
我不多在開發機中直接裝各類數據庫,我通常使用Docker,針對Redis也不例外,我仍是使用Docker。github
這是Redis在DockerHub裏的地址:https://hub.docker.com/_/redis,裏面有文檔。redis
啓動docker,下載redis鏡像:docker pull redisdocker
而後運行鏡像併發布端口6379:數據庫
而後運行redis-cli(這是Redis的一個命令行管理工具):緩存
進入redis-cli以後,咱們能夠設置一個key-value來試試:bash
當你輸入的時候,它是有提示的。服務器
經過get key(key爲name),能夠得到其對應的值。網絡
創建一個.NET Core 控制檯項目,並安裝Redis的.NET Core客戶端。數據結構
Redis有不少C#的客戶端,這裏有個列表:https://redis.io/clients#c
我這使用的是 StackExchange.Redis (https://stackexchange.github.io/StackExchange.Redis/)。
ConnectionMultiplexer已經實現了IDisposable接口,之因此沒有使用using表達式,是由於該對象應該重複利用的,具體請看文檔。
我以前經過redis-cli設置了key爲name的值,這裏我經過name這個key把相對應的值找出來,並打印在控制檯:
若是所示,鏈接上了數據庫,並把值輸出到了控制檯,OK。
這個也沒什麼特別的,看代碼:
運行結果:
Redis的主要數據類型有這些:
一共有兩種方式:
首先須要知道Redis的操做都是在內存中完成的,由於這樣速度快。
而後你能夠啓用AOF,它會把每一個操做都記錄到系統文件裏。因此若是Redis服務器重啓了,它會根據AOF這個文件來重建整個數據集。
這個文件會很快就變得很大,可是Redis很聰明,它會使用裏面最新版本的數據,並壓縮文件到可控大小。
RDB是Redis的默認模式,它有點像數據庫的快照,建立一些時間點的數據,若是發生災難,你能夠從這些數據裏進行恢復。
當達到一些條件的時候,例如數據集裏面在某段時間內新添加了必定條目的數據,Redis就會把數據作個快照,並寫入一個RDB文件。
最佳實踐是二者都用,使用AOF由於其速度和可用性,使用RDB作災難恢復。
https://raw.githubusercontent.com/antirez/redis/4.0/redis.conf 這是Redis 4.0 的一個標準配置文件。
先看快照部分,也就是和RDB有關的部分:
裏面的save 900 1.。。。這部分是指,900秒事後,若是至少1個key改變了,那麼就作一個快照。
下面的就是300秒事後,若是10個key改變了,那就作一個快照。。。
這些就是進行快照動做的觸發條件。
AOF模式默認是不開啓的,也就是no。若是想開啓,那就改爲yes便可。
把上述文件下載到本地,進行修改:
我添加了一個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)。
簡單講一下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容器:
此次能夠看到鏈接成功了。
如上圖,這就對port和replicaof進行配置,而沒有使用redis2.conf(因此該命令前面的-v部分也是沒有什麼做用的)。
前面咱們使用了自定義的配置文件來運行Redis,可是這樣的話須要重啓Redis Server。
而若是使用CONFIG SET(https://redis.io/commands/config-set)的話,那就不須要重啓redis server直接就能夠修改配置,可是這樣作不會修改redis.conf等配置文件的。
首先須要使用redis-cli,而後進行配置便可,例如:
這就是添加了一個快照的設置:每20秒若是有兩個變化就作一個快照。