Redis理解和使用

摘抄並用於自查筆記redis

1. Redis簡介算法

  咱們平常Java Web開發,通常使用數據庫進行存儲,在數據量較大的狀況下,單一使用數據庫保存數據的系統會由於面向磁盤,磁盤讀寫速度比較慢而存在嚴重的性能弊端,一瞬間成千上萬的請求到來,須要系統在極短期內完成千萬次的讀寫操做,這個時候數據庫承受不了,易形成數據庫癱瘓。爲克服此類問題,Java Web項目一般引入Nosql技術,這是一種基於內存的數據庫,而且提供必定的持久化功能。sql

  Redis是一個key-value存儲系統,可支持五種數據類型:字符串、哈希、鏈表、集合和有序集合。其性能十分優越,可支持每秒十幾萬次的讀寫操做,性能遠超數據庫,且支持集羣,分佈式,主從同步等配置,原則上能夠無限擴展,讓更多人數據存儲在內存中,支持必定的事務能力,保證高併發下數據的安全和一致性。數據庫

 

2. Redis在Java Web中的應用緩存

  Redis在Java Web主要有兩個應用場景:安全

  1)存儲緩存用的數據服務器

  2)須要高速讀寫的場合使用他快速讀寫併發

  

  緩存app

  根據業務需求,在Redis中存儲一些經常使用和主要的數據,通常從如下幾個方面考慮:分佈式

  業務數據經常使用嗎?若是是命中率低,沒有必要寫入緩存。

  命中率如何?若是命中率低,就沒有必要寫入緩存。

  讀操做多仍是寫操做多?若是寫操做多,頻繁寫入數據庫,也沒有必要使用緩存。

  業務數據大小如何?若是要存儲幾百M字節的文件,會給緩存帶來很大壓力,這樣也不必。

 

  高速讀寫的場合

  在高併發的狀況下,例如搶演唱會門票,僅用數據庫會比較慢或數據庫癱瘓,因此須要使用Redis來應對這樣的高併發需求的場合。

  i)當一個請求到達服務器時,只是把業務數據在Redis上進行讀寫,而沒有對數據進行任何的操做,這樣就能大大提升讀寫速度,從而知足高速響應的需求

  ii)可是這些緩存的數據仍須要持久化,也就是存入數據庫之中,因此在一個請求操做完Redis的讀寫後,會去判斷該高速讀寫的業務是否結束,這個判斷若是是成功了,則觸發事件將Redis緩存的數據以批量的形式一次性寫入數據庫,從而完成持久化的工做。

 

