redis學習系列--8.redis-實用特性

1.安全性.

如何給redis設置登錄密碼.

1. 修改配置文件“redis.windows-service.conf”(在安裝的目錄下找到並打開“redis.windows-service.conf”文件你可以找到如下的文字:)

################################## SECURITY ###################################

# Require clients to issue AUTH <PASSWORD> before processing any other
# commands.  This might be useful in environments in which you do not trust
# others with access to the host running redis-server.
#
# This should stay commented out for backward compatibility and because most
# people do not need auth (e.g. they run their own servers).
#
# Warning: since Redis is pretty fast an outside user can try up to
# 150k passwords per second against a good box. This means that you should
# use a very strong password otherwise it will be very easy to break.
#
# requirepass foobared

設置密碼的方式就是加入一行

requirepass 你的密碼

比如我要設置密碼爲:we9fh34v9we4hfg35hbqwif234lhtzxmcsdh 的話,就加入一行下面的文字,然後重啓.

requirepass we9fh34v9we4hfg35hbqwif234lhtzxmcsdh

2.主從複製

redis 主從複製配置和使用都非常簡單。通過主從複製可以允許多個 slave server 擁有和
master server 相同的數據庫副本。

2.1redis主從複製的特點:

1).master可以擁有多個slave
2).多個slave可以連接同一個master外,還可以連接到其他slave
3).主從複製不會阻塞master,在同步數據時,master可以繼續處理client請求.
4).提高系統的伸縮性.

2.2. redis主從複製的過程:

當配置好slave後,slave與master建立連接,然後發送sync命令,無論是第一次連接還是重新連接,master都會啓動一個後臺進程,將數據快照保存到文件中,同時master主進程會開始收集新的寫命令並緩存,後臺進程完成寫文件後,master就發送文件給slave,slave
將文件保存到硬盤上,在加載到內存中,接着master就會把緩存的命令轉發給slave,後續master將收到的寫命令發送給slave.如果master同時收到多個slave發來的同步連接命令,master只會啓動一個進程來寫數據庫鏡像,然後發送給所有的slave.
(Redis的主從複製功能非常強大,一個master可以擁有多個slave,而一個slave又可以擁有多個slave,如此下去,形成了強大的多級服務器集羣架構)

2.3 如何配置(linux版,windows類似)

1、上面安裝好的一個Redis作爲master,然後使用VirtualBox的虛擬機克隆功能將剛剛那個linux系統克隆一份作爲slave,並修改其IP爲192.168.0.110。
2、修改slave的redis配置文件:slaveof 192.168.0.100 6379  (映射到主服務器上),如果master設置了驗證密碼,還需配置 masterauth。樓主的

設置了驗證密碼爲admin,所以配置masterauth admin。配置完之後啓動slave的Redis服務,主從配置完成。
主從複製如何分辨主從, 需要調用info命令就可以得到主從信息了. 裏面有一個角色標識, 來判斷是主庫還是從庫, 
master_link_status 用於標明主從是否異步,如果此值=up,說明同步正常;如果此值=down,說明同步異步, db0:keys=1, expires=0, 用於說明數據庫有幾個 key,以及過期 key 的數量.

3. 事務控制

redis的事務和數據庫的事務有些差別,  數據庫事務: 當提交發生異常後操作會全部回滾, 但是redis事務會把未發生異常的命令提交,只回滾異常的命令. 是不完全的回滾.
3.1 如何取消一個事務
discard 命令用來取消一個事務,讓事務回滾.
4.  持久化機制
redis 是一個支持持久化的內存數據庫,也就是說 redis 需要經常將內存中的數據同步到磁盤來保證持久化。redis 支持兩種持久化方式,一種是 Snapshotting(快照)也是默認方式,另一種是 Append-only file(縮寫 aof)的方式.
4.1 snapshotting(快照)方式
快照是默認的持久化方式。這種方式是就是將內存中數據以快照的方式寫入到二進制文件中,默認的文件名爲dump.rdb。可以通過配置設置自動做快照持久化的方式。我們可以配置 redis在 n 秒內如果超過 m 個 key 被修改就自動做快照,下面是默認的快照保存配置.
save 900 1 #900 秒內如果超過 1 個 key 被修改,則發起快照保存
save 300 10 #300 秒內容如超過 10 個 key 被修改,則發起快照保存

4.2aof 方式

另外由於快照方式是在一定間隔時間做一次的,所以如果 redis 意外 down 掉的話,就會丟失最後一次快照後的所有修改。如果應用要求不能丟失任何修改的話,可以採用 aof 持久化方式。下面介紹 Append-only file:
aof 比快照方式有更好的持久化性,是由於在使用 aof 持久化方式時,redis 會將每一個收到的寫命令都通過 write 函數追加到文件中(默認是 appendonly.aof)。當 redis 重啓時會通過重新執行文件中保存的寫命令來在內存中重建整個數據庫的內容。當然由於 os 會在內核中緩存 write 做的修改,所以可能不是立即寫到磁盤上。這樣 aof 方式的持久化也還是有可能會丟失部分修改。不過我們可以通過配置文件告訴 redis 我們想要通過 fsync 函數強制 os 寫入到磁盤的時機。有三種方式如下(默認是:每秒 fsync 一次)
appendonly yes //啓用 aof 持久化方式 (在配置文件中改)
# appendfsync always //收到寫命令就立即寫入磁盤,最慢,但是保證完全的持久化
appendfsync everysec //每秒鐘寫入磁盤一次,在性能和持久化方面做了很好的折中
# appendfsync no //完全依賴 os,性能最好,持久化沒保證

