Redis:REmote DIctionary Server(遠程字典服務)。是一款使用C語言編寫的、開源的、基於內存的、高性能的、可持久化的非關係型Key-Value數據庫。redis
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是一個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 列表,它是簡單的字符串列表,按照插入順序排序,你能夠添加一個元素到列表的頭部(左邊)或者尾部(右邊),它的底層其實是個鏈表。有序、能夠重複。服務器
經常使用命令: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 是 string 類型的無序集合。無序、不可重複異步
經常使用命令:函數
命令 | 描述 | 用法 |
---|---|---|
SADD | 一、將一個或多個元素加入key中,已存在的元素將返回0;二、key不存在,則建立並添加;三、key不是集合類型時,返回錯誤 | SADD key member |
SCARD | 一、返回key中對應的集合中的元素數量 | SCARD key |
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 |
Redis 是一個內存數據庫將數據庫中的內容保存在內存中,這與傳統的MySQL等關係型數據庫直接將內容保存到硬盤中相比,內存數據庫的讀寫效率比傳統數據庫要快的多(內存的讀寫效率遠遠大於硬盤的讀寫效率),這也是Redis如此之快的緣由。可是保存在內存中也隨之帶來了一個缺點,一旦斷電或者宕機,那麼內存數據庫中的數據將會所有丟失。
爲了解決這個缺點,Redis提供了將內存數據持久化到硬盤,以及用持久化文件來恢復數據庫數據的功能。Redis 支持兩種形式的持久化,分別是RDB(Redis DataBase)和AOF(Append Only File)。
這5個過程是在理想條件下一個正常的保存流程,可是在大多數狀況下,咱們的機器等等都會有各類各樣的故障,這裏劃分了兩種狀況:
RDB持久化是指在指定的時間間隔內將內存中的數據集快照寫入磁盤。即將內存中數據以快照的方式寫入到二進制文件中,默認的文件名爲dump.rdb。
將備份文件 (dump.rdb) 移動到 redis 安裝目錄並啓動服務便可回覆數據,redis就會自動加載文件數據至內存了。Redis 服務器在載入 RDB 文件期間,會一直處於阻塞狀態,直到載入工做完成爲止。
把當前內存中的數據集快照寫入磁盤,也就是 Snapshot 快照(數據庫中全部鍵值對數據)。恢復時是將快照文件直接讀到內存裏。也是Redis默認的持久化方式。
該命令會阻塞當前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 的值變化,則保存
執行該命令時,Redis會在後臺異步進行快照操做,快照同時還能夠響應客戶端請求。
具體操做是Redis進程執行fork操做建立子進程,RDB持久化過程由子進程負責,完成後自動結束。阻塞只發生在fork階段,通常時間很短。基本上 Redis 內部全部的RDB操做都是採用 bgsave 命令。
優勢
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是一種更加高效的方式,工做機制很簡單,redis會將每個收到的寫命令都經過write函數追加到文件中。通俗的理解就是日誌記錄。
經過保存Redis服務器所執行的寫命令來記錄數據庫狀態。
好比對於以下命令
set str1 "123" sadd str2 "1" "2" "3" lpush str3 "1" "2" "3"
RDB 持久化方式就是將 str1,str2,str3 這三個鍵值對保存到 RDB文件中,而 AOF 持久化則是將執行的 set,sadd,lpush 三個命令保存到 AOF 文件中。
在redis.conf中,
優勢
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後期官方可能都有將兩種持久化方式整合爲一種持久化模型。
若是有學到東西,請點贊給予鼓勵,謝謝。