面試官:分佈式鎖都沒能搞清楚,還能叫熟悉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 命令進行實現。

先看一下這個相關的命令。

 SETNX key value 

如果 key 不存在,就設置 key 對應字符串 value。在這種情況下,該命令和 SET 一樣。當 key 已經存在時,就不做任何操作。SETNX 是”SET if Not eXists”。

expire KEY seconds 

設置 key 的過期時間。如果 key 已過期,將會被自動刪除。

del KEY 

刪除 key

由於當某個 key 不存在的時候,SETNX 纔會設置該 key。且由於 Redis 採用單進行單線程模型,所以,不需要擔心併發問題。那麼,就可以利用 SETNX 的特性維護一個 key,存在的時候,即鎖被某個線程持有;不存在的時候,沒有線程持有鎖。

並且還可以設置 key 的過期時間當作鎖的超時時間,釋放鎖就直接可以將 key 刪除即可。

  • Redis 遇到的問題和缺點
  • Redis 各個數據類型的使用場景
  • Redis 數據淘汰策略
  • Redis 哈希槽的概念
  • Redis 的緩存雪崩
  • Redis 的緩存穿透
  • Redis 的 SDS 相比 char[]的優點

>點擊此處,免費領取!

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