Redis面试宝典12道法
Redis 全稱 Remote Dictionary Server(即遠程字典服務),它是一個基于內存實現的鍵值型非關系(NoSQL)數據庫
1. 談下你對 Redis 的了解?
三點:
- 為什么要引入
一般用mysql,oracle,由于數據庫持久化數據主要是面向磁盤,而磁盤的讀寫比較慢,一般的管理系統上,由于不存在,因此沒有需要瞬間讀寫大量數據的要求,這時候傳統數據庫是沒有問題的。但是如果面對一個高并發的場景,比如搶票、發紅包等,或者是主頁訪問量瞬間比較大的時候,一瞬間會有成千上問的請求的到來高并發,需要系統在極短的時間內完成成千上萬次的讀寫操作。這時候數據庫根本承受不來,很容易造成數據庫系統的癱瘓,最終導致服務器宕機。
為了解決這個問題,我們可以引入nosql技術。nosql也是一種數據庫,它是基于內存的,并提供一定的持久化功能。redis和mongodb是當前使用最廣泛的nosql技術。
- 是什么?
Redis 全稱 Remote Dictionary Server(即遠程字典服務),它是一個基于內存實現的鍵值型非關系(NoSQL)數據庫,由意大利人用C語言所創
redis不僅可以將數據完全保存在內存中,還可以通過磁盤實現數據的持久化支持
redis支持豐富的數據類型,包括string、list、set、zset、hash等多種數據結構,因此它也被稱為【數據結構服務器
redis支持主從同步,即master-slave主從復制模式。數據可以從主服務器向任意數量的從服務器上同步,有效的保證數據的安全性
Redis 支持多種編程語言,包括 C、C++、Python、Java、PHP、Ruby、Lua 等語言。
與SQL型數據不同,redis沒有提供新建數據庫的操作,因為它自帶了16(0-15)個數據庫(默認使用0庫)。在同一個庫中,key是唯一存在的、不允許重復的,它就像一把“密鑰”,只能打開一把“鎖”。鍵值存儲的本質就是使用key來標識value,當想要檢索value時,必須使用與value對應的key進行查找
- redis架構
客戶端和服務端可以位于同一臺計算機上,也可以位于不同的計算機上。服務端是整個架構的“大腦”,能夠把數據存儲到內存中,并且起到管理數據的作用 .Redis 基于內存來實現數據的存儲,因此其速度非常快。但是我們知道,計算機的內存是非常珍貴的資源,所以 Redis 不適合存儲較大的文件或者二進制數據,否則會出現錯誤,Redis 適合存儲較小的文本信息。理論上 Redis 的每個 key、value 的大小不超過 512 MB
2. Redis 一般都有哪些使用場景?
- 緩存—熱數據
- 計數器
- 隊列
- 分布式鎖與單線程機制
- 排行榜
- 最新列表
- 高并發讀寫
- 位操作大數據處理)redis中setbit(位操作)的實際應用 - 云+社區 - 騰訊云 (tencent.com)
3. Redis 有哪些常見的功能?
- 哨兵(sentinel)和復制(replication)
- 事務
- LUA腳本
- 持久化(Persistence)
- 集群(Cluster)
4. Redis 支持的數據類型有哪些?
- string(字符串)
- hash(哈希散列)
- list(列表)
- set(集合)
- zset(sorted set:有序集合)
- HyperLogLog 類型(來統計一個集合中不重復的元素個數)
- Redis 5.0 提供的 Stream(支持消息隊列)
注意:這里指的數據類型是 Value(值) 的數據類型,而非 key。
5. Redis 為什么這么快??
- Redis 是一款純內存結構,避免了磁盤 I/O 等耗時操作。
- Redis 命令處理的核心模塊為單線程,減少了鎖競爭,以及頻繁創建線程和銷毀線程的代價,減少了線程上下文切換的消耗。
- 采用了 I/O 多路復用機制,大大提升了并發效率。
- 高效的數據結構(簡單動態字符串、內存重新分配、雙端鏈表等)
- 底層模型不同,Redis并沒有使用OS提供的Swap,而是自己實現構建了VM的工作機制。
6. 什么是緩存穿透?怎么解決?
如果在請求數據時,在緩存層和數據庫層都沒有找到符合條件的數據,也就是說,在緩存層和數據庫層都沒有命中數據,那么,這種情況就叫作緩存穿透。
解決方式:
- 把空對象緩存起來。當第一次從數據庫中查詢出來的結果為空時,我們就將這個空對象加載到緩存,并設置合理的過期時間,這樣,就能夠在一定程度上保障后端數據庫的安全
- 第二種解決緩存穿透問題的解決方案:就是使用布隆過濾器
7. 什么是緩存雪崩?該如何解決?
如果在某一時刻緩存集中失效,或者緩存系統出現故障,所有的并發流量就會直接到達數據庫。
解決方式:
- 保證 Redis 的高可用。
- 使用限流降級的方式防止緩存雪崩。
- 通過數據預熱的方式將可能大量訪問的數據加載到緩存,在即將發生大并發訪問的時候,提前手動觸發加載不同的數據到緩存中,并為數據設置不同的過期時間,讓緩存失效的時間點盡量均勻,不至于在同一時刻全部失效。
8. 怎么保證緩存和數據庫數據的一致性?CAP理論?
- 雙清延遲清理策略:數據變化前和后都進行緩存清理,事務完成后再次清理。也可以最后監聽binlog,再把數據刷入緩存中。
- 隊列清理,mq中間件接入redis,這樣做小型系統能支撐業務并發,大型系統會產生較高延遲,影響使用。
9. Redis 持久化有幾種方式?
由于Redis的數據都存放在內存中,如果沒有配置持久化,redis重啟后數據就全丟失了,于是需要開啟redis的持久化功能,將數據保存到磁盤上,當redis重啟后,可以從磁盤中恢復數據。redis提供兩種方式進行持久化:
- RDB快照持久化:
時間間隔內將內存的數據集快照寫到磁盤。恢復快,節省數據空間,但是當redis故障,仍會丟失部分數據
命令:
BGSAVE:Redis會調用fork來創建一個子進程,然后子進程負責將所有數據的快照寫入硬盤,而父進程則繼續處理命令請求。
save 60 10000:Redis最近一次創建快照之后開始算起,當“60秒之內有10000次寫入”這個條件被滿足時,Redis就會自動觸發BGSAVE命令
- AOF(append only file)持久化
AOF持久化 的實時性更好,原理是將Redis的操作日志以追加的方式寫入文件,但是不加以控制的話,AOF文件的體積可能會比快照文件大好幾倍,恢復慢,可以通過冗余命令(BGREWRITEAOF)來重寫(rewrite)AOF文件來減小AOF文件的體積
參數:
appendonly yes 開關
appendfsync always #每次有數據修改發生時都會寫入AOF文件,這樣會嚴重降低Redis的速度
appendfsync everysec #每秒鐘同步一次,顯示地將多個寫命令同步到硬盤
appendfsync no #讓操作系統決定何時進行同步
10. Redis 怎么實現分布式鎖?
- 使用MySQL,基于唯一索引。
- 使用ZooKeeper,基于臨時有序節點。
- 使用Redis,基于setnx命令
加鎖:使用setnx key value命令,如果key不存在,設置value(加鎖成功)。如果已經存在lock(也就是有客戶端持有鎖了),則設置失敗(加鎖失敗)。
解鎖:使用del命令,通過刪除鍵值釋放鎖。釋放鎖之后,其他客戶端可以通過setnx命令進行加鎖
1.防止死鎖:要有個超時的機制,在設置key的值時,需要加上有效時間,如果有效時間過期了,就會自動失效,就不會出現死鎖。
2.支持可重入鎖:加鎖成功后使用hset命令value=1,使用hincrby自增,解鎖時,先判斷可重復次數是否大于0,大于0則減一,否則刪除鍵值,釋放鎖資源
3.加鎖失敗后阻塞等待,等鎖釋放后再次嘗試加鎖
11. Redis 淘汰策略有哪些?
在Redis中,允許用戶設置最大使用內存大小server.maxmemory,當Redis 內存數據集大小上升到一定大小的時候,就會施行數據淘汰策略。
- volatile-lru:從已設置過期的數據集中挑選最近最少使用的淘汰
- volatile-ttr:從已設置過期的數據集中挑選將要過期的數據淘汰
- volatile-random:從已設置過期的數據集中任意挑選數據淘汰
- allkeys-lru:從數據集中挑選最近最少使用的數據淘汰
- allkeys-random:從數據集中任意挑選數據淘汰
- noenviction:禁止淘汰數據
redis淘汰數據時還會同步到aof
12. Redis 常見性能問題和解決方案?
- Master最好不要做任何持久化工作,包括內存快照和AOF日志文件,特別是不要啟用內存快照做持久化。
- 如果數據比較重要,某個Slave開啟AOF備份數據,策略設置為每秒同步一次
- 為了主從復制的速度和連接的穩定性,Master和Slave最好在同一個局域網內,盡量避免在壓力很大的主庫上增加從庫
- Master調用BGREWRITEAOF重寫AOF文件,AOF在重寫的時候會占大量的CPU和內存資源,導致服務load過高,出現短暫服務暫停現象。
- 為了Master的穩定性,主從復制不要用圖狀結構,用單向鏈表結構更穩定,即主從關系為:Master
- redis并發問題可以使用分布式鎖
- redis持久化數據和緩存可以通過集群模式擴容
番外篇
混合持久化方式
Redis 4.0 開始支持 RDB 和 AOF 的混合持久化(默認關閉,可以通過配置項 aof-use-rdb-preamble 開啟)。
redis和memcached比較
- memcached所有的值都是簡單的字符串,redis支持更多的數據類型
- redis速度比memcached快很多
- redis可以持久化數據
- redis支持數據備份,即master-slave模式的數據備份
QPS和TPS
- QPS:應用系統每秒鐘最大能接受的用戶訪問量
- TPS:每秒鐘最大能處理的請求數
總結
以上是生活随笔為你收集整理的Redis面试宝典12道法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 球动画设计HTML5,html5 can
- 下一篇: Linux下Mysql5.5的Cmake