3. Redis經常使用數據類型操做和其餘操做

  1)String

  String是redis最基本的數據類型。String類型是二進制安全的,意思是,redis的String能夠包含任何數據,好比,jpg或者序列化的對象,其最大能存儲512MB

 

  2)Hash(哈希)

  Redis Hash是一個鍵值對集合。hash特別適合用於存儲對象。

  HMSET runoob field1 "Hello" field2 "World"

  HGET runoob field1

  HGET runoob field2

 

  3) List(列表)

  Redis列表是簡單的字符串列表,按照插入順序排序。能夠添加一個元素到列表的頭部或者尾部。

 

  4)Set(集合)

  Redis的Set是String類型的無需集合,集合是經過哈希表實現的,因此添加、刪除、查找的複雜度都是o(1)

 

  5)zset(sorted set:有序集合)

  zset和set同樣是String類型元素的集合,且不容許出現重複的成員。不一樣的是每一個元素都會關聯一個double類型的分數。redis正是經過分數來爲集合中的成員進行從小到大的排序,zset的成員是惟一的,但分數倒是能夠重複的。

 

  6)Redis HyperLogLog

  Redis HyperLogLog是用來作基數統計的算法,HyperLogLog的優勢是在輸入元素的數量或者體積很是很是大時,計算基數所需的空間老是固定的,且是很小。

 

  7)Redis 發佈訂閱

  Redis發佈訂閱是一種消息通訊模式。

 

  8)Redis事務

  MULTI, EXEC, DISCARD和WATCH命令是Redis事務操做的基礎。他們可讓Redis在一個步驟裏面執行一組命令,且能作到以下2個保證:

  i)事務中全部的命令都是序列化且都是按順序執行的,在一個客戶端執行Redis事務的過程當中,不會接收其餘任何客戶端對他發出的請求。這保證了這些命令是做爲一個單獨的獨立操做執行的。

  ii)全部的命令要麼都被一塊兒處理,要麼所有都沒有被處理,因此Redis事務是原子的。EXEC會命令觸發事務中全部命令的執行。

 

  使用MULTI命令進入事務模式,這個命令只會返回OK,這個時候,用戶發出多個要執行的命令,Redis暫時不會執行這些命令,二十把他們放進隊列,當EXEC被調用時,全部的命令纔會被一次性執行。

  在其中可能會有2種錯誤:

  i)命令可能排隊失敗。如,命令的語法可能錯誤,或者重要的環境問題,內存不足。

  ii)EXEC調用後,一些命令可能執行失敗,如,在一個字符串上進行列表命令的操做。

  第一種錯誤,發生在EXEC命令前,能夠經過檢查命令的返回值,QUEUED,redis對於在排隊期間發生的錯誤,會拒絕執行EXEC,並放棄這個事務。

  執行EXEC後,全部的命令都會被執行,甚至是錯誤的命令。就算其中有失敗的命令,隊列中的其餘命令也會被執行。

 

  爲何Redis不支持回滾

  EXEC命令調用後的錯誤(這個問題在命令隊列時沒法檢測到),Redis命令執行失敗,都是程序性錯誤,這類錯誤在開發過程當中就可以發現並解決,幾乎不會出如今生產環境。

  因爲不須要回滾,這使得redis內部更加簡單,並且運行速度更快

 

  樂觀鎖(check-and-set)

  WATCH命令爲事務提供一個check-and-set(CAS)行爲。

  WATCH命令能夠用來監聽事務中的隊列的命令,在EXEC以前,一旦發現有參數是被修改了的,那麼整個事務就會終止,EXEC返回一個NULL,提示用戶事務失敗了。這種形式的鎖稱爲樂觀鎖,是一種很是強大的鎖。

  WATCH命令使得EXEC命令的執行必須知足一個條件:若是被WATCH的keys沒有一個被更改,則執行事務;否則就不執行這個事務。

  WATCH能夠被屢次調用,全部的WATCH調用都會在EXEC調用以前起做用,WATCH能夠接收任意多的key。

  當EXEC被調用後,全部的keys都將UNWATCH,無論這個事務會不會終止。一樣,當一個客戶端連接關閉後,一切都將UNWATCH。

  能夠用UNWATCH命令來刷新全部被WATCH的keys。

  這個經常使用於高併發的狀況,例如,搶紅包或者商品。

 

  9)Redis持久化

  Redis支持RDB和AOF兩種持久化機制。持久化能有效避免因進程退出形成的數據丟失問題,下一次重啓時,利用以前持久化的文件,便可實現數據恢復。

  1. RDB:這種是把當前進程數據生成快照保存到硬盤的過程,觸發RDB持久化過程分爲手動觸發和自動觸發。

  手動觸發:save和bgsave。save命令阻塞當前Redis服務(主進程),bgsave命令Redis進程執行fork操做建立子進程,RDB持久化過程由子進程負責,完成後自動結束,阻塞只發生在fork階段,時間短。(fork解釋 : 一個進程,包括代碼、數據和分配給進程的資源。fork()函數經過系統調用建立一個與原來進程幾乎徹底相同的進程,也就是兩個進程能夠作徹底相同的事,但若是初始參數或者傳入的變量不一樣,兩個進程也能夠作不一樣的事。 一個進程調用fork()函數後,系統先給新的進程分配資源,例如存儲數據和代碼的空間。而後把原來的進程的全部值都複製到新的新進程中,只有少數值與原來的進程的值不一樣。至關於克隆了一個本身。)

  自動觸發:有如下幾種場景會觸發

  a)使用save相關配置,如 save m n , 表示m秒內數據集存在n次修改時,自動觸發bgsave

  b)若是從節點執行全量複製操做,主節點自動執行bgsave生成RDB文件併發送給從節點。

  c)執行debug reload命令從新加載Redis時,也會自動觸發save操做。

  d)默認狀況下執行shutdown命令時,若是沒有開啓AOF持久化功能則自動執行bgsave

  

  保存:RDB文件保存在dir配置指定的目錄下,文件名經過dbfilename配置指定。

  優勢:很是適用備份,全量賦值等場景,恢復數據遠快於AOF方法。

  缺點:沒有辦法作到實時持久化/秒級持久化。其文件格式存在多版本格式不兼容狀況。

 

  2. AOF

  開啓AOF功能須要設置配置:appendonly yes。默認不開啓。文件名經過appendfilename配置,默認appendonly.aof。

  a)全部寫入命令會追加到aof_buf(緩衝區)中。

  b)AOF緩衝區根據對應的策略向硬盤作同步操做

  c)隨着AOF文件愈來愈大,須要定去對AOF文件進行重寫,達到壓縮目的

  d)當Redis服務器重啓時,能夠加載AOF文件進行數據恢復

 

  10)管道技術

  Redis是一種基於客戶端-服務端模型以及請求/響應協議的TCP服務。這意味着一般狀況下一個請求會遵循如下步驟:

  客戶端向服務端發送一個查詢請求,並監聽Socket返回,一般是以阻塞模式,等待服務器端響應,服務端處理命令,並將結果返回客戶單。

  可是Redis管道技術能夠在服務端未響應時,客戶端能夠繼續向服務端發送請求,並最終一次讀取全部服務端的響應。

  管道技術最顯著的優點是提升了redis服務的性能。開啓管道操做後,往返延時被改善的至關低。

相關文章
相關標籤/搜索