面試官:分佈式鎖都沒能搞清楚,還能叫熟悉Redis?

面試官:分佈式鎖都沒能搞清楚,還能叫熟悉Redis?

面試官: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[]的優點
面試官:分佈式鎖都沒能搞清楚,還能叫熟悉Redis?

面試官:分佈式鎖都沒能搞清楚,還能叫熟悉Redis?

面試官:分佈式鎖都沒能搞清楚,還能叫熟悉Redis?

面試官:分佈式鎖都沒能搞清楚,還能叫熟悉Redis?

後臺私信【面試】免費領取全套面試資料!


分享到:


相關文章: