一文入門Redis

一文入門Redis

1、Redis簡介

Redis:REmote DIctionary Server(遠程字典服務)。是一款使用C語言編寫的、開源的、基於內存的、高性能的、可持久化的非關係型Key-Value數據庫。redis

2、經常使用數據類型

一、String(字符串)

string是redis最基本的數據類型,一個key對應一個value。string類型是二進制安全的,能夠包含任何數據,包括圖片、序列化的對象等,最大存儲512MB。算法

經常使用命令:數據庫

命令 描述 用法
SET 一、將value關聯到key;二、key已關聯則覆蓋;三、本來key帶有TTL(生存時間),那麼TTL被清楚 SET key value
GET 一、返回key所關聯的字符串值;二、key不存在返回null; GET key
SETEX 一、將value關聯到key;二、設置key生存時間爲seconds,單位爲秒;三、若是key已關聯則覆蓋;四、原子操做,關聯與設置生存時間同時完成 SETEX key seconds value
SETNX 一、將value關聯到key,當且僅當key不存在;二、若key已存在,不作任何動做 SETNX key value

二、Hash(哈希)

hash是一個string類型的field和value的映射表,key 仍是key,可是value是多個鍵值對(key-value),比較適合存儲對象。緩存

經常使用命令:安全

命令 描述 用法
HSET 一、將key中的field值設爲value;二、filed已存在,被覆蓋 HSET key field value
HGET 一、返回key中給定域field中的值 HGET key field
HDEL 一、刪除key中的一個或多個指定域;二、不存在的域被忽略 HDEL key field
HEXISTS 一、查看key中,給定域field是否存在,存在返回1,否,返回0 HEXISTS key field
HGETALL 一、返回key中全部的域和值 HGETALL key
HLEN 一、返回key中域的數量 HLNE key

三、List(列表)

list 列表,它是簡單的字符串列表,按照插入順序排序,你能夠添加一個元素到列表的頭部(左邊)或者尾部(右邊),它的底層其實是個鏈表。有序、能夠重複。服務器

經常使用命令:app

命令 描述 用法
LPUSH 一、將一個或多個值value按順序插入到key的表頭;二、key不存在,則建立並插入;三、key存在但不是list類型,返回錯誤; LPSUH key value
LPUSHX 一、將value插入到key的頭部,當且僅當key存在且爲list類型;二、key不存在,什麼都不作; LPUSHX key value
LPOP 一、移除並返回key的頭元素; LPOP key
LRANGE 一、返回key中指定區間的元素;二、可以使用負數下標,-1表示list最後一個元素;三、start大於list最大下標,返回空列表;四、stop大於list最大下標,stop=list最大下標; LRANG key start stop
LSET 一、將key下標爲index的元素值設爲value;二、index超出範圍或list爲空,返回錯誤; LSET key index value
LINDEX 一、返回key中,下標爲index的元素; LINDEX key index
LLEN 一、返回key的長度;二、key不存在,返回0; LLEN key
RPUSH 一、將一個或多個值value按順序插入到key的表尾; RPUSH key value
RPUSHX 一、將value插入到key的尾部,當且僅當key存在且爲list類型; RPUSHX key value
RPOP 一、移除並返回key的尾元素; RPOP key

四、Set(集合)

set 是 string 類型的無序集合。無序、不可重複異步

經常使用命令:函數

命令 描述 用法
SADD 一、將一個或多個元素加入key中,已存在的元素將返回0;二、key不存在,則建立並添加;三、key不是集合類型時,返回錯誤 SADD key member
SCARD 一、返回key中對應的集合中的元素數量 SCARD key

五、Zset(有序集合)

Redis 有序集合和集合同樣也是 string 類型元素的集合,且不容許重複的成員。性能

不一樣的是每一個元素都會關聯一個 double 類型的分數。redis 正是經過分數來爲集合中的成員進行從小到大的排序。

有序集合的成員是惟一的,但分數(score)卻能夠重複。

