面試題-NoSQL

NoSQL的運(yùn)用場(chǎng)景,你的項(xiàng)目在哪里用到它

1、什么是NoSQL

NOSQL說的是非關(guān)系型數(shù)據(jù)庫(kù),常用的有redis mongdb.

2、Redis數(shù)據(jù)類型

  • String(字符串)
  • Hash (哈希,類似java中的map)
  • List (列表):鏈表
  • Set (集合)
  • Zset (sorted set:有序集合)

3、數(shù)據(jù)存儲(chǔ)方式

redis的數(shù)據(jù)持久化有兩種方式,RDB(Redis DataBase)AOF(Append Only File)

RDB

  • 在指定的時(shí)間間隔內(nèi)將內(nèi)存中的數(shù)據(jù)集快照寫入磁盤,(snapshot快照),它恢復(fù)時(shí)是將快照文件直接讀到內(nèi)存里。
  • Redis會(huì)單獨(dú)創(chuàng)建一個(gè)子進(jìn)程來(lái)進(jìn)行持久化,會(huì)先將數(shù)據(jù)寫入到一個(gè)臨時(shí)文件中,待持久化過程都結(jié)束時(shí),再用這個(gè)臨時(shí)文件替換上次持久化好的文件。整個(gè)過程中,主進(jìn)程是不進(jìn)行任何IO操作的,這就確保了極高的性能,如果需要進(jìn)行大規(guī)模數(shù)據(jù)恢復(fù),且對(duì)于數(shù)據(jù)恢復(fù)的完整性不是非常敏感,那rdb方式要比AOF方式更加高效,RDB的缺點(diǎn)是最后一次持久化后的數(shù)據(jù)可能丟失。
  • 默認(rèn)保存的文件dump.rdb 文件, RDB也是默認(rèn)的保存策略

AOF

  • 以日志的形式來(lái)記錄每個(gè)寫的操作;將redis執(zhí)行過的所有寫指令記錄下來(lái)(讀操作不記錄),只許追加文件但不可以改寫文件,redis啟動(dòng)之初會(huì)讀取該文件重新構(gòu)建數(shù)據(jù),換言之,redis重啟的話,就根據(jù)日志文件的內(nèi)容將寫指令從前到后執(zhí)行一次以完成數(shù)據(jù)的恢復(fù)工作。

  • aof保存的是appendonly.aof文件

  • appendonly no:默認(rèn)是關(guān)閉的。修改為yes;

  • dump.rdb和appendonly.aof 可以同時(shí)存在,先會(huì)加載appendonly.aof文件。

  • 如果出現(xiàn)斷電等特殊情況,appendonly.aof文件中可能會(huì)出現(xiàn)錯(cuò)誤的內(nèi)內(nèi)容,當(dāng)redis啟動(dòng)時(shí),會(huì)先加載appendonly.aof文件,但是文件內(nèi)容錯(cuò)誤,則造成的結(jié)果就是啟動(dòng)失敗。
    可以先將appendonly.aof文件進(jìn)行清理,然后再啟動(dòng).

4、使用redis有哪些好處

  • (1)速度快,因?yàn)閿?shù)據(jù)存在內(nèi)存中,類似于HashMap,HashMap的優(yōu)勢(shì)就是查找和操作的時(shí)間復(fù)雜度都是O(1)

  • (2) 支持豐富數(shù)據(jù)類型,支持string,list,set,sorted set,hash

  • (3) 支持事務(wù),操作都是原子性,所謂的原子性就是對(duì)數(shù)據(jù)的更改要么全部執(zhí)行,要么全部不執(zhí)行

  • (4) 豐富的特性:可用于緩存,消息,按key設(shè)置過期時(shí)間,過期后將會(huì)自動(dòng)刪除

  • (5)性能極高 Redis能讀的速度是110000次/s,寫的速度是81000次/s

5、應(yīng)用場(chǎng)景

  • 會(huì)話緩存,緩存購(gòu)物車信息。
  • 全頁(yè)面緩存
  • 隊(duì)列
  • 排行傍/計(jì)數(shù)器
  • 發(fā)布與訂閱
  • 限時(shí)任務(wù),如優(yōu)惠,手機(jī)驗(yàn)證碼
  • 分布式鎖

6、持久化策略

  • Appendfsync
    i.always:同步持久化,每次發(fā)生數(shù)據(jù)變更會(huì)被立即記錄到磁盤中,性能較差但數(shù)據(jù)完整性比較好。
    ii.everysec:出廠默認(rèn)推薦,異步操作,每秒記錄,如果一秒內(nèi)宕機(jī),有數(shù)據(jù)丟失
    iii.no:不適用

  • 重寫rewrite
    AOF采用文件追加方式,文件會(huì)越來(lái)越大為避免出現(xiàn)此種情況,新增了重寫機(jī)制,當(dāng)AOF文件的大小超過所設(shè)定的值時(shí),redis就會(huì)啟動(dòng)AOF文件的內(nèi)容壓縮。只保留可以恢復(fù)數(shù)據(jù)的最小指令。

    重寫的觸發(fā)機(jī)制:
    Redis會(huì)記錄上次重寫時(shí)的aof大小,默認(rèn)配置是當(dāng)aof文件大小是上次rewrite后大小的一倍,且文件大于64M是觸發(fā)。

  • 缺點(diǎn)

相同數(shù)據(jù)集的數(shù)據(jù)而言aof文件要遠(yuǎn)大于rdb文件,恢復(fù)速度慢與rdb;

Aof運(yùn)行效率要慢與rdb,每秒同步策略效率較好,不同步效率和rdb相同。

  • 總結(jié)

RDB持久化方式能夠在指定的時(shí)間間隔能對(duì)你的數(shù)據(jù)記性快照存儲(chǔ)。

AOF持久化方式記錄每次對(duì)服務(wù)器寫的操作,當(dāng)服務(wù)器重啟的時(shí)候,會(huì)重新執(zhí)行哪些命令來(lái)恢復(fù)原始的數(shù)據(jù),AOF命令一redis協(xié)議追加保存每次寫的操作到文件末尾,redis還能對(duì)AOF文件進(jìn)行后臺(tái)重寫,使得AOF文件的體積不至于過大。

只做緩存,如果你值希望你的數(shù)據(jù)在服務(wù)器運(yùn)行的時(shí)候存在,你也可以不適用任何持久化的方式。

同時(shí)開啟兩種持久化的方式:第一、這種情況下,當(dāng)redis重啟的時(shí)候會(huì)優(yōu)先載入AOF文件來(lái)恢復(fù)原始的數(shù)據(jù),因?yàn)樵谕ǔG闆r下AOF文件保存的數(shù)據(jù)集要比RDB文件保存的數(shù)據(jù)集要完整,第二、RDB的數(shù)據(jù)不實(shí)時(shí),同時(shí)使用兩者服務(wù)器重啟也只會(huì)找AOF文件,那要不要只使用aof呢?建議不要,因?yàn)镽DB更適合用于備份數(shù)據(jù)庫(kù)(aof在不斷變化不好備份),快速重啟,而且不會(huì)有AOF可能存在的bug。建議兩者都開啟。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容