天天看點

Redis(1)-Redis簡介與特性詳解Redis是什麼?一.Redis 特點概覽二、持久化相關三、過期鍵的删除政策四、Redis的應用場景五、Redis的常見資料類型

随着網際網路的高速發展,高并發,大資料量的應用場景越來越普遍,傳統的DB資料庫已經不能直接的支撐業務的要求了,系統需要那些低延遲高處理速度,能夠處理海量的資料流,并且易于大規模叢集化管理的資料存儲系統。這時候 ,NoSQL型資料庫應運而生,它一般具備高性能、可擴充性強、高可用等優點,而Redis便是其中應用最廣泛的一種。

Redis是什麼?

在redis的官網上我們可以看到下面一段簡介:

Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache, and message broker. Redis provides data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes, and streams. Redis has built-in replication, Lua scripting, LRU eviction, transactions, and different levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster.

Redis是一個開源(BSD許可),基于記憶體運作的資料結構存儲系統,可用作資料庫、緩存和消息代理。Redis提供諸如字元串(String)、哈希(Hash)、清單(List)、集合(Set)、 有序集合 (sorted set)、位圖(Bitmaps)、hyperloglogs、geospatial indexes,和流(streams)等資料結構。Redis具有内置的 複制(replication), LUA腳本(Lua scripting),LRU驅動事件(LRU eviction),事務(transactions) 和不同級别的磁盤持久性 (persistence),并通過Sentinel和自動分區(Cluster)提供高可用性(high availability) 。

簡而言之,Redis是一種開源的,運作于記憶體中的的,基于k-v(鍵值對)的非關系型資料存儲系統。

一.Redis 特點概覽

Redis作為目前市場上最受歡迎的NoSQL資料庫,有着非常多的優點。下面總體的概括介紹下,Redis的特點:

純記憶體操作、讀寫性能優異: C語言實作,所有資料都加載在記憶體中,運作速度非常快,資料讀速度11萬/秒,寫資料81000/s。(在筆者所在公司單台redis機器為2C4G的規格,通常計算tps為2萬tps/s);

單程序單線程模型 :單線程操作,避免線程上下文切換開銷,非阻塞的多路複用IO防止IO等待的開銷 ,這也是Reids快的一個原因。

支援資料持久化:基于記憶體存儲的Redis,提供了提供了兩種資料持久化政策(RDB 和 AOF),可以友善的實作資料的落盤存儲。

操作原子性, 支援事務:所有Redis操作是原子的,同時Redis還支援對幾個操作合并後的原子性執行。

非關系型、資料結構豐富: Redis為key-value存儲系統 ,支援多種資料結構:清單,集合,有序集合,散列資料類型。

支援主從複制(master-slaver):通過主從複制可以允許多個slave server擁有和master server相同的資料庫副本。可讀寫分離,讓master server專用于寫資料,slave server用于讀資料,一寫多讀。

實作高可用和分布式:提供了高可用實作Redis Sentinel,它能夠保證Redis節點的故障發現和故障自動轉移。從3.0版本正式提供了分布式實作Redis Cluster,它是Redis真正的分布式實作,提供了高可用、讀寫和容量的擴充性。

支援多開發語言:Redis支援多種語言,諸如Lua,Ruby,Python, Twisted Python, PHP, Erlang, Tcl, Perl, ,Java, Scala, Clojure等。

下面将結合這些特點,對Redis的一些常見知識做梳理,幫助讀者更快的了解Redis。

1.為什麼要使用Redis?

因為Redis夠快,讀寫速度快就意味“高性能”與天生适應“高并發”,而這兩個性能正是現代網際網路所需要的。

2.Redis為什麼這麼快?

1、完全基于記憶體,絕大部分請求是純粹的記憶體操作,非常快速。資料存在記憶體中,類似于 HashMap,HashMap 的優勢就是查找和操作的時間複雜度都是O(1);

2、資料結構簡單,對資料操作也簡單,Redis 中的資料結構是專門進行設計的;

3、采用單線程,避免了不必要的上下文切換和競争條件,也不存在多程序或者多線程導緻的切換而消耗 CPU,不用去考慮各種鎖的問題,不存在加鎖釋放鎖操作,沒有因為可能出現死鎖而導緻的性能消耗;

4、使用多路 I/O 複用模型,非阻塞 IO;

3.Redis有哪些資料類型

Redis主要有5種資料類型,包括String,List,Set,Zset,Hash,滿足大部分的使用要求

二、持久化相關

3.Redis為什麼要持久化?

Redis是純記憶體操作的,那麼斷電停機了要怎麼辦?是以出現了資料持久化,即把記憶體的資料寫到磁盤中去,防止服務當機了記憶體資料丢失。

4. Redis 的持久化機制是什麼?各自的優缺點?

Redis 提供兩種持久化機制 RDB(預設) 和 AOF 機制:

RDB:是Redis DataBase縮寫快照

