關於Redis的常見面試題解析


1. 使用redis有哪些好處?

(1) 速度快,因為數據存在內存中,類似於HashMapHashMap的優勢就是查找和操作的時間復雜度都是O(1)

(2) 支持豐富數據類型,支持stringlistsetsorted sethash

(3) 支持事務,操作都是原子性,所謂的原子性就是對數據的更改要么全部執行,要么全部不執行

(4) 豐富的特性:可用於緩存,消息,按key設置過期時間,過期后將會自動刪除

 

2、Redis支持的數據類型

 

String字符串:

格式: set key value

string類型是二進制安全的。意思是redisstring可以包含任何數據。比如jpg圖片或者序列化的對象 。

string類型是Redis最基本的數據類型,一個鍵最大能存儲512MB

 

Hash(哈希)

格式: hmset name  key1 value1 key2 value2

Redis hash 是一個鍵值(key=>value)對集合。

Redis hash是一個string類型的fieldvalue的映射表,hash特別適合用於存儲對象。

 

List(列表)

Redis 列表是簡單的字符串列表,按照插入順序排序。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)

格式: lpush  name  value

key 對應 list 的頭部添加字符串元素

格式: rpush  name  value

key 對應 list 的尾部添加字符串元素

格式: lrem name  index

key 對應 list 中刪除 count 個和 value 相同的元素

格式: llen name  

返回 key 對應 list 的長度

 

Set(集合)

格式: sadd  name  value

RedisSetstring類型的無序集合。

集合是通過哈希表實現的,所以添加,刪除,查找的復雜度都是O(1)

 

zset(sorted set:有序集合)

格式: zadd  name score value

Redis zset set 一樣也是string類型元素的集合,且不允許重復的成員。

不同的是每個元素都會關聯一個double類型的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。

zset的成員是唯一的,但分數(score)卻可以重復。

 

3、什么是Redis持久化?Redis有哪幾種持久化方式?優缺點是什么?

持久化就是把內存的數據寫到磁盤中去,防止服務宕機了內存數據丟失。

Redis 提供了兩種持久化方式:RDB(默認) AOF 

 

RDB

rdbRedis DataBase縮寫

功能核心函數rdbSave(生成RDB文件)rdbLoad(從文件加載內存)兩個函數

 

 

AOF:

AofAppend-only file縮寫,

每當執行服務器(定時)任務或者函數時flushAppendOnlyFile 函數都會被調用, 這個函數執行以下兩個工作

aof寫入保存:

WRITE:根據條件,將 aof_buf 中的緩存寫入到 AOF 文件

SAVE:根據條件,調用 fsync  fdatasync 函數,將 AOF 文件保存到磁盤中。

 

存儲結構:

  內容是redis通訊協議(RESP )格式的命令文本存儲。

