老套路面試
一、什麼是Redisredis
三、怎麼用Redissql
一、什麼是Redisjson
介紹Redis以前先了解一下Nosql(非關係型數據庫)緩存
咱們都知道MySql是一種關係型數據庫,那什麼是非關係型數據庫呢?它又是作什麼呢?session
爲了解決高併發、高可用、高可擴展,大數據存儲等一系列問題而產生的數據庫解決方案,就是NoSql。它不能替代關係型數據庫,只能做爲關係型數據庫的一個良好補充。數據結構
Redis是使用c語言開發的一個高性能鍵值數據庫。Redis經過鍵值類型存儲數據。多線程
Redis使用場景:緩存(數據查詢、短鏈接、新聞內容、商品內容等等)
(最多使用) 分佈式集羣架構中的session分離
聊天室的在線好友列表
任務隊列
(秒殺、搶購、12306等等) 應用排行榜
網站訪問統計
數據過時處理(能夠精確到毫秒)
二、爲何要用Redis
爲了解決高併發、高可用、高可擴展,大數據存儲等一系列問題,MySql不能很好爲咱們提供服務,引入了Redis。
那麼爲何要用Redis呢?
一、速度快:首先Redis由C語言編寫,純內存操做,第二個 核心是基於非阻塞的IO多路複用機制,單線程避免了多線程的頻繁上下文切換問題
二、支持多種數據類型,5種數據類型:String、Hash、List、Set、Zset(面試時可能會問到),還有其餘數據結構:HyperLogLog、Geo、Pub/Sub
三、支持多種語言,Java/PHP
四、支持持久化存儲,Redis 經過快照方式將數據持久化到磁盤中
三、怎麼用Redis
首先來了解一下Redis5種數據類型:String、Hash、List、Set、Zset
數據類型 | 常規操做 | 應用場景 |
String | 賦值 語法: set key value 取值 語法: get key 刪除 語法:del key23:19:59 數值增減 語法:incr key 遞減數值 語法:decr key |
商品編號、訂單號採用 string 的遞增數字特性生成 自增主鍵 緩存 計數器 共享session |
Hash | 一次獲取一個字段值 語法:hget key field 一次能夠獲取多個字段值 語法:hmget key field [field...] 獲取全部字段值 語法:hgetall key 刪除字段 能夠刪除一個也能夠刪除多個 語法:hdel key field [field...]
|
適合存儲對象 變動數據,修改、讀取用戶屬性 |
List | 向列表左邊增長元素 語法:lpush key value [value...] 向列表右邊增長元素 語法:rpush key value [value...] |
商品評論列表,用戶發佈商品評論,將評論信息轉成json存儲到list中。 用戶在頁面查詢評論列表,從redis中取出json數據展現到頁面。 消息隊列 實現原理:利用list的push操做,將人物存在list中,而後工做線程再用POP操做將任務取出進行執行 |
Set | 增長/刪除元素 語法:sadd key member [member...] 得到集合中的全部元素 語法:smembers key 判斷元素是否在集合中 語法:sismember key member 差集 語法:sdiff key [key...] 交集語法:sinter key [key...] 並集 語法:sunion key [key...] |
標籤 共同好友、二度好友 利用惟一性,能夠統計訪問網站的全部獨立 IP
|
Zset | 增長元素 語法:zadd key score member [score member...] 獲取元素分數 語法:zscore key member 刪除元素 語法:zrem key member [member...] 獲取集合中元素數量 語法:zcard key |
商品銷售排行榜 遊戲的用戶得分排行榜 排行榜 |
四、Redis使用過程當中遇到的問題
一、Redis緩存雪崩:
狀況:Redis緩存雪崩指一段時間內,緩存大面積失效,Redis崩潰,數據請求所有打到MySql上,使MySql崩潰。
舉個例子,雙十一搶購,龐大的數據請求在同一時間對淘寶發起請求,數據請求量超過Redis緩存量,用戶的請求所有打到數據庫上面,數據庫全面崩潰,當數據庫重啓,新的數據又到了,數據庫又崩潰。
那出現這種狀況怎麼解決呢?
解決方案:
批量往redis存數據的時候,把每一個key的失效時間加上個隨機數,這樣的話就能保證數據不會在同一個時間大面積失效。
二、Redis緩存穿透:
狀況:用戶請求一個數據庫和緩存中都不存在的數據。
正常使用緩存的流程是,先對緩存進行查詢,如何緩存中的key值過時或是不存在,再去數據庫進行查詢,並把查詢到的數據放在緩存中,若是查詢的對象爲空,則不放入緩存。
解決方案:
- 在接口層增長校驗,不合法的參數直接返回。不相信任務調用方,根據本身提供的API接口規範來,做爲被調用方,要考慮可能任何的參數傳值。
- 在緩存查不到,DB中也沒有的狀況,能夠將對應的key的value寫爲null,或者其餘特殊值寫入緩存,同時將過時失效時間設置短一點,好比60秒,以避免影響正常狀況。這樣是能夠防止反覆用同一個ID來暴力攻擊。
- 高級用戶布隆過濾器(Bloom Filter),這個也能很好地防止緩存穿透。原理就是利用高效的數據結構和算法快速判斷出你這個Key是否在DB中存在,不存在你return就行了,存在你就去查了DB刷新KV再return。
3、Redis緩存擊穿:
狀況:緩存擊穿,是指一個key很是熱點,在不停的扛着大併發,大併發集中對這一個點進行訪問,當這個key在失效的瞬間,持續的大併發就穿破緩存,直接請求數據庫,就像在一個屏障上鑿開了一個洞。
解決方案:
- 對熱點key,加互斥鎖
- 設置熱點數據永不過時
緩存雪崩、穿透和擊穿,是緩存最大的問題,要麼不出現,一旦出現就是致命性的問題。因此必定要謹慎對待,固然,面試的時候也是常考點。