日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

個(gè)常見使用場景,redis使用場景( 五 )


zmalloc_allocations[16]代表已經(jīng)分配的長度為16bytes的內(nèi)存塊的個(gè)數(shù) 。zmalloc.c中有一個(gè)靜態(tài)變量used_memory用來記錄當(dāng)前分配的內(nèi)存總大小 。所以,總的來看,Redis采用的是包裝的mallc/free,相較于Memcached的內(nèi)存管理方法來說,要簡單很多 。3、數(shù)據(jù)持久化支持Redis雖然是基于內(nèi)存的存儲系統(tǒng),但是它本身是支持內(nèi)存數(shù)據(jù)的持久化的,而且提供兩種主要的持久化策略:RDB快照和AOF日志 。
而memcached是不支持?jǐn)?shù)據(jù)持久化操作的 。1)RDB快照Redis支持將當(dāng)前數(shù)據(jù)的快照存成一個(gè)數(shù)據(jù)文件的持久化機(jī)制,即RDB快照 。但是一個(gè)持續(xù)寫入的數(shù)據(jù)庫如何生成快照呢?Redis借助了fork命令的copy on write機(jī)制 。在生成快照時(shí),將當(dāng)前進(jìn)程fork出一個(gè)子進(jìn)程,然后在子進(jìn)程中循環(huán)所有的數(shù)據(jù),將數(shù)據(jù)寫成為RDB文件 。
我們可以通過Redis的save指令來配置RDB快照生成的時(shí)機(jī),比如配置10分鐘就生成快照,也可以配置有1000次寫入就生成快照,也可以多個(gè)規(guī)則一起實(shí)施 。這些規(guī)則的定義就在Redis的配置文件中,你也可以通過Redis的CONFIG SET命令在Redis運(yùn)行時(shí)設(shè)置規(guī)則,不需要重啟Redis 。Redis的RDB文件不會壞掉,因?yàn)槠鋵懖僮魇窃谝粋€(gè)新進(jìn)程中進(jìn)行的,當(dāng)生成一個(gè)新的RDB文件時(shí),Redis生成的子進(jìn)程會先將數(shù)據(jù)寫到一個(gè)臨時(shí)文件中,然后通過原子性rename系統(tǒng)調(diào)用將臨時(shí)文件重命名為RDB文件,這樣在任何時(shí)候出現(xiàn)故障,Redis的RDB文件都總是可用的 。
同時(shí),Redis的RDB文件也是Redis主從同步內(nèi)部實(shí)現(xiàn)中的一環(huán) 。RDB有他的不足,就是一旦數(shù)據(jù)庫出現(xiàn)問題,那么我們的RDB文件中保存的數(shù)據(jù)并不是全新的,從上次RDB文件生成到Redis停機(jī)這段時(shí)間的數(shù)據(jù)全部丟掉了 。在某些業(yè)務(wù)下,這是可以忍受的 。2)AOF日志AOF日志的全稱是append only file,它是一個(gè)追加寫入的日志文件 。
與一般數(shù)據(jù)庫的binlog不同的是,AOF文件是可識別的純文本,它的內(nèi)容就是一個(gè)個(gè)的Redis標(biāo)準(zhǔn)命令 。只有那些會導(dǎo)致數(shù)據(jù)發(fā)生修改的命令才會追加到AOF文件 。每一條修改數(shù)據(jù)的命令都生成一條日志,AOF文件會越來越大,所以Redis又提供了一個(gè)功能,叫做AOF rewrite 。其功能就是重新生成一份AOF文件,新的AOF文件中一條記錄的操作只會有一次,而不像一份老文件那樣,可能記錄了對同一個(gè)值的多次操作 。
其生成過程和RDB類似,也是fork一個(gè)進(jìn)程,直接遍歷數(shù)據(jù),寫入新的AOF臨時(shí)文件 。在寫入新文件的過程中,所有的寫操作日志還是會寫到原來老的AOF文件中,同時(shí)還會記錄在內(nèi)存緩沖區(qū)中 。當(dāng)重完操作完成后,會將所有緩沖區(qū)中的日志一次性寫入到臨時(shí)文件中 。然后調(diào)用原子性的rename命令用新的AOF文件取代老的AOF文件 。
AOF是一個(gè)寫文件操作,其目的是將操作日志寫到磁盤上,所以它也同樣會遇到我們上面說的寫操作的流程 。在Redis中對AOF調(diào)用write寫入后,通過appendfsync選項(xiàng)來控制調(diào)用fsync將其寫到磁盤上的時(shí)間,下面appendfsync的三個(gè)設(shè)置項(xiàng),安全強(qiáng)度逐漸變強(qiáng) 。appendfsync no 當(dāng)設(shè)置appendfsync為no的時(shí)候,Redis不會主動(dòng)調(diào)用fsync去將AOF日志內(nèi)容同步到磁盤,所以這一切就完全依賴于操作系統(tǒng)的調(diào)試了 。
對大多數(shù)Linux操作系統(tǒng),是每30秒進(jìn)行一次fsync,將緩沖區(qū)中的數(shù)據(jù)寫到磁盤上 。appendfsync everysec 當(dāng)設(shè)置appendfsync為everysec的時(shí)候,Redis會默認(rèn)每隔一秒進(jìn)行一次fsync調(diào)用,將緩沖區(qū)中的數(shù)據(jù)寫到磁盤 。但是當(dāng)這一次的fsync調(diào)用時(shí)長超過1秒時(shí) 。Redis會采取延遲fsync的策略,再等一秒鐘 。
也就是在兩秒后再進(jìn)行fsync,這一次的fsync就不管會執(zhí)行多長時(shí)間都會進(jìn)行 。這時(shí)候由于在fsync時(shí)文件描述符會被阻塞,所以當(dāng)前的寫操作就會阻塞 。所以結(jié)論就是,在絕大多數(shù)情況下,Redis會每隔一秒進(jìn)行一次fsync 。在最壞的情況下,兩秒鐘會進(jìn)行一次fsync操作 。這一操作在大多數(shù)數(shù)據(jù)庫系統(tǒng)中被稱為group commit,就是組合多次寫操作的數(shù)據(jù),一次性將日志寫到磁盤 。

推薦閱讀