(RESP redis客戶端和服務端之前使用的一種通訊協議;

RESP 的特點:實現簡單、快速解析、可讀性好

 

 

 

比較

1aof文件比rdb更新頻率高,優先使用aof還原數據。

2aofrdb更安全也更大

3rdb性能比aof

4、如果兩個都配了優先加載AOF

 

 

4、Redis 有哪些架構模式?講講各自的特點

 

 

 

Redis sentinel 是一個分布式系統中監控 redis 主從服務器,並在主服務器下線時自動進行故障轉移。其中三個特性:

監控(Monitoring):    Sentinel  會不斷地檢查你的主服務器和從服務器是否運作正常。

提醒(Notification): 當被監控的某個 Redis 服務器出現問題時, Sentinel 可以通過 API 向管理員或者其他應用程序發送通知。

自動故障遷移(Automatic failover): 當一個主服務器不能正常工作時, Sentinel 會開始一次自動故障遷移操作。

特點:

1、保證高可用

2、監控各個節點

3、自動故障遷移

缺點:主從模式,切換需要時間丟數據

沒有解決 master 寫的壓力

 

 

集群(proxy 型):

 

 

 

Twemproxy 是一個 Twitter 開源的一個 redis memcache 快速/輕量級代理服務器; Twemproxy 是一個快速的單線程代理程序,支持 Memcached ASCII 協議和 redis 協議。

特點:1、多種 hash 算法:MD5CRC16CRC32CRC32ahsiehmurmurJenkins 

2、支持失敗節點自動刪除

3、后端 Sharding 分片邏輯對業務透明,業務方的讀寫方式和操作單個 Redis 一致

缺點:增加了新的 proxy,需要維護其高可用。

 

failover 邏輯需要自己實現,其本身不能支持故障的自動轉移可擴展性差,進行擴縮容都需要手動干預

 

 

集群(直連型):

 

 

 

redis 3.0之后版本支持redis-cluster集群,Redis-Cluster采用無中心結構,每個節點保存數據和整個集群狀態,每個節點都和其他所有節點連接。

特點:

1、無中心架構(不存在哪個節點影響性能瓶頸),少了 proxy 層。

2、數據按照 slot 存儲分布在多個節點,節點間數據共享,可動態調整數據分布。

3、可擴展性,可線性擴展到 1000 個節點,節點可動態添加或刪除。

4、高可用性,部分節點不可用時,集群仍可用。通過增加 Slave 做備份數據副本

5、實現故障自動 failover,節點之間通過 gossip 協議交換狀態信息,用投票機制完成 SlaveMaster 的角色提升。

缺點:

1、資源隔離性較差,容易出現相互影響的情況。

2、數據通過異步復制,不保證數據的強一致性

 

 

5、Redis常用命令?

Keys pattern

*表示區配所有

bit開頭的

查看Exists  key是否存在

 

Set

設置 key 對應的值為 string 類型的 value

 

setnx

設置 key 對應的值為 string 類型的 value。如果 key 已經存在,返回 0nx not exist 的意思。

 

刪除某個key

第一次返回1 刪除了 第二次返回0

 

Expire 設置過期時間(單位秒)

TTL查看剩下多少時間

返回負數則key失效,key不存在了

 

Setex

設置 key 對應的值為 string 類型的 value,並指定此鍵值對應的有效期。

 

Mset

一次設置多個 key 的值,成功返回 ok 表示所有的值都設置了,失敗返回 0 表示沒有任何值被設置。

 

Getset

設置 key 的值,並返回 key 的舊值。

 

Mget

一次獲取多個 key 的值,如果對應 key 不存在,則對應返回 nil

 

Incr

key 的值做加加操作,並返回新的值。注意 incr 一個不是 int value 會返回錯誤,incr 一個不存在的 key,則設置 key 1

 

incrby

incr 類似,加指定值 ,key 不存在時候會設置 key,並認為原來的 value 0

 

Decr

key 的值做的是減減操作,decr 一個不存在 key,則設置 key -1

 

Decrby

decr,減指定值。

 

Append

給指定 key 的字符串值追加 value,返回新字符串值的長度。

 

Strlen

取指定 key value 值的長度。

persist xxx(取消過期時間)

選擇數據庫(0-15庫)

Select 0 //選擇數據庫

move age 1//age 移動到1

Randomkey隨機返回一個key

Rename重命名

Type 返回數據類型

 

 

6、使用過Redis分布式鎖么,它是怎么實現的?

先拿setnx來爭搶鎖,搶到之后,再用expire給鎖加一個過期時間防止鎖忘記了釋放。

如果在setnx之后執行expire之前進程意外crash或者要重啟維護了,那會怎么樣?

set指令有非常復雜的參數,這個應該是可以同時把setnxexpire合成一條指令來用的!

 

 

7、使用過Redis做異步隊列么,你是怎么用的?有什么缺點?

一般使用list結構作為隊列,rpush生產消息,lpop消費消息。當lpop沒有消息的時候,要適當sleep一會再重試。

缺點:

在消費者下線的情況下,生產的消息會丟失,得使用專業的消息隊列如rabbitmq等。

 

 8、什么是緩存穿透?如何避免?什么是緩存雪崩?何如避免?

緩存穿透

一般的緩存系統,都是按照key去緩存查詢,如果不存在對應的value,就應該去后端系統查找(比如DB)。一些惡意的請求會故意查詢不存在的key,請求量很大,就會對后端系統造成很大的壓力。這就叫做緩存穿透。

如何避免?

1:對查詢結果為空的情況也進行緩存,緩存時間設置短一點,或者該key對應的數據insert了之后清理緩存。

2:對一定不存在的key進行過濾。可以把所有的可能存在的key放到一個大的Bitmap中,查詢時通過該bitmap過濾。

緩存雪崩

當緩存服務器重啟或者大量緩存集中在某一個時間段失效,這樣在失效的時候,會給后端系統帶來很大壓力。導致系統崩潰。

如何避免?

1:在緩存失效后,通過加鎖或者隊列來控制讀數據庫寫緩存的線程數量。比如對某個key只允許一個線程查詢數據和寫緩存,其他線程等待。

2:做二級緩存,A1為原始緩存,A2為拷貝緩存,A1失效時,可以訪問A2A1緩存失效時間設置為短期,A2設置為長期

3:不同的key,設置不同的過期時間,讓緩存失效的時間點盡量均勻。

 

上海尚學堂Java大數據培訓課程免費試學開啟,redis學習資料視頻免費領取哦~~~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM