01 面試題突擊題目
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 而不用 map/guava 做緩存?
- redis 常見數據結構以及使用場景分析(String、Hash、List、Set、Sorted Set)
- redis 內存淘汰機制(MySQL裡有2000w數據,Redis中只存20w的數據,如何保證Redis中的數據都是熱點數據?)
- redis 持久化機制(怎麼保證 redis 掛掉之後再重啟數據可以進行恢復)
- Redis 常見異常及解決方案(緩存穿透、緩存雪崩、緩存預熱、緩存降級)
- 分佈式環境下常見的應用場景(分佈式鎖、分佈式自增 ID)
- Redis 集群模式(主從模式、哨兵模式、Cluster 集群模式)
- 如何解決 Redis 的併發競爭 Key 問題?
- 如何保證緩存與數據庫雙寫時的數據一致性?
- ... ..
最後,再來看一份Redis常備的面試題...
- 什麼是 Redis?簡述它的優缺點?
- Redis 與 memcached 相比有哪些優勢?
- Redis 支持哪幾種數據類型?
- Redis 主要消耗什麼物理資源?
- Redis 有哪幾種數據淘汰策略?
- 為什麼 Redis 需要把所有數據放到內存中?
- Redis 集群方案應該怎麼做?都有哪些方案?
- Redis 集群方案什麼情況下會導致整個集群不可用?
- MySQL 裡有 2000w 數據,redis 中只存 20w 的數據,如何保證 redis 中的數據都是熱點數據?
- Redis 有哪些適合的場景?
- Redis 支持的 Java 客戶端都有哪些?官方推薦用哪個?
- Redis 和 Redisson 有什麼關係?
- Jedis 與 Redisson 對比有什麼優缺點?
- Redis 集群的主從複製模型是怎樣的?
- Redis 集群會有寫操作丟失嗎?為什麼?
- 怎麼理解 Redis 事務?
- Redis 如何做內存優化?
- Redis 回收進程如何工作的?
- watch dog 自動延期機制
- 鎖互斥機制
- 釋放鎖機制|
- ... ....
關於上面說的這些Redis學習筆記和複習大綱以及面試常備題目(附詳細解析),皆可免費贈送給閱讀此篇文章的你,轉發+私信我 “Redis” 即可找小編免費分享下載!!
閱讀更多 追逐仰望星空 的文章