一、mysql的MEMORY引擎為什么沒有redis的應用廣泛
從kv緩存的作用看,mysql優點不在kv緩存上,用它做(zuo)kv緩存維護成本高,redis安裝啟動(dong)使用簡單,mysql效率(lv)功能(neng)也沒redis強(qiang)大,
redis專門(men)針對一些(xie)場(chang)(chang)景做(zuo)了優化(hua),例如計(ji)數器(qi),可以(yi)精(jing)確計(ji)數,精(jing)度要(yao)求不(bu)高(gao)也(ye)可以(yi)模糊計(ji)數,占用內存更少;集合間(jian)的各(ge)種(zhong)操作更簡單高(gao)效,典型應用場(chang)(chang)景社交應用下好(hao)友,粉絲各(ge)種(zhong)操作。
redis支持(chi)兩種(zhong)數據持(chi)久化(hua)方式:RDB和AOF,這(zhe)也是redis區別(bie)與(yu)其他nosql內存數據庫的一個主要特點。
RDB主要可以用(yong)作冷備,默認情況下每5分鐘將會fork出一個(ge)子進程,進行當前數據快照的持久化(這(zhe)里的內存為了(le)保證備份期間(jian)數據的一致性,這(zhe)里還用(yong)到了(le)一個(ge)概念(nian):寫(xie)時復制COW)。除此之外,RDB還具備一下幾個(ge)特點:
生成一(yi)(yi)組(zu)持(chi)久化文件,每一(yi)(yi)個文件都代表了(le)某一(yi)(yi)時刻的內存數據快照。
數據恢復速度快。
由于(yu)是由后臺(tai)(tai)子進程進行數據備份,對線(xian)上系(xi)統的QPS影響(xiang)較小。但(dan)如果后臺(tai)(tai)需要備份的數據量較大(da),則由于(yu)進程調度原因,可能(neng)會導致線(xian)上業務(wu)停滯。
默認每五分鐘生成一(yi)次數(shu)據副本,數(shu)據的可靠性并不(bu)高。
AOF則是(shi)以(yi)追加(jia)寫(xie)的方(fang)式(shi),將(jiang)對Redis的更(geng)新操作(zuo)全部寫(xie)入aof文(wen)件。aof具有(you)以(yi)下特(te)點(dian):
AOF默認每1s通(tong)過后臺線程進行一次fsync操作,數(shu)據(ju)的(de)可靠性比較(jiao)高(gao),非(fei)常多丟失1s的(de)數(shu)據(ju)。
AOF采用append-only的方(fang)式寫入(ru)日(ri)志文件,由于(yu)是順序寫,沒(mei)有磁盤(pan)尋址(zhi)的開銷,速度很快(kuai)。
AOF日志的可讀性(xing)很(hen)強(qiang),可以(yi)執行(xing)一些緊急處(chu)理。
但是AOF日(ri)志普遍要比RDB文(wen)件大,這是由(you)于AOF日(ri)志需要記錄redis實(shi)例(li)啟動以(yi)來的(de)所(suo)有更新(xin)操作,以(yi)便(bian)對數據庫進行重放,恢復數據。
由于需要保證數據(ju)的可(ke)靠性而每秒執行的fsync操作,會降(jiang)低線上的QPS。
因此通過RDB和AOF的(de)配合使用,就可以在保證效率的(de)同時(shi)盡(jin)可能(neng)的(de)保證數(shu)據的(de)可靠性(xing)。這是Memory存(cun)儲引擎所不具備的(de)。
除此之(zhi)外(wai),Redis通過nio模(mo)型,利用單個線(xian)程監聽多個socket,將對redis的操作全部轉換為文件(jian)事件(jian)操作。大大提高了并發(fa)性。
延伸閱讀:
二、什么是Memory引擎
Memory引(yin)(yin)擎(qing)是Mysql的(de)內存引(yin)(yin)擎(qing),在實現上,Memory存儲引(yin)(yin)擎(qing)不同(tong)于Innodb這種組織索(suo)(suo)引(yin)(yin)結(jie)構(gou)(索(suo)(suo)引(yin)(yin)即是數據,即數據存放在主鍵索(suo)(suo)引(yin)(yin)上),而是將索(suo)(suo)引(yin)(yin)和(he)數據分開(kai)存儲。索(suo)(suo)引(yin)(yin)采用(yong)Hash的(de)形式(shi),存放主鍵id和(he)指(zhi)向數據的(de)指(zhi)針,而數據則按插入順序(xu)存放。我們稱這種數據組織方(fang)式(shi)為堆組織方(fang)式(shi)。