redis是一個(gè)開(kāi)源的使用C語(yǔ)言編寫的一個(gè)kv存儲(chǔ)系統(tǒng)
發(fā)布時(shí)間:2019/9/2 14:55:06 訪問(wèn)次數(shù):2816
關(guān)于Redis
redis是一個(gè)開(kāi)源的使用C語(yǔ)言編寫的一個(gè)kv存儲(chǔ)系統(tǒng),是一個(gè)速度非?斓姆顷P(guān)系遠(yuǎn)程內(nèi)存數(shù)據(jù)庫(kù)。它支持包括String、List、Set、Zset、hash五種數(shù)據(jù)結(jié)構(gòu)。除此之外,通過(guò)復(fù)制、持久化和客戶端分片等特性,用戶可以很方便地將redis擴(kuò)展成一個(gè)能夠包含數(shù)百GB數(shù)據(jù)和每秒處理上百萬(wàn)次的請(qǐng)求的系統(tǒng)。目前支持多種語(yǔ)言的api,方便用戶使用。
redis同時(shí)也內(nèi)置了事務(wù)、LUA腳本、復(fù)制等功能,提供兩種持久化選項(xiàng),一種是每隔一段時(shí)間將數(shù)據(jù)導(dǎo)入到磁盤(快照模式),另一種是追加命令到日志中(AOF模式)。如果只是作為高效的內(nèi)存數(shù)據(jù)庫(kù)使用也可以關(guān)閉持久化功能。通過(guò)哨兵(sentinel)和自動(dòng)分區(qū)(Cuuster)的方式可以提高redis服務(wù)器的高可用性。
與關(guān)系型數(shù)據(jù)庫(kù)相比,redis的命令請(qǐng)求不需要經(jīng)過(guò)查詢分析器或查詢優(yōu)化器進(jìn)行處理,也避免了更新數(shù)據(jù)時(shí)引起的隨機(jī)讀\寫,這些慢操作。它直接讀寫內(nèi)存中的數(shù)據(jù),并且數(shù)據(jù)是按照一定的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)的。所以它的速度非?臁
不同于memcached等完全基于內(nèi)存的緩存中間件,Redis同時(shí)還提供了持久化功能,這也是為什么Redis不僅可以用來(lái)做數(shù)據(jù)緩存還可以用來(lái)做數(shù)據(jù)存儲(chǔ),服務(wù)器節(jié)點(diǎn)宕機(jī)之后可以通過(guò)事先持久化的數(shù)據(jù)還原數(shù)據(jù)到某個(gè)時(shí)間點(diǎn)的狀態(tài)。Redis提供了兩種持久化機(jī)制RDB和AOF,準(zhǔn)確的講應(yīng)該是三種,Redis還提供了虛擬內(nèi)存機(jī)制,但是性能比較差,使用場(chǎng)景有限。
RDB持久化是把當(dāng)前數(shù)據(jù)庫(kù)中的數(shù)據(jù)備份到一個(gè)RDB文件中,RDB文件是一個(gè)經(jīng)過(guò)壓縮的二進(jìn)制文件,通過(guò)這個(gè)文件可以還原生成RDB文件時(shí)的數(shù)據(jù)庫(kù)狀態(tài)。
Redis提供了兩個(gè)命令用于生成RDB文件,即SAVE和BGSAVE。SAVE命令會(huì)阻塞主進(jìn)程,在執(zhí)行該命令的過(guò)程中服務(wù)器會(huì)拒絕客戶端命令。只有當(dāng)SAVE命令執(zhí)行完之后服務(wù)器才會(huì)繼續(xù)處理客戶端的命令,而B(niǎo)GSAVE命令是在子進(jìn)程中執(zhí)行,在執(zhí)行該命令的過(guò)程中服務(wù)器還可以繼續(xù)處理客戶端的命令。SAVE命令和BGSAVE命令不能同時(shí)執(zhí)行,當(dāng)正在執(zhí)行BGSAVE命令時(shí),客戶端發(fā)送的SAVE命令會(huì)被拒絕,兩個(gè)BGSAVE命令也不能同時(shí)執(zhí)行。
服務(wù)器在900秒之內(nèi)對(duì)數(shù)據(jù)庫(kù)進(jìn)行了至少一次修改。服務(wù)器在300秒之內(nèi)對(duì)數(shù)據(jù)庫(kù)進(jìn)行了至少10次修改。服務(wù)器在60秒之內(nèi)對(duì)數(shù)據(jù)庫(kù)進(jìn)行了至少10000次修改。Redis通過(guò)一個(gè)saveparam結(jié)構(gòu)體來(lái)保存save參數(shù):
intset優(yōu)化set
當(dāng)set集合中的元素為整數(shù)且元素個(gè)數(shù)小于配置set-max-intset-entries值時(shí),使用intset數(shù)據(jù)結(jié)構(gòu)存儲(chǔ),否則轉(zhuǎn)化為Dict結(jié)構(gòu),Dict實(shí)際是Hash Table的一種實(shí)現(xiàn),key為元素值,value為NULL,這樣即可在O(1)時(shí)間內(nèi)判斷集合中是否包含某個(gè)元素。
intset中有三種類型數(shù)組:int16_t類型、int32_t 類型、 int64_t 類型。至于怎么選擇是那種類型的數(shù)組,是根據(jù)其保存的值的取值范圍來(lái)決定的,初始化時(shí)是 int16_t,根據(jù) set 中的***值在[INT16_MIN, INT16_MAX] , [INT32_MIN, INT32_MAX], [INT64_MIN, INT64_MAX]的那個(gè)取值范圍來(lái)動(dòng)態(tài)確定整個(gè)數(shù)組的類型。例如set一開(kāi)始是 int16_t 類型,當(dāng)一個(gè)取值范圍在 [INT32_MIN, INT32_MAX]的值加入到 set 時(shí),則將保存 set 的數(shù)組升級(jí)成 int32_t 的數(shù)組。
服務(wù)器結(jié)構(gòu)體redisServer添加了三個(gè)字段:saveparams字段,保存所有的save參數(shù)。dirty字段,來(lái)保存上一次成功執(zhí)行SAVE或BGSAVE命令之后,服務(wù)器對(duì)數(shù)據(jù)庫(kù)執(zhí)行的修改次數(shù)。lastsave字段,記錄服務(wù)器上一次執(zhí)行SAVE和BGSAVE的UNIX時(shí)間戳。RDB是通過(guò)備份某個(gè)時(shí)間點(diǎn)的數(shù)據(jù)來(lái)保存數(shù)據(jù)庫(kù)狀態(tài),而AOF是通過(guò)保存服務(wù)器所執(zhí)行的命令來(lái)保存數(shù)據(jù)庫(kù)的狀態(tài)的。當(dāng)結(jié)點(diǎn)宕機(jī)重啟時(shí)通過(guò)載入AOF文件并且執(zhí)行文件中的命令就可以恢復(fù)生成AOF文件時(shí)的數(shù)據(jù)庫(kù)狀態(tài),如果同時(shí)存在RDB文件和AOF文件,服務(wù)器優(yōu)先載入AOF文件來(lái)還原數(shù)據(jù)庫(kù)狀態(tài)。
AOF實(shí)現(xiàn)分為三步:命令追加、文件寫入、文件同步。現(xiàn)代操作系統(tǒng)中為了提高文件寫入效率,當(dāng)用戶調(diào)用了write函數(shù)時(shí)操作系統(tǒng)通常會(huì)將寫入的數(shù)據(jù)暫時(shí)保存在一個(gè)內(nèi)存緩沖區(qū)里面,等到緩沖區(qū)寫滿或者超過(guò)指定的時(shí)限之后,才真正地將緩沖區(qū)中的數(shù)據(jù)寫入到磁盤中。
關(guān)于redis中數(shù)據(jù)存儲(chǔ)的機(jī)制解析
這種方式CPU消耗低,但是數(shù)據(jù)安全性差,而且單次同步時(shí)間最長(zhǎng)。如果用戶不進(jìn)行設(shè)置,默認(rèn)值為everysec。相比于RDB持久化,AOF持久化執(zhí)行的頻率要高得多,所以AOF丟失數(shù)據(jù)的時(shí)間窗比RDB要小,但是也要耗費(fèi)更多的CPU時(shí)間和IO資源。RDB和AOF還有一個(gè)不同點(diǎn)就是,RDB文件替換是一個(gè)原子操作所以RDB文件肯定是完整,而AOF文件有可能是不完整的,有可能命令沒(méi)寫完就宕機(jī)了或者磁盤壞了。但是也不用擔(dān)心這種情況,一是這種情況出現(xiàn)的概率非常低,二是Redis提供了修復(fù)AOF文件的工具。
當(dāng)Redis服務(wù)器長(zhǎng)時(shí)間運(yùn)行時(shí),AOF文件的內(nèi)容會(huì)越來(lái)越多,文件的體積也會(huì)越來(lái)越大,為了解決這個(gè)問(wèn)題,Redis提供了AOF文件重寫功能,消除一些冗余命令。
Redis提供了 BGREWRITEAOF命令來(lái)執(zhí)行AOF重寫,AOF重寫不對(duì)舊AOF文件有依賴,而是通過(guò)查詢現(xiàn)有數(shù)據(jù)庫(kù)中的鍵值對(duì)的狀態(tài)來(lái)生成一個(gè)新的AOF文件,重寫動(dòng)作在子進(jìn)程中完成,生成一個(gè)新文件然后重命名替換掉老文件。在重寫的過(guò)程中,客戶端請(qǐng)求的新命令會(huì)追加到AOF重寫緩沖區(qū)中,子進(jìn)程完成重寫之后,發(fā)送一個(gè)信號(hào)消息通知主進(jìn)程把重寫緩沖區(qū)中的內(nèi)容同步到重寫后的AOF文件中,這個(gè)過(guò)程會(huì)阻塞主進(jìn)程。
通過(guò)設(shè)置appendfsync參數(shù)來(lái)設(shè)置AOF文件生成策略,它有三個(gè)可選值:
always,將AOF緩沖區(qū)的所有內(nèi)容寫入并同步到AOF文件中,這種方式數(shù)據(jù)安全性最高,但是CPU消耗大。everysec,將AOF緩沖區(qū)中的所有內(nèi)容寫入到AOF文件,如果上次同步AOF文件的時(shí)候距離現(xiàn)在超過(guò)一秒鐘,那么再次對(duì)AOF文件進(jìn)行同步,并且這個(gè)同步操作由一個(gè)線程專門負(fù)責(zé)執(zhí)行,數(shù)據(jù)安全性不如always,當(dāng)服務(wù)器出現(xiàn)故障時(shí)會(huì)出現(xiàn)1s的數(shù)據(jù)空窗期,但是CPU消耗較always小。no,將AOF緩沖區(qū)中的所有內(nèi)容寫入到AOF文件,但并不對(duì)AOF文件進(jìn)行同步,何時(shí)同步由操作系統(tǒng)來(lái)決定。
關(guān)于Redis
redis是一個(gè)開(kāi)源的使用C語(yǔ)言編寫的一個(gè)kv存儲(chǔ)系統(tǒng),是一個(gè)速度非常快的非關(guān)系遠(yuǎn)程內(nèi)存數(shù)據(jù)庫(kù)。它支持包括String、List、Set、Zset、hash五種數(shù)據(jù)結(jié)構(gòu)。除此之外,通過(guò)復(fù)制、持久化和客戶端分片等特性,用戶可以很方便地將redis擴(kuò)展成一個(gè)能夠包含數(shù)百GB數(shù)據(jù)和每秒處理上百萬(wàn)次的請(qǐng)求的系統(tǒng)。目前支持多種語(yǔ)言的api,方便用戶使用。
redis同時(shí)也內(nèi)置了事務(wù)、LUA腳本、復(fù)制等功能,提供兩種持久化選項(xiàng),一種是每隔一段時(shí)間將數(shù)據(jù)導(dǎo)入到磁盤(快照模式),另一種是追加命令到日志中(AOF模式)。如果只是作為高效的內(nèi)存數(shù)據(jù)庫(kù)使用也可以關(guān)閉持久化功能。通過(guò)哨兵(sentinel)和自動(dòng)分區(qū)(Cuuster)的方式可以提高redis服務(wù)器的高可用性。
與關(guān)系型數(shù)據(jù)庫(kù)相比,redis的命令請(qǐng)求不需要經(jīng)過(guò)查詢分析器或查詢優(yōu)化器進(jìn)行處理,也避免了更新數(shù)據(jù)時(shí)引起的隨機(jī)讀\寫,這些慢操作。它直接讀寫內(nèi)存中的數(shù)據(jù),并且數(shù)據(jù)是按照一定的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)的。所以它的速度非常快。
不同于memcached等完全基于內(nèi)存的緩存中間件,Redis同時(shí)還提供了持久化功能,這也是為什么Redis不僅可以用來(lái)做數(shù)據(jù)緩存還可以用來(lái)做數(shù)據(jù)存儲(chǔ),服務(wù)器節(jié)點(diǎn)宕機(jī)之后可以通過(guò)事先持久化的數(shù)據(jù)還原數(shù)據(jù)到某個(gè)時(shí)間點(diǎn)的狀態(tài)。Redis提供了兩種持久化機(jī)制RDB和AOF,準(zhǔn)確的講應(yīng)該是三種,Redis還提供了虛擬內(nèi)存機(jī)制,但是性能比較差,使用場(chǎng)景有限。
RDB持久化是把當(dāng)前數(shù)據(jù)庫(kù)中的數(shù)據(jù)備份到一個(gè)RDB文件中,RDB文件是一個(gè)經(jīng)過(guò)壓縮的二進(jìn)制文件,通過(guò)這個(gè)文件可以還原生成RDB文件時(shí)的數(shù)據(jù)庫(kù)狀態(tài)。
Redis提供了兩個(gè)命令用于生成RDB文件,即SAVE和BGSAVE。SAVE命令會(huì)阻塞主進(jìn)程,在執(zhí)行該命令的過(guò)程中服務(wù)器會(huì)拒絕客戶端命令。只有當(dāng)SAVE命令執(zhí)行完之后服務(wù)器才會(huì)繼續(xù)處理客戶端的命令,而B(niǎo)GSAVE命令是在子進(jìn)程中執(zhí)行,在執(zhí)行該命令的過(guò)程中服務(wù)器還可以繼續(xù)處理客戶端的命令。SAVE命令和BGSAVE命令不能同時(shí)執(zhí)行,當(dāng)正在執(zhí)行BGSAVE命令時(shí),客戶端發(fā)送的SAVE命令會(huì)被拒絕,兩個(gè)BGSAVE命令也不能同時(shí)執(zhí)行。
服務(wù)器在900秒之內(nèi)對(duì)數(shù)據(jù)庫(kù)進(jìn)行了至少一次修改。服務(wù)器在300秒之內(nèi)對(duì)數(shù)據(jù)庫(kù)進(jìn)行了至少10次修改。服務(wù)器在60秒之內(nèi)對(duì)數(shù)據(jù)庫(kù)進(jìn)行了至少10000次修改。Redis通過(guò)一個(gè)saveparam結(jié)構(gòu)體來(lái)保存save參數(shù):
intset優(yōu)化set
當(dāng)set集合中的元素為整數(shù)且元素個(gè)數(shù)小于配置set-max-intset-entries值時(shí),使用intset數(shù)據(jù)結(jié)構(gòu)存儲(chǔ),否則轉(zhuǎn)化為Dict結(jié)構(gòu),Dict實(shí)際是Hash Table的一種實(shí)現(xiàn),key為元素值,value為NULL,這樣即可在O(1)時(shí)間內(nèi)判斷集合中是否包含某個(gè)元素。
intset中有三種類型數(shù)組:int16_t類型、int32_t 類型、 int64_t 類型。至于怎么選擇是那種類型的數(shù)組,是根據(jù)其保存的值的取值范圍來(lái)決定的,初始化時(shí)是 int16_t,根據(jù) set 中的***值在[INT16_MIN, INT16_MAX] , [INT32_MIN, INT32_MAX], [INT64_MIN, INT64_MAX]的那個(gè)取值范圍來(lái)動(dòng)態(tài)確定整個(gè)數(shù)組的類型。例如set一開(kāi)始是 int16_t 類型,當(dāng)一個(gè)取值范圍在 [INT32_MIN, INT32_MAX]的值加入到 set 時(shí),則將保存 set 的數(shù)組升級(jí)成 int32_t 的數(shù)組。
服務(wù)器結(jié)構(gòu)體redisServer添加了三個(gè)字段:saveparams字段,保存所有的save參數(shù)。dirty字段,來(lái)保存上一次成功執(zhí)行SAVE或BGSAVE命令之后,服務(wù)器對(duì)數(shù)據(jù)庫(kù)執(zhí)行的修改次數(shù)。lastsave字段,記錄服務(wù)器上一次執(zhí)行SAVE和BGSAVE的UNIX時(shí)間戳。RDB是通過(guò)備份某個(gè)時(shí)間點(diǎn)的數(shù)據(jù)來(lái)保存數(shù)據(jù)庫(kù)狀態(tài),而AOF是通過(guò)保存服務(wù)器所執(zhí)行的命令來(lái)保存數(shù)據(jù)庫(kù)的狀態(tài)的。當(dāng)結(jié)點(diǎn)宕機(jī)重啟時(shí)通過(guò)載入AOF文件并且執(zhí)行文件中的命令就可以恢復(fù)生成AOF文件時(shí)的數(shù)據(jù)庫(kù)狀態(tài),如果同時(shí)存在RDB文件和AOF文件,服務(wù)器優(yōu)先載入AOF文件來(lái)還原數(shù)據(jù)庫(kù)狀態(tài)。
AOF實(shí)現(xiàn)分為三步:命令追加、文件寫入、文件同步,F(xiàn)代操作系統(tǒng)中為了提高文件寫入效率,當(dāng)用戶調(diào)用了write函數(shù)時(shí)操作系統(tǒng)通常會(huì)將寫入的數(shù)據(jù)暫時(shí)保存在一個(gè)內(nèi)存緩沖區(qū)里面,等到緩沖區(qū)寫滿或者超過(guò)指定的時(shí)限之后,才真正地將緩沖區(qū)中的數(shù)據(jù)寫入到磁盤中。
關(guān)于redis中數(shù)據(jù)存儲(chǔ)的機(jī)制解析
這種方式CPU消耗低,但是數(shù)據(jù)安全性差,而且單次同步時(shí)間最長(zhǎng)。如果用戶不進(jìn)行設(shè)置,默認(rèn)值為everysec。相比于RDB持久化,AOF持久化執(zhí)行的頻率要高得多,所以AOF丟失數(shù)據(jù)的時(shí)間窗比RDB要小,但是也要耗費(fèi)更多的CPU時(shí)間和IO資源。RDB和AOF還有一個(gè)不同點(diǎn)就是,RDB文件替換是一個(gè)原子操作所以RDB文件肯定是完整,而AOF文件有可能是不完整的,有可能命令沒(méi)寫完就宕機(jī)了或者磁盤壞了。但是也不用擔(dān)心這種情況,一是這種情況出現(xiàn)的概率非常低,二是Redis提供了修復(fù)AOF文件的工具。
當(dāng)Redis服務(wù)器長(zhǎng)時(shí)間運(yùn)行時(shí),AOF文件的內(nèi)容會(huì)越來(lái)越多,文件的體積也會(huì)越來(lái)越大,為了解決這個(gè)問(wèn)題,Redis提供了AOF文件重寫功能,消除一些冗余命令。
Redis提供了 BGREWRITEAOF命令來(lái)執(zhí)行AOF重寫,AOF重寫不對(duì)舊AOF文件有依賴,而是通過(guò)查詢現(xiàn)有數(shù)據(jù)庫(kù)中的鍵值對(duì)的狀態(tài)來(lái)生成一個(gè)新的AOF文件,重寫動(dòng)作在子進(jìn)程中完成,生成一個(gè)新文件然后重命名替換掉老文件。在重寫的過(guò)程中,客戶端請(qǐng)求的新命令會(huì)追加到AOF重寫緩沖區(qū)中,子進(jìn)程完成重寫之后,發(fā)送一個(gè)信號(hào)消息通知主進(jìn)程把重寫緩沖區(qū)中的內(nèi)容同步到重寫后的AOF文件中,這個(gè)過(guò)程會(huì)阻塞主進(jìn)程。
通過(guò)設(shè)置appendfsync參數(shù)來(lái)設(shè)置AOF文件生成策略,它有三個(gè)可選值:
always,將AOF緩沖區(qū)的所有內(nèi)容寫入并同步到AOF文件中,這種方式數(shù)據(jù)安全性最高,但是CPU消耗大。everysec,將AOF緩沖區(qū)中的所有內(nèi)容寫入到AOF文件,如果上次同步AOF文件的時(shí)候距離現(xiàn)在超過(guò)一秒鐘,那么再次對(duì)AOF文件進(jìn)行同步,并且這個(gè)同步操作由一個(gè)線程專門負(fù)責(zé)執(zhí)行,數(shù)據(jù)安全性不如always,當(dāng)服務(wù)器出現(xiàn)故障時(shí)會(huì)出現(xiàn)1s的數(shù)據(jù)空窗期,但是CPU消耗較always小。no,將AOF緩沖區(qū)中的所有內(nèi)容寫入到AOF文件,但并不對(duì)AOF文件進(jìn)行同步,何時(shí)同步由操作系統(tǒng)來(lái)決定。
熱門點(diǎn)擊
- 電子元件常用拆卸技巧
- 通信專業(yè)技術(shù)人員職業(yè)水平考試
- 通過(guò)電風(fēng)扇電子調(diào)速器的電路來(lái)分析
- 華為Mate30美國(guó)組件降至零?艾未說(shuō)他不會(huì)
- 工業(yè)和信息化部編制了《工業(yè)大數(shù)據(jù)發(fā)展指導(dǎo)意見(jiàn)
- 電磁繼電器是一種接通、承載和分
- 智能家居在快速發(fā)展的同時(shí)需要思考什么
- 在新興的人工智能AI應(yīng)用和大數(shù)據(jù)分析技術(shù)不斷
- 人工智能、物聯(lián)網(wǎng)和先進(jìn)傳感器技術(shù),幫助實(shí)體零
- 一種無(wú)線充電式移動(dòng)電源的制作方法
推薦技術(shù)資料
- FU-19推挽功放制作
- FU-19是國(guó)產(chǎn)大功率發(fā)射雙四極功率電二管,EPL20... [詳細(xì)]
- 全集成直接飛行時(shí)間(dToF)傳感器
- 2025年半導(dǎo)體市場(chǎng)發(fā)展趨勢(shì)未
- GW2A系列FPGA芯片應(yīng)用參數(shù)
- DDR類儲(chǔ)存器接口解決方案
- 2.5G bps MIPI D
- 新一代 Arora-V系列FPGA產(chǎn)品詳情
- 多媒體協(xié)處理器SM501在嵌入式系統(tǒng)中的應(yīng)用
- 基于IEEE802.11b的EPA溫度變送器
- QUICCEngine新引擎推動(dòng)IP網(wǎng)絡(luò)革新
- SoC面世八年后的產(chǎn)業(yè)機(jī)遇
- MPC8xx系列處理器的嵌入式系統(tǒng)電源設(shè)計(jì)
- dsPIC及其在交流變頻調(diào)速中的應(yīng)用研究