前面咱們介紹了Redis的五種基本的數據類型,靈活運用這五種數據類型是使用Redis的基礎,除此以外,Redis還有一些特性,掌握這些特性能對Redis有進一步的瞭解,好比Redis事務、Redis分區、Redis的數據備份等等。html
Redis從2.8.9版本開始加入了HyperLogLog,這聽起來有點陌生,實際上它是一個用來作基數統計的算法(基數就是數據集中不重複的元素個數,好比數據集 {1, 3, 5, 7, 5, 7, 8}, 那麼這個數據集的基數集爲 {1, 3, 5 ,7, 8},基數爲5)。redis
Redis作基數統計有其特有的優點,在輸入元素的數量或者體積很是很是大時,Redis計算基數所需的空間老是固定的、而且是很小的,每一個 HyperLogLog 鍵只須要花費 12 KB 內存,就能夠計算接近 2^64 個不一樣元素的基數,可是它只計算基數,並不儲存輸入元素自己。<div align=center></div>算法
Redis支持數據的備份,並能夠從備份中恢復數據。這主要就是涉及到一個save命令。數據庫
當輸入save命令時,將在redis安裝目錄穿件dump.rdb文件,此文件就是備份的數據。若是想恢復數據,只須要將dump.rdb移動到安裝目錄下,而後從新啓動redis-server便可。所以,咱們使用這樣的數據備份和恢復能夠很方便的對數據庫進行遷移。緩存
爲了保證Redis服務的安全性,能夠對redis添加密碼,這樣當客戶端鏈接到redis服務時就須要輸入密碼進行驗證,經過後才能鏈接。安全
Redis服務的密碼是經過配置文件進行指定的,密碼參數是配置文件中的requirepass,默認是空字符串,只須要更改此參數就能夠設置密碼,設置密碼後須要進行auth認證才能夠進行相應的操做。<div align=center></div>服務器
咱們說Redis最大的一個特色是性能極高,讀的速度是110000次/s,寫的速度是81000次/s。Redis提供了一個性能測試工具redis-benchmark,經過同時執行多個命令來測試性能。這個測試工具備不少可選參數:-h(指定主機),-p(指定端口),-s(指定Socket),-c(指定併發鏈接數),-n(指定請求數),-d(指定set和get的值是多少個字節)等等。<div align=center></div>網絡
Redis事務容許客戶端依次執行多個命令,而且符合如下規則:併發
一個事務從開始到執行會經歷如下三個階段:開始事務、命令入隊、執行事務。具體地,先以 MULTI 開始一個事務, 而後將多個命令入隊到事務中, 最後由 EXEC 命令觸發事務, 一併執行事務中的全部命令。app
單個 Redis 命令的執行是原子性的,但 Redis 沒有在事務上增長任何維持原子性的機制,因此 Redis 事務的執行並非原子性的。事務能夠理解爲一個打包的批量執行腳本,但批量指令並不是原子化的操做,中間某條指令的失敗不會致使前面已作指令的回滾,也不會形成後續的指令不作。<div align=center></div>
在另一篇關於Kafka的博客:【Apache Kafka】 Kafka簡介及其基本原理中,介紹了什麼是消息隊列,並對發佈-訂閱這種消息模式有相關的介紹,這裏咱們說Redis也能夠用做簡單的消息隊列,發送者(pub)發送消息,訂閱者(sub)接收消息。Redis 客戶端能夠訂閱任意數量的頻道,當有新消息發送到該頻道時,客戶端就能夠收到消息。<div align=center></div><div align=center>
</div><div align=center>
</div>
Redis是一種基於客戶端-服務端模型以及請求/響應協議的TCP服務。這意味着一般狀況下一個請求會遵循如下步驟:
Redis 管道技術能夠達到這樣的效果:在服務端未響應時,客戶端能夠繼續向服務端發送請求,並最終一次性讀取全部服務端的響應。<div align=center></div>
咱們說Redis是一個分佈式緩存、分佈式數據庫,那麼到目前咱們尚未看到其分佈式體如今哪裏,Redis數據保存在內存中,若是隻有一臺機器,很容易達到其存儲上限。所以,Redis分區容許構建redis集羣,將數據分別保存到多個Redis實例中去,每一個實例保存key的一個子集,這樣就能夠利用更多的計算機來存儲數據,從而構造更大的數據庫。
除了數據量更大,Redis分區還能夠帶來更強大的計算能力和更高的網絡帶寬。
關於如何進行分區,Redis提供了兩種類型。一種是範圍分區,就是映射必定範圍的對象到特定的Redis實例。好比,ID從0到10000的用戶會保存到實例R0,ID從10001到 20000的用戶會保存到R1,以此類推。還有一種方法是哈希分區,用一個hash函數將key轉換爲一個數字,對這個整數取模,轉換到對應的Redis實例中的一個。
Redis是一種內存數據庫,爲了保證數據不丟失,內存中的數據能夠保存到磁盤中,重啓的時候能夠再次加載使用,這就是持久化。
Redis有兩種持久化機制,默認使用的是RDB方式。
(1)RDB持久化(全量):經過快照的方式完成持久化,**當符合必定條件時,Redis會自動將內存中的全部數據進行快照並保存到磁盤上去。**這裏的必定條件能夠由用戶來指定,由兩個參數構成:時間和改動的鍵的個數,當在指定的時間內更改的鍵的個數大於指定的數值時就會進行快照。在配置文件中默認了三個條件(多個條件是或的關係):
save 900 1 # 意思是:在900秒(15分鐘)內有至少一個鍵被更改則進行快照 save 300 10 save 60 10000
RDB實際操做過程是:fork 一個子進程,先將數據集寫入臨時文件,寫入成功後,再替換以前的文件,用二進制壓縮存儲。
RDB的優缺點:
RDB以快照的方式持久化,能夠經過配置靈活設置備份頻率和週期,很是適合冷備份和災備,將快照複製到其餘服務器就能夠直接建立具備相同數據的服務器副本,性能好,恢復快。然而,其缺點是:系統一旦在持久化完成以前出現宕機,此前沒有寫到磁盤的數據都會丟失。
(2)AOF持久化(增量):AOF就是append only file,以日誌文本的形式對每個寫、刪除操做進行記錄(查詢無需記錄)。可是這裏也有一個優化,並非每次就直接寫磁盤,而是先進行緩存,由操做系統決定何時同步到磁盤去。因此有三種同步選項:
AOF的優缺點:
AOF相比RDB能夠帶來更高的數據安全性,由於即便在未同步以前宕機也只是丟失一次或者一秒的數據。並且,append only的方式也避免了磁盤尋址,性能也比較高。其缺點在於:對相同的數據集來講,AOF文件一般會比較大,恢復速度要慢一些。