面試突擊Redis:Redis都有哪些數據類型?分別適用於哪些場景?

01 面試題突擊題目

Redis都有哪些數據類型?分別適用於哪些場景?

面試突擊Redis:Redis都有哪些數據類型?分別適用於哪些場景?

02 面試官心理分析

除非是面試官看你的簡歷,感覺你就是一個工作3年以內的、比較初級的一個同學,可能對技術沒有很深入的研究,面試官才會問這類問題。

其實問這個問題主要就倆原因:

  • 第一,看看你有沒有全面的瞭解redis的功能,一般怎麼來用。有沒有認真思考過什麼場景比較適合用什麼數據類型,就怕你只會最簡單的kv操作,平時也沒思考過怎麼設計才更好。
  • 第二,看看你在實際項目裡都怎麼用Redis,是不是思考過Redis的這些數據類型,是不是愛學習的人。

要是你回答的不好,沒說出幾種數據類型,也沒說什麼場景,支支吾吾的你就完了,面試官對你印象肯定不好,覺得你平時就是做個簡單的set和get。

03 深入剖析

看一下這道面試題怎麼回答。

(1)string

這是Redis中最基本的類型了,也最常用,沒啥可說的,就是普通的set和get,做簡單的kv緩存。

(2)hash

這個是類似map的一種結構,一般可以將結構化的數據,比如一個對象(前提是這個對象沒嵌套其他的對象)給緩存在redis裡,然後每次讀寫緩存的時候,可以就操作hash裡的某個字段,而不是把整個對象都拿出來,這樣節省了IO操作,效率更高。

使用HSET key field value命令存儲一個對象,如我們有一個用戶,key=user:id:1

<code>1value={
2  "id": 1,
3  "name": "walking",
4  "age": 24
5}/<code>

hash類的數據結構,主要是用來存放一些對象,把一些簡單的對象給緩存起來,後續操作的時候,你可以直接僅僅修改這個對象中的某個字段的值。

<code>1value={
2  "id": 1,
3  "name": "walking",
4  "age": 18
5}/<code>

HGET user:id:1 age獲取用戶ID為1的age值。

(3)list

有序列表,這個是可以玩兒出很多花樣的。

比如在微博裡,有個大v的粉絲,就可以以list的格式放在Redis裡去緩存。

key=某大v

value=[zhangsan, lisi, wangwu]

比如可以通過list存儲一些列表型的數據結構,類似粉絲列表了、文章的評論列表了之類的東西。

還可以通過lrange命令,從某個元素開始讀取多少個元素,還可以基於list實現分頁查詢,這個很棒的一個功能。基於redis實現簡單的高性能分頁,可以做類似微博那種下拉不斷分頁的東西,性能很高,一頁一頁的走。

比如還可以用來搞個簡單的消息隊列,從list頭塞進去,從list尾巴那裡弄出來。

(4)set

set無序集合,可以自動去重。

直接基於set將系統裡需要去重的數據扔進去,自動就給去重了,如果你需要對一些數據進行快速的全局去重,你當然也可以基於jvm內存裡的HashSet進行去重。但是如果你的某個系統部署在多臺機器上呢?就得基於Redis進行全局的set去重了。

當然還可以基於set玩兒交集、並集、差集的操作,比如交集吧,可以把兩個人的粉絲列表整一個交集,看看倆人的共同好友是誰?對吧。

把兩個大v的粉絲都放在兩個set中,對兩個set做交集,看到共同關注的人。

(5)sorted set

排序的set,去重但是可以排序,寫進去的時候給一個分數,自動根據分數排序,這個可以玩兒很多的花樣。這個數據類型的最大的特點是有個分數的概念,可以自定義排序規則。

比如說你要是想根據時間對數據排序,那麼可以寫入進去的時候用某個時間作為分數,人家自動給你按照時間排序了。

另外,這個數據類型很適合最排行榜這類的功能。

排行榜: 將每個用戶以及其對應的分數寫入進去命令zadd board score username如

<code>1zadd board 85 Jobs
2zadd board 72 Jerry
3zadd board 96 Walking
4zadd board 62 Tom/<code>

接著使用命令zrevrange board start stop,就可以獲取排名從start到stop的用戶。

使用命令zrank board username,可以看到用戶在排行榜裡的排名。

如:zrevrange board 0 3獲取排名前3的用戶

<code>196 Walking
285 Jobs
372 Jerry/<code>

查看排名zrank board Tom,返回4

04 Redis怎麼學?如何複習?

首先,一起來瞄一眼Redis的學習路線圖(xmind文件),看看怎麼學習比較好

(注意:關於Redis怎麼學?如何複習?這一塊小編提供了一些學習複習筆記,有需要即可免費分享, 私信 小編 “Redis” 即可!!)

面試突擊Redis:Redis都有哪些數據類型?分別適用於哪些場景?

其次,說到複習,一起來看看我自己整理的一份Redis學習筆記

  1. 為什麼要用 redis /為什麼要用緩存(高性能、高併發)
  2. 為什麼要用 redis 而不用 map/guava 做緩存?
  3. redis 常見數據結構以及使用場景分析(String、Hash、List、Set、Sorted Set
  4. redis 內存淘汰機制(MySQL裡有2000w數據,Redis中只存20w的數據,如何保證Redis中的數據都是熱點數據?
  5. redis 持久化機制(怎麼保證 redis 掛掉之後再重啟數據可以進行恢復
  6. Redis 常見異常及解決方案(緩存穿透、緩存雪崩、緩存預熱、緩存降級
  7. 分佈式環境下常見的應用場景(分佈式鎖、分佈式自增 ID
  8. Redis 集群模式(主從模式、哨兵模式、Cluster 集群模式
  9. 如何解決 Redis 的併發競爭 Key 問題?
  10. 如何保證緩存與數據庫雙寫時的數據一致性?
  11. ... ..
面試突擊Redis:Redis都有哪些數據類型?分別適用於哪些場景?

最後,再來看一份Redis常備的面試題...

  1. 什麼是 Redis?簡述它的優缺點?
  2. Redis 與 memcached 相比有哪些優勢?
  3. Redis 支持哪幾種數據類型?
  4. Redis 主要消耗什麼物理資源?
  5. Redis 有哪幾種數據淘汰策略?
  6. 為什麼 Redis 需要把所有數據放到內存中?
  7. Redis 集群方案應該怎麼做?都有哪些方案?
  8. Redis 集群方案什麼情況下會導致整個集群不可用?
  9. MySQL 裡有 2000w 數據,redis 中只存 20w 的數據,如何保證 redis 中的數據都是熱點數據?
  10. Redis 有哪些適合的場景?
  11. Redis 支持的 Java 客戶端都有哪些?官方推薦用哪個?
  12. Redis 和 Redisson 有什麼關係?
  13. Jedis 與 Redisson 對比有什麼優缺點?
  14. Redis 集群的主從複製模型是怎樣的?
  15. Redis 集群會有寫操作丟失嗎?為什麼?
  16. 怎麼理解 Redis 事務?
  17. Redis 如何做內存優化?
  18. Redis 回收進程如何工作的?
  19. watch dog 自動延期機制
  20. 鎖互斥機制
  21. 釋放鎖機制|
  22. ... ....
面試突擊Redis:Redis都有哪些數據類型?分別適用於哪些場景?

關於上面說的這些Redis學習筆記和複習大綱以及面試常備題目(附詳細解析),皆可免費贈送給閱讀此篇文章的你,轉發+私信我 “Redis” 即可找小編免費分享下載!!


分享到:


相關文章: