Redis—校招、實習常見面試題彙總

1.redis 緩存穿透,緩存雪崩,緩存擊穿

(1)緩存穿透
緩存穿透,是指查詢一個數據庫一定不存在的數據。正常的使用緩存流程大致是,數據查詢先進行緩存查詢,如果key不存在或者key已經過期,再對數據庫進行查詢,並把查詢到的對象,放進緩存。如果數據庫查詢對象爲空,則不放進緩存。
(2)緩存雪崩
緩存雪崩,是指在某一個時間段,緩存集中過期失效。
產生雪崩的原因之一,比如在寫本文的時候,馬上就要到雙十二零點,很快就會迎來一波搶購,這波商品時間比較集中的放入了緩存,假設緩存一個小時。那麼到了凌晨一點鐘的時候,這批商品的緩存就都過期了。而對這批商品的訪問查詢,都落到了數據庫上,對於數據庫而言,就會產生週期性的壓力波峯。
(3)緩存擊穿
緩存擊穿,是指一個key非常熱點,在不停的扛着大併發,大併發集中對這一個點進行訪問,當這個key在失效的瞬間,持續的大併發就穿破緩存,直接請求數據庫,就像在一個屏障上鑿開了一個洞。

2.Redis 和 MemeCache 有什麼區別?

1)、存儲方式 Memecache把數據全部存在內存之中,斷電後會掛掉,數據不能超過內存大小。 Redis有部份存在硬盤上,這樣能保證數據的持久性。 2)、數據支持類型 Memcache對數據類型支持相對簡單。 Redis有複雜的數據類型。 3)、使用底層模型不同 它們之間底層實現方式 以及與客戶端之間通信的應用協議不一樣。 Redis直接自己構建了VM 機制 ,因爲一般的系統調用系統函數的話,會浪費一定的時間去移動和請求。

3.Redis 爲什麼是單線程的?

因爲redis利用隊列技術將併發訪問變爲串行訪問,消除了傳統數據庫串行控制的開銷。

4.什麼是緩存穿透?怎麼解決?

傳送門:https://www.cnblogs.com/jamaler/p/12453800.html

5.Redis 支持的數據類型有哪些?

1.redis的5種數據類型: string 字符串(可以爲整形、浮點型和字符串,統稱爲元素) list 列表(實現隊列,元素不唯一,先入先出原則) set 集合(各不相同的元素)
hash hash散列值(hash的key必須是唯一的) sort set 有序集合

6.Redis 支持的 Java 客戶端都有哪些?

Redis Desktop Manager 、Redis Client、Redis Studio、jedis

7.Jedis 和 Redisson 有哪些區別?

Jedis是Redis的java實現客戶端,其API提供了比較全面的Redis命令的支持;Redisson實現了分佈式和可擴展的Java數據結構,和Jedis相比,功能較爲簡單,不支持字符串操作,不支持排序、事務‘管道、分區等Redis特性。Redisson的宗旨是促進使用者對Redis的關注分離,從而讓使用者能夠將精力更集中地放在處理業務邏輯上。

8.怎麼保證緩存和數據庫數據的一致性?

由於數據庫層面的讀寫併發,引發的數據庫與緩存數據不一致的問題(本質是後發生的讀請求先返回了),可能通過兩個小的改動解決:(1)修改服務Service連接池,id取模選取服務連接,能夠保證同一個數據的讀寫都落在同一個後端服務上(2)修改數據庫DB連接池,id取模選取DB連接,能夠保證同一個數據的讀寫在數據庫層面是串行的

9.Redis 持久化有幾種方式?

Redis是一種高級key-value數據庫。它跟memcached類似,不過數據可以持久化,而且支持的數據類型很豐富。有字符串,鏈表,集 合和有序集合。支持在服務器端計算集合的並,交和補集(difference)等,還支持多種排序功能。所以Redis也可以被看成是一個數據結構服務 器。Redis的所有數據都是保存在內存中,然後不定期的通過異步方式保存到磁盤上(這稱爲“半持久化模式”);也可以把每一次數據變化都寫入到一個append only file(aof)裏面(這稱爲“全持久化模式”)。

10.Redis 怎麼實現分佈式鎖?

Redis的實現主要基於setnx 和給予一個超時時間(防止釋放鎖失敗)。 多個嘗試獲取鎖的客戶端使用同一個key做爲目標數據的唯一鍵,value爲鎖的期望超時時間點; 首先進行一次setnx命令,嘗試獲取鎖,如果獲取成功,則設置鎖的最終超時時間(以防在當前進程獲取鎖後奔潰導致鎖無法釋放)這裏利用 Redis set key 時的一個 NX 參數可以保證在這個 key 不存在的情況下寫入成功。並且再加上 EX 參數可以讓該 key 在超時之後自動刪除。一定不要把兩個命令(NX EX)分開執行,如果在 NX 之後程序出現問題就有可能產生死鎖。非阻塞鎖、阻塞鎖、解鎖、爲了更好的健壯性,將該操作封裝爲一個lua腳本,這樣即可保證其原子性 redis分佈式的實現原理:
1、通過setNX操作,如果存在key,不操作;不存在,纔會set值,保證鎖的互斥性2、value設置鎖的到期時間,當鎖超時時,進行getAndSet操作,先get舊值,再set新值,避免發生死鎖。這裏也可以通過設置key的有效期來避免死鎖,但是setNx和exprise(設置有效期)操作非原子性,可能發生鎖沒有設置有效時間的問題,從而發生死鎖。實現:spring boot 通過jdeis連接redsi集羣。
加鎖過程:
1、獲得當前系統時間,計算鎖的到期時間
2、setNx操作,加鎖
3、如果,加鎖成功,設置鎖的到期時間,返回true;取鎖失敗,取出當前鎖的value(到期時間)
4、如果value不爲空而且小於當前系統時間,進行getAndSet操作,重新設置value,並取出舊value;否則,等待間隔時間後,重複步驟2;
5、如果步驟3和4取出的value一樣,加鎖成功,設置鎖的到期時間,返回true;否則,別人加鎖成功,恢復鎖的value,等待間隔時間後,重複步驟2。

11.Redis 分佈式鎖有什麼缺陷?

在工作和網絡上看到過各個版本的Redis分佈式鎖實現,每種實現都有一些不嚴謹的地方,甚至有可能是錯誤的實現,包括在代碼中,如果不能正確的使用分佈式鎖,可能造成嚴重的生產環境故障。
redis分佈式鎖的缺陷
傳送門:https://blog.csdn.net/matt8/article/details/64442064

12.Redis 如何做內存優化?

1,使用對象共享池優化小整數對象。
2,數據優先使用整數,比字符串更節省空間。3,操作優化。儘量避免字符串的追加操作,因爲字符串存在預分配機制。追加操作後字符串對象會分配一倍的容量作爲於預留空間。4,編碼優化。list,hash,set,zset儘可能使用ziplist編碼。好處是內存下降,壞處是操作變慢。一般大小不超過1000。

13.Redis 淘汰策略有哪些?

redis 提供 6種數據淘汰策略:
volatile-lru:從已設置過期時間的數據集(server.db[i].expires)中挑選最近最少使用的數據淘汰
volatile-ttl:從已設置過期時間的數據集(server.db[i].expires)中挑選將要過期的數據淘汰
volatile-random:從已設置過期時間的數據集(server.db[i].expires)中任意選擇數據淘汰
allkeys-lru:從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰
allkeys-random:從數據集(server.db[i].dict)中任意選擇數據淘汰
no-enviction(驅逐):禁止驅逐數據

14.Redis 常見的性能問題有哪些?

該如何解決?1.master寫內存快照,seve命令調度rdbsave函數,會阻塞主線程的工程,當快照比較大的時候對性能的影響是非常大的,會間斷性暫停服務 。所以master最好不要寫內存快照。2.master AOF持久化,如果不重寫AOF文件,這個持久化方式對性能的影響是最小的,但是AOF文件會不斷增大,AOF文件過大會影響master重啓時的恢復速度。master最好不要做任何持久化工作,包括內存快照和AOF日誌文件,特別是不要啓用內存快照做持久化,如果數據比較關鍵,某個slave開啓AOF備份數據,策略每秒爲同步一次。3.master調用BGREWRITEAOF重寫AOF文件,AOF在重寫的時候會佔大量的CPU和內存資源,導致服務load過高,出現短暫的服務暫停現象。4.redis主從複製的性能問題,爲了主從複製的速度和連接的穩定性,slave和master最好在同一個局域網內。

備註:感興趣的可以關注我哦~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章