天天看點

Redis基礎詳解引言Redis是什麼?Redis與Memcache對比?Redis和Memcache的不同點Redis支援資料類型Redis資料持久化

引言

伴随着資料資訊化的發展,網站的通路量的提升,使用關系型資料庫已經在性能上出現瓶頸,問題出現的源頭一般是再磁盤的I/O上,是以随着網際網路的發展,需要達到以下幾個方面的需求:

1. 低延遲的讀寫速度:應用快速地反應能極大地提升使用者的滿意度 ;

2. 支撐海量的資料和流量:對于搜尋這樣大型應用而言,需要利用 PB級别的資料和能應對百萬級的流量 ;

3. 大規模叢集的管理:系統管理者希望分布式應用能更簡單的部署和管理 ;

4. 龐大營運成本: IT經理們希望在硬體成本、軟體成本和人力成本能夠有大幅度地降低 ;

雖然關系型資料庫已經在業界的資料存儲方面占據不可動搖的地位,但是由于其天生的幾個限制,使其很難滿足上面這幾個需求:

1. 擴充困難:由于存在類似 Join這樣多表查詢機制,使得資料庫在擴充方面很艱難 ;

2. 讀寫慢:這種情況主要發生在資料量達到一定規模時由于關系型資料庫的系統邏輯非常複雜,使得其非常容易發生死鎖等的并發問題,是以導緻其讀寫速度下滑非常嚴重 ;

3. 成本高:企業級資料庫的 License價格很驚人,并且随着系統的規模,而不斷上升 ;

4. 有限的支撐容量:現有關系型解決方案還無法支撐 Google這樣海量的資料存儲 ;

業界為了解決上面提到的幾個需求,推出了多款新類型的資料庫,并且由于它們在設計上和傳統的 NoSQL資料庫相比有很大的不同,是以被統稱為 “NoSQL”系列資料庫。總的來說,在設計上,它們非常關注對資料高并發地讀寫和對海量資料的存儲等,與關系型資料庫相比,它們在架構和資料模型方量面做了 “減法 ”,而在擴充和并發等方面做了 “加法 ”。現在主流的 NoSQL資料庫有 BigTable、 HBase、 Cassandra、 SimpleDB、 CouchDB、 MongoDB和 Redis等。接下來,将關注 NoSQL資料庫到底存在哪些優缺點。

Redis基礎詳解引言Redis是什麼?Redis與Memcache對比?Redis和Memcache的不同點Redis支援資料類型Redis資料持久化

Redis是什麼?

Redis是一款記憶體高速緩存資料庫。使用C語言編寫,Redis是一個key-value存儲系統(鍵值存儲系統)。

Redis特點:

1.記憶體資料庫,速度快,也支援資料的持久化,可以将記憶體中的資料儲存在磁盤中,重新開機的時候可以再次加載進行使用。

2.Redis不僅僅支援簡單的key-value類型的資料,同時還提供list,set,zset,hash等資料結構的存儲。

3.Redis支援資料的備份,即master-slave模式的資料備份。

4.支援事務

Redis優勢:

1.性能極高 – Redis能讀的速度是110000次/s

2.豐富的資料類型 – Redis支援二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 資料類型操作。

3.原子 – Redis的所有操作都是原子性的,同時Redis還支援對幾個操作合并後的原子性執行。(事務)

4.豐富的特性 – Redis還支援 publish/subscribe, 通知, key 過期等等特性。

Redis與Memcache對比?

1.Redis和Memcache都是将資料存放在記憶體中,都是記憶體資料庫。不過memcache還可用于緩存其他東西,例如圖檔、視訊等等。

2.Redis不僅僅支援簡單的k/v類型的資料,同時還提供list,set,hash等資料結構的存儲。

3.3、虛拟記憶體–Redis當實體記憶體用完時,可以将一些很久沒用到的value 交換到磁盤

4.過期政策–memcache在set時就指定,例如set key1 0 0 8,即永不過期。Redis可以通過例如expire 設定,例如expire name 10

5.分布式–設定memcache叢集,利用magent做一主多從;redis可以做一主多從。都可以一主一從

6.存儲資料安全–memcache挂掉後,資料沒了;redis可以定期儲存到磁盤(持久化)

7.災難恢複–memcache挂掉後,資料不可恢複; redis資料丢失後可以通過aof恢複

8.Redis支援資料的備份,即master-slave模式的資料備份。

Redis和Memcache的不同點

1.存儲方式

memecache 把資料全部存在記憶體之中,斷電後會挂掉,資料不能超過記憶體大小

