阿里Java面試題剖析:Redis 都有哪些資料型別?分別怎樣使用合適
面試題
redis 都有哪些資料型別?分別在哪些場景下使用比較合適?
面試官心理分析
除非是面試官感覺看你簡歷,是工作 3 年以內的比較初級的同學,可能對技術沒有很深入的研究,面試官才會問這類問題。否則,在寶貴的面試時間裡,面試官實在不想多問。
其實問這個問題,主要有兩個原因:
看看你到底有沒有全面的瞭解 redis 有哪些功能,一般怎麼來用,啥場景用什麼,就怕你別就會最簡單的 KV 操作;
看看你在實際專案裡都怎麼玩兒過 redis。
要是你回答的不好,沒說出幾種資料型別,也沒說什麼場景,你完了,面試官對你印象肯定不好,覺得你平時就是做個簡單的 set 和 get。

面試題剖析
redis 主要有以下幾種資料型別:
-
string
-
hash
-
list
-
set
-
sorted set
-
string
這是最簡單的型別,就是普通的 set 和 get,做簡單的 KV 快取。
setcollege szu
hash
這個是類似 map 的一種結構,這個一般就是可以將結構化的資料,比如一個物件(前提是 這個物件沒巢狀其他的物件 )給快取在 redis 裡,然後每次讀寫快取的時候,可以就操作 hash 裡的 某個欄位 。
hset person name bingo hset person age 20 hset person id 1 hget person name person = {"name":"bingo","age":20,"id":1}
list
list 是有序列表,這個可以玩兒出很多花樣。
比如可以通過 list 儲存一些列表型的資料結構,類似粉絲列表、文章的評論列表之類的東西。
比如可以通過 lrange 命令,讀取某個閉區間內的元素,可以基於 list 實現分頁查詢,這個是很棒的一個功能,基於 redis 實現簡單的高效能分頁,可以做類似微博那種下拉不斷分頁的東西,效能高,就一頁一頁走。
'#0'開始位置,-1結束位置,結束位置為-1時,表示列表的最後一個位置,即檢視所有。
lrange mylist 0 -1
比如可以搞個簡單的訊息佇列,從 list 頭懟進去,從 list 尾巴那裡弄出來。
lpush mylist 1 lpush mylist 2 lpush mylist 3 4 5 '#1' rpop mylist
set
set 是無序集合,自動去重。
直接基於 set 將系統裡需要去重的資料扔進去,自動就給去重了,如果你需要對一些資料進行快速的全域性去重,你當然也可以基於 jvm 記憶體裡的 HashSet 進行去重,但是如果你的某個系統部署在多臺機器上呢?得基於 redis 進行全域性的 set 去重。
可以基於 set 玩兒交集、並集、差集的操作,比如交集吧,可以把兩個人的粉絲列表整一個交集,看看倆人的共同好友是誰?對吧。
把兩個大 V 的粉絲都放在兩個 set 中,對兩個 set 做交集。
'#-------操作一個set-------' '#新增元素' sadd mySet 1 '#檢視全部元素' smembers mySet '#判斷是否包含某個值' sismember mySet 3 '#刪除某個/些元素' srem mySet 1srem mySet 2 4 '檢視元素個數' scard mySet '隨機刪除一個元素' spop mySet '#-------操作多個set-------' '#將一個set的元素移動到另外一個' setsmove yourSet mySet 2 '求兩set的交集' sinter yourSet mySet '求兩set的並集' sunion yourSet mySet '#求在yourSet中而不在mySet中的元素' sdiff yourSet mySet
sorted set
sorted set 是排序的 set,去重但可以排序,寫進去的時候給一個分數,自動根據分數排序。
zadd board 85 zhangsan zadd board 72 lisi zadd board 96 wangwu zadd board 63 zhaoliu '#獲取排名前三的使用者(預設是升序,所以需要 rev 改為降序)' zrevrange board 0 3 '#獲取某使用者的排名' zrank board zhaoliu