首先咱們使用一個新的技術,咱們不能爲了用而用,咱們要知道爲何用?php
一、爲何要使用緩存?mysql
高性能:redis
一個用戶A發起請求,經過ServiceA請求數據庫來獲取數據,可是數據庫的性能相比Redis的速度要慢不少,響應時間比較長,這時又有一個用戶B發起一個請求,和用戶A要的是同一個數據,那麼正常狀況下咱們又要去查詢一遍數據庫,而後再返回給用戶,那麼咱們想想,若是有不少用戶都要去查詢這一條數據,都去數據庫查,響應都很慢,那麼就下降了用戶體驗。sql
加入Redis緩存後,咱們將用戶A查詢都數據放到Redis緩存中,那麼接下來到用戶再去查詢這條數據到時候直接先查Redis緩存中是否存在這條數據,那麼咱們直接就返回給用戶就能夠了,不須要再去查數據庫了,Redis響應速度極快這樣就提升了用戶體驗感。數據庫
高併發:緩存
mysql數據庫對高併發支撐並非很高,加入Redis後,Redis是基於內存對,內存對讀寫速度很快,redis使用是多路複用技術,能夠處理併發鏈接,redis是單線程的,能夠省去不少上下文切換的時間;微信
二、Redis的線程模型是什麼?數據結構
當客戶端1請求鏈接redis進程的時候,會在redis進程內部創建一個server socket 並註冊一個事件,redis進程中的io多路複用程序會將這個它壓入隊列中,而後交給文件事件分派器,分派器會交給鏈接應答處理器,當客戶端要進行set key value操做的時候,一樣會產生一個socket 註冊一個命令請求事件,由io多路複用程序壓入隊列,文件事件分派器會交給處理器進程內存中key和value的設置。 併發
三、Redis的數據結構及其做用dom
String:普通的get和set,簡單的kv緩存
hash:相似有map的一種結構,這個通常就是存儲對象
list:list格式放入緩存中
set:無序集合,自動去重
sorted set:去重能夠排序
五、Redis的過時策略有哪些?內存淘汰機制有哪些?
過時策略:按期刪除+惰性刪除
按期刪除:是指Redis會每隔100ms會隨機抽取一些設置了過時時間的key進行掃描,看是否已通過期,若是已經到達過時時間就進行刪除
惰性刪除:是指由於Redis的按期刪除是進行隨機抽取的一些設置了過時時間的key進行刪除,不免會漏掉一些已通過期可是沒有被按期刪除掃描到的key,那麼這些key在你去獲取它的value的時候,redis就會發現這個key已通過期了,就不會給你返回任何結果,並將這個key給刪除。
淘汰機制:
noeviction:當內存不足以容納新寫入數據時,新寫入操做會報錯,這個通常沒人用吧
allkeys-lru:當內存不足以容納新寫入數據時,在鍵空間中,移除最近最少使用的key(這個是最經常使用的)
allkeys-random:當內存不足以容納新寫入數據時,在鍵空間中,隨機移除某個key,這個通常沒人用吧
volatile-lru:當內存不足以容納新寫入數據時,在設置了過時時間的鍵空間中,移除最近最少使用的key(這個通常不太合適)
volatile-random:當內存不足以容納新寫入數據時,在設置了過時時間的鍵空間中,隨機移除某個key
volatile-ttl:當內存不足以容納新寫入數據時,在設置了過時時間的鍵空間中,有更早過時時間的key優先移除
_分享至 :_[](http://bbs.itheima.com/# "分享到新浪微博")[](http://bbs.itheima.com/# "分享到微信")QQ空間[](http://bbs.itheima.com/#)