初級JAVA程序員應該掌握的Redis知識(超詳細面試點整理)

爲什麼要學習Redis?

Mysql是一種關係型數據庫,由於其速度快和穩定性強等諸多優點被許多公司青睞。Redis是一種內存型數據庫,可以顯著的提升數據訪問速度,當物理內存夠用的時候,Redis的速度要快於MySQL。因此大多數公司目前都會採用MySQL數據庫(主)+Redis(輔)的數據存儲方式,所以說不定就用到了,從實用的角度看掌握Redis的知識比較重要,從面試的角度來看,Redis的知識點考察頻率也是相對較高的,因此學習Redis的知識就更加重要了。

Redis的應用場景是?

Redis可以做緩存,使查詢效果更快。
Redis可以做隊列,雖然效果不如Kafka。
Redis可以做分佈式鎖,用於商品秒殺等需求。
Redis可以用來做限流,識別縟羊毛用戶等等。
Redis可以用來做排行榜,大數據處理…

Redis有哪些功能?

緩存/持久化/哨兵和複製/集羣/Lua腳本/管道/事務/分佈式鎖

Redis的優缺點?

優點

性能高/數據類型豐富/操作都是原子性的/補償了mamcached的不足/簡單…

缺點

由於物理內存原因,侷限於較小數量級的操作運算

Redis的Tips

1.list,set,hash,zset這四種數據結構共享規則:create if not exit & drop if no elements
2.Redis的所有數據結構都可以設置過期時間,Redis的過期是以對象爲單位的,例如hash結構的過期是整個hash對象的過期

分佈式鎖及Redis的分佈式鎖

爲什麼需要分佈式鎖?

當我們在使用多線程的時候,我們需要對一些共同訪問的資源加鎖。它可以保證在單個JVM時候的數據安全。
當遇到分佈式系統,考慮到多個JVM的時候,此時也需要類似的鎖,來保證數據的安全,這個時候用到的鎖就是分佈式鎖。

分佈式鎖有哪些?

基於數據庫實現/Zookeeper實現/Redis實現/

分佈式鎖有哪些特點?

1.互斥性,任意時間只能有一個客戶端獲得鎖。
2.有可能出現死鎖,如果獲得鎖的客戶端掛掉的話,會出現鎖不歸還的情況,這種情況叫死鎖,如果不想辦法避免這個問題,其他客戶端就沒辦法拿到這個鎖。因此需要鎖超時,防止死鎖。
3.容錯性,集羣中(一堆電腦)掛掉一部分節點(部分電腦),不影響還存活的節點獲得或者釋放鎖。
4.可重入性,同一節點的同一線程在鎖未過期之前可以再次獲得鎖並更新過期時間。

Redis的分佈式鎖如何實現?

1.使用Lua腳本(setnx+expire)
2.或者使用Redlock算法

Redis的一些關鍵知識?

Redis的基本用法?

set/get命令:設置數據、獲取數據;
del命令:刪除數據
Redis的使用看起來很像具有封裝好的方法的集合/數組

Redis的數據結構?

圖片來自網絡,總結的很好~
在這裏插入圖片描述

Redis的底層實現?

Redis的底層是實用的C語言,Redis使用的數據結構是
SDS(語法是C語言的結構體):
struct sds {
int len;
int free;
char buf[];
}
使用SDS的好處是獲取字符串長度的時間複雜度爲O(1),因爲可以直接通過len字段得到長度,而不用通過遍歷字符串得到啦;此外,因爲有free字段,所以不會造成緩衝區溢出;然後,可以直接用C語言封裝的庫函數對字符串進行處理。所以底層也是有玄機的!

Redis的內存淘汰策略?

Redis有幾種內存淘汰策略,可以把這個策略理解成一個當內存不夠用的時候淘汰數據的算法(函數),默認策略是noeviction,即直接報錯,還有使用LRU算法的allkeys-lru,優先把最近沒有用到的數據刪掉,此外還有一些策略,按需學習。

Redis的常見面試題?

如果要改成用hash結構來緩存用戶信息,如何封裝比較合適?

這個會了,Redis的常用命令差不多就熟悉了。

Redis的操作是原子性的嗎,爲什麼?

Redis的操作當然是原子性的啦,因爲Redis是單線程的!

單線程的Redis爲什麼這麼快?

因爲數據都在內存中!在內存中效率當然是最高的!

Redis爲什麼又使用多線程了?

一定要明確一個觀點:Redis無論使用單線程還是多線程,都是爲了更高效率的處理問題。就像微信支持改名一樣,多線程也只是業務的需要。

未完待續

等到後面準備面試的時候我再多寫幾個吧。

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