Redis的面試連環炮
- 在項目中緩存是如何使用的?緩存如果使用不當會造成什麼後果?
- Redis 和 Memcached 有什麼區別?Redis 的線程模型是什麼?爲什麼單線程的 Redis 比多線程的 Memcached 效率要高得多?
- Redis 都有哪些數據類型?分別在哪些場景下使用比較合適?
- Redis 的過期策略都有哪些?手寫一下 LRU 代碼實現?
- 如何保證 Redis 高併發、高可用?Redis 的主從複製原理能介紹一下麼?Redis 的哨兵原理能介紹一下麼?
- Redis 的持久化有哪幾種方式?不同的持久化機制都有什麼優缺點?持久化機制具體底層是如何實現的?
- Redis 集羣模式的工作原理能說一下麼?在集羣模式下,Redis 的 key 是如何尋址的?分佈式尋址都有哪些算法?瞭解一致性 hash 算法嗎?如何動態增加和刪除一個節點?
- 瞭解什麼是 redis 的雪崩、穿透和擊穿?Redis 崩潰之後會怎麼樣?系統該如何應對這種情況?如何處理 Redis 的穿透?
- 如何保證緩存與數據庫的雙寫一致性?
- Redis 的併發競爭問題是什麼?如何解決這個問題?瞭解 Redis 事務的 CAS 方案嗎?
- 生產環境中的 Redis 是怎麼部署的?
面試題
redis 都有哪些數據類型?分別在哪些場景下使用比較合適?
面試官心理分析
除非是面試官感覺看你簡歷,是工作 3 年以內的比較初級的同學,可能對技術沒有很深入的研究,面試官纔會問這類問題。否則,在寶貴的面試時間裏,面試官實在不想多問。
其實問這個問題,主要有兩個原因:
- 看看你到底有沒有全面的瞭解 redis 有哪些功能,一般怎麼來用,啥場景用什麼,就怕你別就會最簡單的 KV 操作;
- 看看你在實際項目裏都怎麼玩兒過 redis。
要是你回答的不好,沒說出幾種數據類型,也沒說什麼場景,你完了,面試官對你印象肯定不好,覺得你平時就是做個簡單的 set 和 get。
面試題剖析
redis 主要有以下幾種數據類型:
- string
- hash
- list
- set
- sorted set
string
這是最簡單的類型,就是普通的 set 和 get,做簡單的 KV 緩存。
set college 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 1
srem mySet 2 4
# 查看元素個數
scard mySet
# 隨機刪除一個元素
spop mySet
#-------操作多個set-------
# 將一個set的元素移動到另外一個set
smove 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