Linux運(yùn)維工程師面試題(4)

Linux運(yùn)維工程師面試題(4)
1 redis 常用的數(shù)據(jù)類型
2 redis 數(shù)據(jù)持久化有幾種,區(qū)別是什么,如何選擇
3 redis 有哪些架構(gòu)模式
4 什么是緩存雪崩?如何解決?
5 什么是緩存穿透?如何解決?
6 什么是緩存擊穿?如何解決?
7 redis 為什么這么快
8 Redis 常用命令
9 SQL 語句分類
10 多表查詢
Linux運(yùn)維工程師面試題(4)
祝各位小伙伴們?cè)缛照业阶约盒膬x的工作。 持續(xù)學(xué)習(xí)才不會(huì)被淘汰。
機(jī)會(huì)總是留給有有準(zhǔn)備的人的。 加油,打工人!
1 redis 常用的數(shù)據(jù)類型
String:字符串,最基礎(chǔ)的數(shù)據(jù)類型
List:列表
Hash:哈希對(duì)象
Set:集合
Sorted Set:有序集合,Set 的基礎(chǔ)上加了個(gè)分值
2 redis 數(shù)據(jù)持久化有幾種,區(qū)別是什么,如何選擇
rdb 和 aof 兩種
aof 類似于 mysql 的二進(jìn)制日志,它把所有的操作都記錄在日志里。而 rdb 就是真正存儲(chǔ)的數(shù)據(jù),相當(dāng)于把內(nèi)存中 redis 的所有數(shù)據(jù)快照到了磁盤中。
如果主要充當(dāng)緩存功能,或者可以承受數(shù)分鐘數(shù)據(jù)的丟失,通常生產(chǎn)環(huán)境一般只需啟用RDB即可,此也是默認(rèn)值;如果數(shù)據(jù)需要持久保存,一點(diǎn)也不能丟失,可以選擇同時(shí)開啟RDB和AOF,一般不建議只開啟AOF。
3 redis 有哪些架構(gòu)模式
主從復(fù)制
哨兵(Sentinel)
Redis Cluster
4 什么是緩存雪崩?如何解決?
定義:如果緩存數(shù)據(jù)設(shè)置的過期時(shí)間是相同的,就會(huì)導(dǎo)致在某段時(shí)間內(nèi)緩存同時(shí)失效,請(qǐng)求全部走數(shù)據(jù)庫,會(huì)導(dǎo)致數(shù)據(jù)庫宕機(jī)。
解決辦法:
在緩存的時(shí)候給過期時(shí)間加上一個(gè)隨機(jī)值,這樣就會(huì)大幅度的減少緩存在同一時(shí)間過期。
5 什么是緩存穿透?如何解決?
定義:緩存穿透是指查詢一個(gè)一定不存在的數(shù)據(jù)。由于緩存不命中,并且出于容錯(cuò)考慮,如果從數(shù)據(jù)庫查不到數(shù)據(jù)則不寫入緩存,這將導(dǎo)致這個(gè)不存在的數(shù)據(jù)每次請(qǐng)求都要到數(shù)據(jù)庫去查詢,失去了緩存的意義,請(qǐng)求的數(shù)據(jù)在緩存大量不命中,導(dǎo)致請(qǐng)求走數(shù)據(jù)庫。
解決辦法:
由于請(qǐng)求的參數(shù)是不合法的(每次都請(qǐng)求不存在的參數(shù)),于是我們可以使用布隆過濾器(BloomFilter)或者壓縮 filter 提前攔截,不合法就不讓這個(gè)請(qǐng)求到數(shù)據(jù)庫層!
當(dāng)我們從數(shù)據(jù)庫找不到的時(shí)候,我們也將這個(gè)空對(duì)象設(shè)置到緩存里邊去。下次再請(qǐng)求的時(shí)候,就可以從緩存里邊獲取了。
這種情況一般會(huì)將空對(duì)象設(shè)置一個(gè)較短的過期時(shí)間。
6 什么是緩存擊穿?如何解決?
定義:某一個(gè)熱點(diǎn)key,在不停地扛著高并發(fā),當(dāng)這個(gè)熱點(diǎn)key在失效的一瞬間,持續(xù)的高并發(fā)訪問就擊破緩存直接訪問數(shù)據(jù)庫,導(dǎo)致數(shù)據(jù)庫宕機(jī)。
解決辦法:
設(shè)置熱點(diǎn)數(shù)據(jù)"永不過期"加上互斥鎖。上面的現(xiàn)象是多個(gè)線程同時(shí)去查詢數(shù)據(jù)庫的這條數(shù)據(jù),那么我們可以在第一個(gè)查詢數(shù)據(jù)的請(qǐng)求上使用一個(gè)互斥鎖來鎖住它,其他的線程走到這一步拿不到鎖就等著,等第一個(gè)線程查詢到了數(shù)據(jù),然后將數(shù)據(jù)放到redis緩存起來。后面的線程進(jìn)來發(fā)現(xiàn)已經(jīng)有緩存了,就直接走緩存。
總結(jié): 雪崩是大面積的key緩存失效;穿透是redis里不存在這個(gè)緩存key;擊穿是redis某一個(gè)熱點(diǎn)key突然失效,最終的受害者都是數(shù)據(jù)庫。
7 redis 為什么這么快
完全基于內(nèi)存,絕大部分請(qǐng)求是純粹的內(nèi)存操作,非??焖?。數(shù)據(jù)存在內(nèi)存中,類似于 HashMap,HashMap 的優(yōu)勢(shì)就是查找和操作的時(shí)間復(fù)雜度都是O(1);
數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)單,對(duì)數(shù)據(jù)操作也簡(jiǎn)單,Redis 中的數(shù)據(jù)結(jié)構(gòu)是專門進(jìn)行設(shè)計(jì)的;
采用單線程,避免了不必要的上下文切換和競(jìng)爭(zhēng)條件,也不存在多進(jìn)程或者多線程導(dǎo)致的切換而消耗CPU,不用去考慮各種鎖的問題,不存在加鎖釋放鎖操作,沒有因?yàn)榭赡艹霈F(xiàn)死鎖而導(dǎo)致的性能消耗;
使用多路 I/O 復(fù)用模型,非阻塞 IO;
使用底層模型不同,它們之間底層實(shí)現(xiàn)方式以及與客戶端之間通信的應(yīng)用協(xié)議不一樣,Redis 直接自己構(gòu)建了 VM 機(jī)制 ,因?yàn)橐话愕南到y(tǒng)調(diào)用系統(tǒng)函數(shù)的話,會(huì)浪費(fèi)一定的時(shí)間去移動(dòng)和請(qǐng)求
8 Redis 常用命令
INFO:顯示當(dāng)前節(jié)點(diǎn)redis運(yùn)行狀態(tài)信息
SELECT:切換數(shù)據(jù)庫,相當(dāng)于在MySQL的USE DBNAME指令
KEYS:查看當(dāng)前庫下的所有key,此命令慎用!
BGSAVE:手動(dòng)在后臺(tái)執(zhí)行RDB持久化操作
DBSIZE:返回當(dāng)前庫下的所有key數(shù)量
FLUSHDB:強(qiáng)制清空當(dāng)前庫中的所有key,此命令慎用!
FLUSHALL:強(qiáng)制清空當(dāng)前redis服務(wù)器所有數(shù)據(jù)庫總的所有key,即刪除所有數(shù)據(jù),此命令慎用!
9 SQL 語句分類
DDL:Data Defination Language 數(shù)據(jù)定義語言 CREATE,DROP,ALTER
DML:Data Manipulation Language 數(shù)據(jù)操縱語言 INSERT,DELETE,UPDATE
DQL:Data Query Language 數(shù)據(jù)查詢語言 SELECT
DCL:Data Control Language 數(shù)據(jù)控制語言 GRANT,REVOKE,COMMIT,ROLLBACK
軟件開發(fā)人員稱呼:CRUD,對(duì)應(yīng)增查改刪
10 多表查詢
子查詢:在SQL語句嵌套著查詢語句,性能較差,基于某語句的查詢結(jié)果再次進(jìn)行的查詢
聯(lián)合查詢:UNION
交叉連接:笛卡爾乘積,cross join
內(nèi)連接: 等值連接:讓表之間的字段以"等值“建立連接關(guān)系 不等值連接 自然連接:去掉重復(fù)列的等值連接
外連接: 左外連接:FROM tb1 LEFT JOIN tb2 ON tb1.col=tb2.col 右外連接:FROM tb1 RIGHT JOIN tb2 ON tb1.col=tb2.col 自連接:本表和本表進(jìn)行連接查詢
例:
以上面試題僅僅個(gè)人總結(jié),想到什么就寫什么,沒有任何順序,寫的有什么不對(duì)的地方請(qǐng)各位大佬評(píng)論、留言,我會(huì)及時(shí)更正。
原文鏈接: [Linux運(yùn)維工程師面試題(4)](https://blog.waluna.top/2023/03/04/1351/).