java分佈式(第四章)——Redis

老套路面試

一、什麼是Redisredis

二、爲何要用Redis算法

三、怎麼用Redissql

四、使用Redis過程當中遇到的問題數據庫


一、什麼是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,加互斥鎖
  •   設置熱點數據永不過時

緩存雪崩、穿透和擊穿,是緩存最大的問題,要麼不出現,一旦出現就是致命性的問題。因此必定要謹慎對待,固然,面試的時候也是常考點。

相關文章
相關標籤/搜索