RDB是Redis預設的持久化方式。按照一定的時間将記憶體的資料以快照的形式儲存到硬碟中,對應産生的資料檔案為dump.rdb。通過配置檔案中的save參數來定義快照的周期。

Redis(1)-Redis簡介與特性詳解Redis是什麼?一.Redis 特點概覽二、持久化相關三、過期鍵的删除政策四、Redis的應用場景五、Redis的常見資料類型

優點:

  • 1、隻有一個檔案 dump.rdb,友善持久化。
  • 2、容災性好,一個檔案可以儲存到安全的磁盤。
  • 3、性能最大化,fork 子程序來完成寫操作,讓主程序繼續處理指令,是以是 IO 最大化。使用單獨子程序來進行持久化,主程序不會進行任何 IO 操作,保證了 redis 的高性能
  • 4.相對于資料集大時,比 AOF 的啟動效率更高。

缺點:

​ 資料安全性低。RDB 是間隔一段時間進行持久化,如果持久化之間 redis 發生故障,會發生資料丢失。是以這種方式更适合資料要求不嚴謹的時候)

  • AOF:持久化

AOF持久化(即Append Only File持久化),則是将Redis執行的每次寫指令記錄到單獨的日志檔案中(aof 檔案),當重新開機Redis會重新将持久化的日志中檔案恢複資料。

當兩種方式同時開啟時,資料恢複Redis會優先選擇AOF恢複。

Redis(1)-Redis簡介與特性詳解Redis是什麼?一.Redis 特點概覽二、持久化相關三、過期鍵的删除政策四、Redis的應用場景五、Redis的常見資料類型

優點:

  • 1、資料安全,aof 持久化可以配置 appendfsync 屬性,有 always,每進行一次 指令操作就記錄到 aof 檔案中一次。
  • 2、通過 append 模式寫檔案,即使中途伺服器當機,可以通過 redis-check-aof 工具解決資料一緻性問題。
  • 3、AOF 機制的 rewrite 模式。AOF 檔案沒被 rewrite 之前(檔案過大時會對指令 進行合并重寫),可以删除其中的某些指令(比如誤操作的 flushall))

缺點:

  • 1、AOF 檔案比 RDB 檔案大,且恢複速度慢。
  • 2、資料集大的時候,比 rdb 啟動效率低。

總結

  • AOF檔案比RDB更新頻率高,優先使用AOF還原資料。
  • AOF比RDB更安全也更大
  • RDB性能比AOF好
  • 如果兩個都配了優先加載AO

5.如何選擇合适的持久化方式?

  • 一般來說, 如果想達到足以媲美PostgreSQL的資料安全性,你應該同時使用兩種持久化功能。在這種情況下,當 Redis 重新開機的時候會優先載入AOF檔案來恢複原始的資料,因為在通常情況下AOF檔案儲存的資料集要比RDB檔案儲存的資料集要完整。
  • 如果你非常關心你的資料, 但仍然可以承受數分鐘以内的資料丢失,那麼你可以隻使用RDB持久化。
  • 有很多使用者都隻使用AOF持久化,但并不推薦這種方式,因為定時生成RDB快照(snapshot)非常便于進行資料庫備份, 并且 RDB 恢複資料集的速度也要比AOF恢複的速度要快,除此之外,使用RDB還可以避免AOF程式的bug。
  • 如果你隻希望你的資料在伺服器運作的時候存在,你也可以不使用任何持久化方式。

三、過期鍵的删除政策

6. Redis的過期鍵的删除政策

我們都知道,Redis是key-value資料庫,我們可以設定Redis中緩存的key的過期時間。Redis的過期政策就是指當Redis中緩存的key過期了,Redis如何處理。

過期政策通常有以下三種:

  • 定時過期:每個設定過期時間的key都需要建立一個定時器,到過期時間就會立即清除。該政策可以立即清除過期的資料,對記憶體很友好;但是會占用大量的CPU資源去處理過期的資料,進而影響緩存的響應時間和吞吐量。
  • 惰性過期:隻有當通路一個key時,才會判斷該key是否已過期,過期則清除。該政策可以最大化地節省CPU資源,卻對記憶體非常不友好。極端情況可能出現大量的過期key沒有再次被通路,進而不會被清除,占用大量記憶體。
  • 定期過期:每隔一定的時間,會掃描一定數量的資料庫的expires字典中一定數量的key,并清除其中已過期的key。該政策是前兩者的一個折中方案。通過調整定時掃描的時間間隔和每次掃描的限定耗時,可以在不同情況下使得CPU和記憶體資源達到最優的平衡效果。

    (expires字典會儲存所有設定了過期時間的key的過期時間資料,其中,key是指向鍵空間中的某個鍵的指針,value是該鍵的毫秒精度的UNIX時間戳表示的過期時間。鍵空間是指該Redis叢集中儲存的所有鍵。)

Redis中同時使用了惰性過期和定期過期兩種過期政策。

擴充:Redis key的過期時間和永久有效分别怎麼設定?

