日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Redis面试宝典12道法

發布時間:2023/12/18 数据库 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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道法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。