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

歡迎訪問 生活随笔!

生活随笔

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

数据库

Redis面试经典问题

發布時間:2024/3/26 数据库 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Redis面试经典问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Redis面試經典問題

基礎

1)Redis中的基本數據類型、應用場景以及它們的底層

2)高并發下緩存帶來的問題,緩存穿透,緩存擊穿、緩存雪崩

3)Redis為什么那么快

4)Redis事務

5)redis的過期策略

6)過期策略以及內存淘汰機制的區別

集群相關

7)Redis主從復制的過程

8)Redis主從、哨兵、集群各有什么不同

9)redis主從節點是長連接還是短連接?

10)怎么判斷redis某個節點是否正常工作

11)過期key如何處理

12)redis是同步復制還是異步復制

分布式鎖

13)redis除了做緩存,還可以用來做什么?

14)redis鎖如何保證任何時刻有且只有一個線程持有這個鎖?

15)如何保證分布式鎖不產生死鎖?

16)如何防止釋放別的線程鎖?

17)分布式鎖選用redis與Zookeeper的區別

18)什么是 redis 熱 key,以及解決方案

19)什么是 redis 大 key

20)在1024這個日子,愿打工人早日找到心儀的工作


基礎

1)Redis中的基本數據類型、應用場景以及它們的底層

Redis中有五種基本的數據類型分別是string、list、set、zset、hash

應用場景:string我們常用的是緩存,list可以存放集合的數據,也可以用于隊列;set可以用于數據去重;zset是有序的集合可以用于排行榜,hast可以存儲對象數據。初次還可以用于計數器、秒殺利用Redis中的原子性(INCR、DECR),分布式系統的session管理等

底層:動態字符串,ziplist,quicklist,hash 跳表

String的底層是動態字符串,類似于Java中的ArrayList,可以預分配冗余空間以及擴容,注意String的最大長度是512.

list的底層是一個雙向鏈表,頭部尾部都可以存儲數據。數據結構quickList,當列表元素較少是會分配一塊連續的內存空間ziplist,數據較多是會變成quickList。多個ziplist組成一個quickList

Set底層是一個value為null的hash表

ZSet底層hast表和跳表。hash表關聯元素value和權重score,跳表給value排序。

hash底層的數據結構是ziplist和hashtabel

2)高并發下緩存帶來的問題,緩存穿透,緩存擊穿、緩存雪崩

緩存穿透:數據既不在緩存也不在數據庫。

解決:可以對空值進行緩存;采用布隆過濾器

緩存擊穿:某個熱點數據過期,雪崩的子集

解決:設置不過期,預先將熱點數據加載到緩存中,并發監控,實施調整

加互斥鎖

緩存雪崩:大量緩存同一時刻失效,服務器掛掉

解決:使用多級緩存nginx緩存,本地緩存,redis緩存

將緩存的失效時間分散開,防止集體失效

3)Redis為什么那么快

20道經典Redis面試題_CSDN磚家的博客-CSDN博客_redis面試題

1.單線程+基于內存+采用了非阻塞多路復用機制

減少線程切換的時間與鎖的競爭

CPU與內存速度差了多個數量級,天上一天地下一天

IO多路復用(epoll):多個網絡連接、復用一個線程

2.高效的數據結構(動態字符串,ziplist,quickLIst,hast,跳表)利器

4)Redis事務

Redis中的事務是一組MULTI、EXEC、WATCH等一組命令集合,也就是說將一組命令封裝成一個隊里,其他命令不可以插隊。順序性,一次性,排他性。

  • 開始事務(MULTI)
  • 命令入隊
  • 執行事務(EXEC)、撤銷事務(DISCARD )

5)redis的過期策略

過期策略:定時刪除(單一),惰性刪除(單一)、定期刪除(部分)

redis采用的是定期刪除+惰性刪除策略。

6)過期策略以及內存淘汰機制的區別

當 Redis 的內存超過最大允許的內存之后,Redis 會觸發內存淘汰策略,這和過期策略是完全不同的兩個概念,經常有人把二者搞混,這兩者一個是在正常情況下清除過期鍵,一個是在非正常情況下為了保證 Redis 順利運行的保護策略。

volatile-lru:當內存不足以容納新寫入數據時,從設置了過期時間的key中使用LRU(最近最少使用)算法進行淘汰;

allkeys-lru:當內存不足以容納新寫入數據時,從所有key中使用LRU(最近最少使用)算法進行淘汰。

volatile-lfu:4.0版本新增,當內存不足以容納新寫入數據時,在過期的key中,使用LFU算法進行刪除key。

allkeys-lfu:4.0版本新增,當內存不足以容納新寫入數據時,從所有key中使用LFU算法進行淘汰;

volatile-random:當內存不足以容納新寫入數據時,從設置了過期時間的key中,隨機淘汰數據;。

allkeys-random:當內存不足以容納新寫入數據時,從所有key中隨機淘汰數據。

volatile-ttl:當內存不足以容納新寫入數據時,在設置了過期時間的key中,根據過期時間進行淘汰,越早過期的優先被淘汰;