EXPIRE和PERSIST指令。

7.Redis的記憶體空間用完了會怎樣?

1.如果達到設定的上限,Redis的寫指令會傳回錯誤資訊(但是讀指令還可以正常傳回)。

2.如果配置了記憶體淘汰機制,當Redis達到記憶體上限時會沖刷掉舊的内容。

8. Redis的記憶體淘汰政策有哪些?

Redis的記憶體淘汰政策是指在Redis的用于緩存的記憶體不足時,怎麼處理需要新寫入且需要申請額外空間的資料。

不同于之前的版本,redis5.0為我們提供了八個不同的記憶體置換政策。很早之前提供了6種。

設定過期時間的鍵空間選擇性移除:

(1)volatile-lru:從已設定過期時間的資料集中挑選最近最少使用的資料淘汰。

(2)volatile-ttl:從已設定過期時間的資料集中挑選将要過期的資料淘汰。

(3)volatile-random:從已設定過期時間的資料集中任意選擇資料淘汰。

(4)volatile-lfu:從已設定過期時間的資料集挑選使用頻率最低的資料淘汰。

全局的鍵空間選擇性移除

(5)allkeys-lru:從資料集中挑選最近最少使用的資料淘汰

(6)allkeys-lfu:從資料集中挑選使用頻率最低的資料淘汰。

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

(8) no-enviction(驅逐):禁止驅逐資料,這也是預設政策。意思是當記憶體不足以容納新入資料時,新寫入操作就會報錯,請求可以繼續進行,線上任務也不能持續進行,

Redis(1)-Redis簡介與特性詳解Redis是什麼?一.Redis 特點概覽二、持久化相關三、過期鍵的删除政策四、Redis的應用場景五、Redis的常見資料類型

9.淘汰機制的實作

1、删除失效主鍵

既然是淘汰,那就需要把這些資料給删除,然後儲存新的。Redis 删除失效主鍵的方法主要有兩種:

(1)消極方法(passive way),在主鍵被通路時如果發現它已經失效,那麼就删除它。redis在實作GET、MGET、HGET、LRANGE等所有涉及到讀取資料的指令時都會調用 expireIfNeeded,它存在的意義就是在讀取資料之前先檢查一下它有沒有失效,如果失效了就删除它。

(2)積極方法(active way),周期性地探測,發現失效就删除。消極方法的缺點是,如果key 遲遲不被通路,就會占用很多記憶體空間,是以才有積極方式。

(3)主動删除:當記憶體超過maxmemory限定時,觸發主動清理政策,該政策由啟動參數的配置決定

主鍵具體的失效時間全部都維護在expires這個字典表中:

Redis(1)-Redis簡介與特性詳解Redis是什麼?一.Redis 特點概覽二、持久化相關三、過期鍵的删除政策四、Redis的應用場景五、Redis的常見資料類型

四、Redis的應用場景

1.計數器

可以對 String 進行自增自減運算,進而實作計數器功能。Redis 這種記憶體型資料庫的讀寫性能非常高,很适合存儲頻繁讀寫的計數量。利用這一特性可以生成全局唯一性ID。

2.緩存

将熱點資料放到記憶體中,設定記憶體的最大使用量以及淘汰政策來保證緩存的命中率。

3.分布式鎖實作

在分布式場景下,無法使用單機環境下的鎖來對多個節點上的程序進行同步。可以使用 Redis 自帶的 SETNX 指令實作分布式鎖,除此之外,還可以使用官方提供的 RedLock 分布式鎖實作。

4.消息隊列(釋出/訂閱功能)

List 是一個雙向連結清單,可以通過 lpush 和 rpop 寫入和讀取消息。不過最好使用 Kafka、RabbitMQ 等消息中間件。

5.查找表

例如 DNS 記錄就很适合使用 Redis 進行存儲。查找表和緩存類似,也是利用了 Redis 快速的查找特性。但是查找表的内容不能失效,而緩存的内容可以失效,因為緩存不作為可靠的資料來源。

五、Redis的常見資料類型

Redis主要有5種資料類型,包括String,List,Set,Zset,Hash,滿足大部分的使用要求

資料類型 可存儲的Value 操作 應用場景
String 字元串、整數、浮點數

對整個字元串或其中部分操作;

對數進行自增、自減操作

鍵-值 緩存
List 清單

首位壓入、彈出元素;

對部分元素進行操作

存儲表型資料結構,入文章清單
Hash 包含鍵值對的無序散清單

添加、擷取、移除單個鍵值對;

擷取所有鍵值對;

檢查某鍵是否存在

結構化對象,如一個實體
Set 無序集合

添加、擷取、移除單個元素;

檢查元素是否存在;

計算交、并、差集;

從集合中随機擷取元素

交集、并集、差集操作
ZSet 有序集合

添加、擷取、移除單個元素;

根據分值範圍或成員來擷取元素

計算一個鍵的排名

去重、排序