redis有部份存在硬碟上,這樣能保證資料的持久性,支援資料的持久化(筆者注:有RDB和AOF日志兩種持久化方式。

2.資料支援類型

redis在資料支援上要比memecache多的多。

3.使用底層模型不同

新版本的redis直接自己建構了VM 機制 ,因為一般的系統調用系統函數的話,會浪費一定的時間去移動和請求。

Redis支援資料類型

String(字元串)

String是簡單的k-v鍵值對,需要注意的是一個鍵值對打存儲512MB。

hash

hash是一個鍵值(key->value)對集合;是一個 string 類型的 field 和 value 的映射表,hash 特别适合用于存儲對象。

list

list清單是簡單的字元串清單,按照插入順序排序。你可以添加一個元素到清單的頭部(左邊)或者尾部(右邊)。

set

Set是string類型的無序集合。和清單一樣,在執行插入和删除和判斷是否存在某元素時,效率是很高的。集合最大的優勢在于可以進行交集并集差集操作。Set可包含的最大元素數量是4294967295。

集合是通過哈希表實作的,是以添加,删除,查找的複雜度都是O(1)。

zset

zset 和 set 一樣也是string類型元素的集合,且不允許重複的成員。不同的是每個元素都會關聯一個double類型的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。

Redis資料持久化

在redis中三個實作資料持久化有兩種實作方式:

RDB:制定的時間間隔内對儲存資料并快照,原理是将Reids在記憶體中的資料庫記錄定時dump到磁盤上的RDB持久化(預設開啟);

AOF:把指令追加到記錄檔的尾部儲存所有的曆史操作,append only file原理是将Reids的記錄檔以追加的方式寫入檔案。

二者差別

RDB持久化是指在指定的時間間隔内将記憶體中的資料集快照寫入磁盤,實際操作過程中是fork一個子程序,先将資料寫入一個臨時檔案中,寫入成功之過後,再替換之前的檔案,用二進制壓縮存儲(dump.rbd檔案)。

AOF持久化以日志形式記錄伺服器所處理的每一個寫、删除操作,以文本形式儲存(預設不開啟)。

RDB和AOF觸發機制

1.RDB觸發機制

1、save觸發方式:該指令會阻塞目前Redis伺服器,執行save指令期間,Redis不能處理其他指令,直到RDB過程完成為止。

2、bgsave觸發方式:執行該指令時,Redis會在背景異步進行快照操作,快照同時還可以響應用戶端請求。

3、自動觸發:自動觸發是由我們的配置檔案來完成的。在redis.conf配置檔案中,裡面有如下配置,我們可以去設定:

2.

兩種方式優缺點

1. RDB方式

•優點:

1.RDB是一個單一的緊湊檔案,它儲存了某個時間點得資料集,非常适用于資料集的備份,比如你可以在每個小時報儲存一下過去24小時内的資料,同時每天儲存過去30天的資料,這樣即使出了問題你也可以根據需求恢複到不同版本的資料集.

2.RDB是一個緊湊的單一檔案,友善傳送,适用于災難恢複.

3.RDB在儲存RDB檔案時父程序唯一需要做的就是fork出一個子程序,接下來的工作全部由子程序來做,父程序不需要再做其他IO操作,是以RDB持久化方式可以最大化redis的性能.

4.與AOF相比,在恢複大的資料集的時候,RDB方式會更快一些.

•缺點:

1.Redis意外當機,可能會丢失幾分鐘的資料(取決于配置的save時間點)。RDB方式需要儲存珍整個資料集,是一個比較繁重的工作,通常需要設定5分鐘或者更久做一次完整的儲存。

2.RDB 需要經常fork子程序來儲存資料集到硬碟上,當資料集比較大的時候,fork的過程是非常耗時的,可能會導緻Redis在一些毫秒級内不能響應用戶端的請求.如果資料集巨大并且CPU性能不是很好的情況下,這種情況會持續更久。

2. AOF方式

•優點

3.使用AOF 會讓Redis資料更加耐久: 你可以使用不同的fsync政策:無fsync,每秒fsync,每次寫的時候fsync.使用預設的每秒fsync政策,Redis的性能依然很好(fsync是由背景線程進行處理的,主線程會盡力處理用戶端請求),一旦出現故障,你最多丢失1秒的資料。

4.AOF檔案是一個隻進行追加的日志檔案,是以不需要寫入seek,即使由于某些原因(磁盤空間已滿,寫的過程中當機等等)未執行完整的寫入指令,也可使用redis-check-aof工具修複這些問題.

5.Redis 可以在 AOF 檔案體積變得過大時,自動地在背景對 AOF 進行重寫: 重寫後的新 AOF 檔案包含了恢複目前資料集所需的最小指令集合。 整個重寫操作是絕對安全的,因為 Redis 在建立新 AOF 檔案的過程中,會繼續将指令追加到現有的 AOF 檔案裡面,即使重寫過程中發生停機,現有的 AOF 檔案也不會丢失。 而一旦新 AOF 檔案建立完畢,Redis 就會從舊 AOF 檔案切換到新 AOF 檔案,并開始對新 AOF 檔案進行追加操作。

6.AOF 檔案有序地儲存了對資料庫執行的所有寫入操作, 這些寫入操作以 Redis 協定的格式儲存, 是以 AOF 檔案的内容非常容易被人讀懂, 對檔案進行分析也很輕松。 導出AOF 檔案也非常簡單: 舉個例子, 如果你不小心執行了 FLUSHALL 指令, 但隻要 AOF 檔案未被重寫, 那麼隻要停止伺服器, 移除 AOF 檔案末尾的 FLUSHALL 指令, 并重新開機 Redis,就可以将資料集恢複到 FLUSHALL 執行之前的狀态。

•缺點

7.對于相同的資料集來說,AOF 檔案的體積通常要大于 RDB 檔案的體積。

8.根據所使用的 fsync 政策,AOF 的速度可能會慢于 RDB 。在一般情況下,每秒 fsync 的性能依然非常高, 而關閉 fsync 可以讓 AOF 的速度和 RDB 一樣快, 即使在高負荷之下也是如此。 不過在處理巨大的寫入載入時,RDB 可以提供更有保證的最大延遲時間。

Redis淘汰政策

1、volatile-lru: 從已設定過期時間的資料集(server.db[i].expires)中挑選最近最少使用的資料淘汰。

2、volatile-ttl: 從已設定過期時間的資料集(server.db[i].expires)中挑選将要過期的資料淘汰volatile-random: 從已設定過期時間的資料集(server.db[i].expires)中任意選擇資料淘汰。

3、allkeys-lru: 從資料集(server.db[i].dict)中挑選最近最少使用的資料淘汰。

4、allkeys-random: 從資料集(server.db[i].dict)中任意選擇資料淘汰。

5、no-enviction: 禁止驅逐資料。