命令 描述 用法
ZADD 一、將一個或多個元素及其score值加入key中;二、若是已存在元素,則更新score值並從新插入; ZADD key score member
ZCARD 一、返回key中元素個數 ZCARD key
ZRANGE 一、返回key中指定區間類的成員,按score從小到大排序;二、相同score值按字典序排序;三、從大到小排序,使用ZREVRANGE命令;四、可經過WITHSCORES選項讓成員和它的score值一併返回 ZRANGE key start stop [WITHSCORES]
ZRANK 一、返回有序集中成員member的排名,按score從小到大排序;二、排名以0爲底,score最小的排名0 ZRANK key member

1607871305844

3、持久化

Redis 是一個內存數據庫將數據庫中的內容保存在內存中,這與傳統的MySQL等關係型數據庫直接將內容保存到硬盤中相比,內存數據庫的讀寫效率比傳統數據庫要快的多(內存的讀寫效率遠遠大於硬盤的讀寫效率),這也是Redis如此之快的緣由。可是保存在內存中也隨之帶來了一個缺點,一旦斷電或者宕機,那麼內存數據庫中的數據將會所有丟失。

爲了解決這個缺點,Redis提供了將內存數據持久化到硬盤,以及用持久化文件來恢復數據庫數據的功能。Redis 支持兩種形式的持久化,分別是RDB(Redis DataBase)和AOF(Append Only File)。

一、持久化流程

  1. 客戶端向服務端發送寫操做(數據在客戶端的內存中)。
  2. 數據庫服務端接收到寫請求的數據(數據在服務端的內存中)。
  3. 服務端調用write這個系統調用,將數據往磁盤上寫(數據在系統內存的緩衝區中)。
  4. 操做系統將緩衝區中的數據轉移到磁盤控制器上(數據在磁盤緩存中)。
  5. 磁盤控制器將數據寫到磁盤的物理介質中(數據真正落到磁盤上)。

這5個過程是在理想條件下一個正常的保存流程,可是在大多數狀況下,咱們的機器等等都會有各類各樣的故障,這裏劃分了兩種狀況:

  1. Redis數據庫發生故障,只要在上面的第三步執行完畢,那麼就能夠持久化保存,剩下的兩步由操做系統替咱們完成。
  2. 操做系統發生故障,必須上面5步都完成才能夠。

二、RDB

RDB持久化是指在指定的時間間隔內將內存中的數據集快照寫入磁盤。即將內存中數據以快照的方式寫入到二進制文件中,默認的文件名爲dump.rdb。

將備份文件 (dump.rdb) 移動到 redis 安裝目錄並啓動服務便可回覆數據,redis就會自動加載文件數據至內存了。Redis 服務器在載入 RDB 文件期間,會一直處於阻塞狀態,直到載入工做完成爲止。

2.一、原理

把當前內存中的數據集快照寫入磁盤,也就是 Snapshot 快照(數據庫中全部鍵值對數據)。恢復時是將快照文件直接讀到內存裏。也是Redis默認的持久化方式。

2.二、觸發方式

一、save

該命令會阻塞當前Redis服務器,執行save命令期間,Redis不能處理其餘命令,直到RDB過程完成爲止。執行完成時候若是存在老的RDB文件,就把新的替代掉舊的。咱們的客戶端可能都是幾萬或者是幾十萬,這種方式顯然不可取。

save m n」:表示m秒內數據集存在n次修改時,自動觸發bgsave。

redis.conf中默認配置:

save 900 1:表示900 秒內若是至少有 1 個 key 的值變化,則保存
save 300 10:表示300 秒內若是至少有 10 個 key 的值變化,則保存
save 60 10000:表示60 秒內若是至少有 10000 個 key 的值變化,則保存
二、bgsave

執行該命令時,Redis會在後臺異步進行快照操做,快照同時還能夠響應客戶端請求。

具體操做是Redis進程執行fork操做建立子進程,RDB持久化過程由子進程負責,完成後自動結束。阻塞只發生在fork階段,通常時間很短。基本上 Redis 內部全部的RDB操做都是採用 bgsave 命令。

2.三、優缺點

  • 優勢

    1.RDB是一個很是緊湊(compact)的文件,它保存了redis 在某個時間點上的數據集。這種文件很是適合用於進行備份和災難恢復。

    2.生成RDB文件的時候,redis主進程會fork()一個子進程來處理全部保存工做,主進程不須要進行任何磁盤IO操做。

    3.RDB 在恢復大數據集時的速度比 AOF 的恢復速度要快。

  • 缺點

    1.RDB方式數據沒辦法作到實時持久化/秒級持久化。由於bgsave每次運行都要執行fork操做建立子進程,屬於重量級操做,若是不採用壓縮算法(內存中的數據被克隆了一份,大體2倍的膨脹性須要考慮),頻繁執行成本太高(影響性能)

    2.RDB文件使用特定二進制格式保存,Redis版本演進過程當中有多個格式的RDB版本,存在老版本Redis服務沒法兼容新版RDB格式的問題(版本不兼容)

    3.在必定間隔時間作一次備份,因此若是redis意外down掉的話,就會丟失最後一次快照後的全部修改(數據有丟失)

三、AOF

全量備份老是耗時的,AOF是一種更加高效的方式,工做機制很簡單,redis會將每個收到的寫命令都經過write函數追加到文件中。通俗的理解就是日誌記錄。

3.一、原理

經過保存Redis服務器所執行的寫命令來記錄數據庫狀態。

好比對於以下命令

set str1 "123"
sadd str2 "1" "2" "3"
lpush str3 "1" "2" "3"

RDB 持久化方式就是將 str1,str2,str3 這三個鍵值對保存到 RDB文件中,而 AOF 持久化則是將執行的 set,sadd,lpush 三個命令保存到 AOF 文件中。

3.二、配置

在redis.conf中,

  • appendonly:默認值no,也就是說redis 默認使用的是rdb方式持久化,若是想要開啓 AOF 持久化方式,須要將 appendonly 修改成 yes。
  • appendfilename :aof文件名,默認是"appendonly.aof"
  • appendfsync:aof持久化策略的配置:
    1. no表示不執行fsync,由操做系統保證數據同步到磁盤,速度最快,可是不太安全;
    2. always表示每次寫入都執行fsync,以保證數據同步到磁盤,效率很低;
    3. everysec表示每秒執行一次fsync,可能會致使丟失這1s數據。一般選擇 everysec ,兼顧安全性和效率。

3.二、優缺點

  • 優勢

    1.AOF能夠更好的保護數據不丟失,通常AOF會每隔1秒,經過一個後臺線程執行一次fsync操做,最多丟失1秒鐘的數據。

    2.AOF日誌文件的命令經過很是可讀的方式進行記錄,這個特性很是適合作災難性的誤刪除的緊急恢復。例如,若是咱們不當心錯用了 FLUSHALL 命令,在重寫還沒進行時,咱們能夠手工將最後的 FLUSHALL 命令去掉,而後再使用 AOF 來恢復數據。

  • 缺點

    1.對於具備相同數據的的 Redis,AOF 文件一般會比 RDF 文件體積更大。(當AOF文件的大小超過所設定的閾值時,Redis就會啓動AOF文件的內容壓縮,只保留能夠恢復數據的最小指令集)

    2.RDB 使用快照的形式來持久化整個 Redis 數據,而 AOF 只是將每次執行的命令追加到 AOF 文件中,所以從理論上說,RDB 比 AOF 方式更健壯。官方文檔也指出,AOF 的確也存在一些 BUG,這些 BUG 在 RDB 沒有存在。

四、如何選擇持久化方式?

若是能夠忍受一小段時間內數據的丟失,毫無疑問使用 RDB 是最好的,定時生成 RDB 快照(snapshot)很是便於進行數據庫備份, 而且 RDB 恢復數據集的速度也要比 AOF 恢復的速度要快,並且使用 RDB 還能夠避免 AOF 一些隱藏的 bug;不然就使用 AOF 重寫。可是通常狀況下建議不要單獨使用某一種持久化機制,而是應該兩種一塊兒用,在這種狀況下,當redis重啓的時候會優先載入AOF文件來恢復原始的數據,由於在一般狀況下AOF文件保存的數據集要比RDB文件保存的數據集要完整。Redis後期官方可能都有將兩種持久化方式整合爲一種持久化模型。


若是有學到東西,請點贊給予鼓勵,謝謝。

相關文章
相關標籤/搜索