面試官:Redis 的優勢有哪些?
程序員阿里:
速度快,因為數據存在內存中,類似於 HashMap,HashMap 的優勢就是查找和操作的時間複雜度都是 O(1)。
支持豐富的數據類型,支持 string,list,set,zset 和 hash。
支持事務性。操作都是原子性,所謂的原子性就是對數據的更改要麼全部執行,要麼全部不執行。(這塊需要注意與之前 MySQL 不同)
豐富的特性,可用於緩存,消息隊列,按 key 設置過期時間,過期後將自動刪除。
面試官:Redis 的數據結構都有哪些?
程序員阿里:
Redis 支持五種 Value Type,其底層實現的編碼數據結構有 8 種:
- SDS - simple synamic string - 支持自動動態擴容的字節數組
- list - 平平無奇的鏈表
- dict - 使用雙哈希表實現的, 支持平滑擴容的字典
- zskiplist - 附加了後向指針的跳躍表
- intset - 用於存儲整數數值集合的自有結構
- ziplist - 一種實現上類似於 TLV,但比 TLV 複雜的,用於存儲任意數據的有序序列的數據結構
- quicklist - 一種以 ziplist 作為結點的雙鏈表結構
- zipmap - 一種用於在小規模場合使用的輕量級字典結構銜接"底層數據結構"與"Value Type"的橋樑的,則是 Redis 實現的另外一種數據結構:redisObject
Redis 中的 Key 與 Value 在表層都是一個 redisObject 實例,故該結構有所謂的" 類型",即是ValueType。對於每一種 Value Type 類型的 redisObject,其底層至少支持兩種不同的底層數據結構來實現。以應對在不同的應用場景中,Redis 的運行效率,或內存佔用。
面試官:Redis 適合於哪些場景?
程序員阿里:
Session 共享(單點登陸)、頁面緩存、隊列(比如項目中用到的異步隊列)、排行榜/計數器、發佈/訂閱(實現消息流)
- Redis 的使用要注意什麼?
- Redis 的事務性
- 當前 Redis cluster 集群有哪些方式,各自優缺點,場景
- Memcache 的原理,哪些數據適合放在緩存中?
- Redis 相比 memcached 有哪些優勢?兩者的主要區別?
- Redis 的併發競爭問題如何解決,瞭解 Redis 事務的 CAS 操作嗎?
- Redis 持久化的機制,AOF 和 RDB 的區別
- Redis 對象的內存回收
- 知道哪些 Redis 的優化操作
- Redis 的主從複製機制原理
- Redis 的線程模型是什麼?
- Redis 中 set 和 zset 的區別
- 分佈式使用場景(存儲 session)
- 怎麼保證緩存和數據庫的一致性?
- Redis 為什麼用 skiplist 而不用平衡樹?
- Redis 分佈式鎖的實現方式
第一種,使用 redis 的 watch 命令進行實現。
watch 指令在 redis 事物中提供了 CAS 的行為。為了檢測被 watch 的 keys 在是否有多個 clients 同時改變引起衝突,這些 keys 將會被監控。如果至少有一個被監控的 key 在執行 exec 命令前被其他客戶端修改,整個事務將會回滾,不執行任何動作,從而保證原子性操作,並且執行 exec 會得到 null 的回覆。
具體工作機制:watch 命令會監視給定的每一個 key,當 exec 時如果監視的任一個 key 自從調用 watch 後發生過變化,則整個事務會回滾,不執行任何動作。 注意 watch 的 key 是對整個連接有效的,事務也一樣。如果連接斷開,監視和事務都會被自動清除。
第二種,使用 redis 的 setnx 命令進行實現。
先看一下這個相關的命令。
<code> SETNX key value /<code>
如果 key 不存在,就設置 key 對應字符串 value。在這種情況下,該命令和 SET 一樣。當 key 已經存在時,就不做任何操作。SETNX 是”SET if Not eXists”。
<code>expire KEY seconds /<code>
設置 key 的過期時間。如果 key 已過期,將會被自動刪除。
<code>del KEY /<code>
刪除 key
由於當某個 key 不存在的時候,SETNX 才會設置該 key。且由於 Redis 採用單進行單線程模型,所以,不需要擔心併發問題。那麼,就可以利用 SETNX 的特性維護一個 key,存在的時候,即鎖被某個線程持有;不存在的時候,沒有線程持有鎖。
並且還可以設置 key 的過期時間當作鎖的超時時間,釋放鎖就直接可以將 key 刪除即可。
- Redis 遇到的問題和缺點
- Redis 各個數據類型的使用場景
- Redis 數據淘汰策略
- Redis 哈希槽的概念
- Redis 的緩存雪崩
- Redis 的緩存穿透
- Redis 的 SDS 相比 char[]的優點
後臺私信【面試】免費領取全套面試資料!