aof 的方式也同時帶來了另一個問題。持久化文件會變的越來越大。例如我們調用 incr test命令 100 次,文件中必須保存全部的 100 條命令,其實有 99 條都是多餘的。因爲要恢復數據庫的狀態其實文件中保存一條 set test 100 就夠了。爲了壓縮 aof 的持久化文件。redis 提供了 bgrewriteaof 命令。收到此命令 redis 將使用與快照類似的方式將內存中的數據以命令的方式保存到臨時文件中,最後替換原來的文件。具體過程如下

1、redis 調用 fork ,現在有父子兩個進程
2、子進程根據內存中的數據庫快照,往臨時文件中寫入重建數據庫狀態的命令
3、父進程繼續處理 client 請求,除了把寫命令寫入到原來的 aof 文件中。同時把收到的寫命
令緩存起來。這樣就能保證如果子進程重寫失敗的話並不會出問題。
4、當子進程把快照內容寫入已命令方式寫到臨時文件中後,子進程發信號通知父進程。然
後父進程把緩存的寫命令也寫入到臨時文件。
5、現在父進程可以使用臨時文件替換老的 aof 文件,並重命名,後面收到的寫命令也開始
往新的 aof 文件中追加。需要注意到是重寫 aof 文件的操作,並沒有讀取舊的 aof 文件,而是將整個內存中的數據庫
內容用命令的方式重寫了一個新的 aof 文件,這點和快照有點類似。

5. 發佈及訂閱消息

發佈訂閱(pub/sub)是一種消息通信模式,主要的目的是解耦消息發佈者和消息訂閱者之間的耦合,這點和設計模式中的觀察者模式比較相似。pub/sub 不僅僅解決發佈者和訂閱者直接代碼級別耦合也解決兩者在物理部署上的耦合。redis 作爲一個 pub/sub 的 server,在訂閱者和發佈者之間起到了消息路由的功能。訂閱者可以通過 subscribe 和 psubscribe 命令向 redisserver 訂閱自己感興趣的消息類型,redis 將消息類型稱爲通道(channel)。當發佈者通過publish 命令向 redis server 發送特定類型的消息時。訂閱該消息類型的全部 client 都會收到此消息。這裏消息的傳遞是多對多的。一個client可以訂閱多個channel,也可以向多個channel發送消息。
6.pipeline批量發送請求(待定)

7.虛擬內存的使用

首先說明下 redis 的虛擬內存與操作系統的虛擬內存不是一碼事,但是思路和目的都是相同的。就是暫時把不經常訪問的數據從內存交換到磁盤中,從而騰出寶貴的內存空間用於其他需要訪問的數據。尤其是對於 redis 這樣的內存數據庫,內存總是不夠用的。除了可以將數據分割到多個 redis server 外。另外的能夠提高數據庫容量的辦法就是使用虛擬內存把那些不經常訪問的數據交換的磁盤上。如果我們的存儲的數據總是有少部分數據被經常訪問,大部分數據很少被訪問,對於網站來說確實總是隻有少量用戶經常活躍。當少量數據被經常訪問時,使用虛擬內存不但能提高單臺 redis server 數據庫的容量,而且也不會對性能造成太多影響。
redis 沒有使用操作系統提供的虛擬內存機制而是自己在實現了自己的虛擬內存機制,主要
的理由有兩點:
1、操作系統的虛擬內存是已 4k 頁面爲最小單位進行交換的。而 redis 的大多數對象都遠小於 4k,所以一個操作系統頁面上可能有多個 redis 對象。另外 redis 的集合對象類型如 list,set可能存在與多個操作系統頁面上。最終可能造成只有 10%key 被經常訪問,但是所有操作系統頁面都會被操作系統認爲是活躍的,這樣只有內存真正耗盡時操作系統纔會交換頁面。
2、相比於操作系統的交換方式,redis 可以將被交換到磁盤的對象進行壓縮,保存到磁盤的對象可以去除指針和對象元數據信息,一般壓縮後的對象會比內存中的對象小10倍,這樣redis的虛擬內存會比操作系統虛擬內存能少做很多 io 操作。下面是 vm 相關配置
vm-enabled yes #開啓 vm 功能
vm-swap-file /tmp/redis.swap #交換出來的 value 保存的文件路徑
vm-max-memory 1000000 #redis 使用的最大內存上限
vm-page-size 32 #每個頁面的大小 32 個字節
vm-pages 134217728 #最多使用多少頁面
vm-max-threads 4 #用於執行 value 對象換入換出的工作線程數量
redis 的虛擬內存在設計上爲了保證 key 的查找速度,只會將 value 交換到 swap 文件中。所以如果是內存問題是由於太多 value 很小的 key 造成的,那麼虛擬內存並不能解決,和操作系統一樣 redis 也是按頁面來交換對象的。redis 規定同一個頁面只能保存一個對象。但是一個對象可以保存在多個頁面中。在 redis 使用的內存沒超過 vm-max-memory 之前是不會交換任何 value 的。當超過最大內存限制後,redis 會選擇較過期的對象。如果兩個對象一樣過期會優先交換比較大的對象,精確的公式 swappability = age*log(size_in_memory)。對於vm-page-size 的設置應該根據自己的應用將頁面的大小設置爲可以容納大多數對象的大小,太大了會浪費磁盤空間,太小了會造成交換文件出現碎片。對於交換文件中的每個頁面,redis會在內存中對應一個 1bit 值來記錄頁面的空閒狀態。所以像上面配置中頁面數量(vm-pages134217728 )會佔用 16M 內存用來記錄頁面空閒狀態。vm-max-threads 表示用做交換任務的線程數量。如果大於 0 推薦設爲服務器的 cpu 內核的數量,如果是 0 則交換過程在主線程進行









發佈了60 篇原創文章 · 獲贊 114 · 訪問量 47萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章