noeviction:默認策略,當內存不足以容納新寫入數據時,新寫入操作會報錯。

集群相關

7)Redis主從復制的過程

1.一次全量賦值,多次增量賦值

2.一次slave主動,多次master主動

slave節點初次連接master節點,會發送psync命令并觸發全量復制。

此時master節點fork一個后臺進程,開始生成一份RDB快照,同時將那些從外面接收到的寫命令緩存到緩沖區中。

RDB文件生成完畢后,將此文件發送給slave節點,slave先寫入磁盤,再從磁盤加載到內存,

接著master會將新增加的緩沖區的寫命令發送給slave,slave執行寫命令并同步數據。

8)Redis主從、哨兵、集群各有什么不同

主從模式:需要手動進行故障轉移,耗時長,可用性比較差,基本不推薦

哨兵模式:通過哨兵自動完成故障轉移,但是存儲數據比較冗余,利用率低不高,在線擴容

難,也不是太推薦

集群模式:繼承哨兵模式的所有優點,支持在線擴容,數據分片。

通過數據分片,實現在線擴容,同時每個 master 節點支持可讀可寫,可以支持超高的并發,強烈推薦這種方案。 注意:不管使用哪種 redis 高可用方案,都不能保證數據不丟失。 因為三種方

案底層都是依賴的主從復制原理,而主從復制是采用的異步復制,而異步復制是肯定會丟數據的

9)redis主從節點是長連接還是短連接?

長連接

10)怎么判斷redis某個節點是否正常工作

一般集群判斷節點是否正常工作,常用的方法都是通過互相的ping-pong心跳檢測機制,如果有一半以上的節點去ping一個節點的時候沒pong回應,集群就會認為這個節點宕機,會斷掉這個節點的連接。

redis主節點默認每隔10s發送一次心跳-一判斷從節點是否在線。

redis從節點每隔1s發送一次心跳一給主節點發送自己的復制偏移量,從主節點獲取到最新的數據變更命令,還做一件事情就是判斷主節點是否在線。

11)過期key如何處理

主節點處理了一個key或者通過淘汰算法淘汰了一個key,這個時候主節點模擬一條del命令發送給從節點,從節點接收到命令刪除key。

12)redis是同步復制還是異步復制

redis主節點每次接收到寫命令之后,先寫到內部的緩沖區,然后異步發送給從節點。

分布式鎖

13)redis除了做緩存,還可以用來做什么?

答:時效性驗證碼,分布式鎖、防重提交、分布式限流、簡易版本的消息隊列、延遲任務、session共享(

集成spring-session-data-redis)

14)redis鎖如何保證任何時刻有且只有一個線程持有這個鎖?

答:使用命令:setnx key value

key不存在時設置成功返回值ok,key存在設置失敗,

也可以采用If(!redisUtil.get(key)set key value},不過這段代碼需要采用Iua腳本實現來保證原子性。

15)如何保證分布式鎖不產生死鎖?

答:給鎖設置一個合理的過期時間,業務執行過程中節點異常宕機,有個兜底終止跳出方案使用命令:setnx key value ex seconds設置key和對應的過期時間,到了指定的ex時間,鎖自動釋放。

16)如何防止釋放別的線程鎖?

使用UUID或者雪花算法

17)分布式鎖選用redis與Zookeeper的區別

1、redis分布式鎖(推薦)互聯網項目并發量高,對性能要求高,比較推薦。

redis常見操作,例如基本類型string、hash、Iist、set等等操作可以采用jedis或lettuce。

對于跟分布式鎖相關的操作集成redission。

2、分布式鎖百分百可靠可以選用Zookeeper作為分布式鎖。采用cap理論中的cp模型保證高可靠性。

一般的項目我們可以結合不同的場景,同時兼容兩種分布鎖的實現。

18)什么是 redis 熱 key,以及解決方案

在 Redis 中,熱 key 是指那些在極短的時間內訪問頻次非常高的 key

解決:

1、利用二級緩存

使用EhCache,是一個純Java的進程內緩存框架

2、分布式緩存、讀寫分離

讀寫分離就是將同為?Write?的請求發送到?Master?模塊內,而將?Read?的請求發送至?ReadOnly?模塊。

Redis中熱點Key是怎么產生的?如何解決?-Redis-PHP中文網

19)什么是 redis 大 key

通俗易懂的講,大 Key就是某個key對應的value很大,占用的redis空間很大,本質上是大value問題。

Redis中什么是Big Key(大key)問題?如何解決Big Key問題?_每天都要進步一點點的博客-CSDN博客_redis 大key

解決:

在業務上對大Key進行拆分

設置過期時間,及時清理大key

重點要有大Key的分析工具

20)在1024這個日子,愿打工人早日找到心儀的工作

加油打工人

今天是1024程序員節 請對身邊可愛的程序員們好一點_鳳凰科技

總結

以上是生活随笔為你收集整理的Redis面试经典问题的全部內容,希望文章能夠幫你解決所遇到的問題。

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