Redis簡介

2020-08-12 16:14:42

一、Redis簡介

Redis是一款高效能的NOSQL數據庫。

NoSQL最初指不使用SQL標準的數據庫,現在泛指所有的非關係型數據庫。
NoSQL和SQL數據庫是相輔相成,不存在相互替換的可能。

NoSQL數據庫都複合CAP定理。

CAP定理:C(強一致性),A(高可用性),P(高分割區容錯性)只能滿足其二,無法同時滿足!

常見NOSQL數據庫:
		①Redis  :  常見在java應用中。
				特點: Key-value結構儲存
		②Mongodb:   常見在前端或Java應用中。
				特點: 儲存具有自我描述性的數據。
							例如: html,xml,json
					文件型數據庫
		③HBase:   海量數據(百億級)的實時讀寫場景
				特點:  列式儲存
				
		④Neo4J:   圖數據庫。用於圖計算。社羣網站,社交關係等計算。
				特點:  支援圖式儲存和圖式計算

二、Redis特點

	特點: ①短小精悍
				核心程式碼不超過2w行,總版本程式碼不超過5w行。
				效能強勁,每秒百萬級讀寫
				
		   ②伺服器端是單執行緒,多路IO複用
				單執行緒: 伺服器同時只能處理一條命令
				多路IO複用: 

		   ③使用C語言編寫
		   
		   ④在記憶體中工作的數據庫

三、安裝

凡是C語言編寫的軟體,必須先編譯後安裝。

編譯: ①在Makefile檔案所在的目錄,執行make命令
make: 編譯,在編譯c語言寫的軟體時,需要有 gcc-c++庫

			安裝gcc-c++:  yum -y install gcc-c++
			
	 ②cd src ,執行make(編譯) 命令, make install (安裝)
			安裝的檔案存放在 /usr/local/bin中

四、使用

	伺服器端:
			啓動:   redis-server  組態檔
			停止:   ctrl+c : 強行停止
						用戶端  shutdown: 通過用戶端停止
					 
			
	用戶端:  
			使用:  redis-cli  參數  命令
			啓動:  redis-cli  -h  服務的主機名  -p 埠號  
					redis-cli : 預設連localhost:6379
					
			退出:  quit; exit;

五、常用的五大基本數據型別

	數據: key(string)-value[string,hash,list,set,zset(sorted set)]

六、Hash

前端---->{"name":"mike","age":18}---->後臺----->Person p---->Dao(ORM)---->數據庫(Mysql)

數據庫(Redis)--->String---->Person物件序列化---->從redis中get(key)----反序列化---->使用
                         ---->JSON串----->從redis中get(key)---->轉爲Java物件
						 
						 

{"name":"mike","age":18}----->從redis中get(key)---->java物件---->setAge(19)---->JSON----set()

redis提供了hash結構
		{field:value,field:value,field:value}

			hash{"name":"mike","age":18}--->hset(age:19)

七、持久化

Redis在記憶體中工作,可能需要將記憶體的數據持久化到磁碟,保證數據安全。

Redis提供了RDB,AOF持久化
  1. RDB持久化
    RDB: 快照備份。 每間隔一段時間,觸發備份。redis伺服器的主進程使用fork()複製一個和主進程一模一樣
    的子進程(共用所有的資源)。 主進程預設會阻塞,等待子進程將數據全部dump到磁碟。
    持久化結束後,子進程停止,主進程繼續接受請求!

     	  全盤備份。 每次持久化後,新的快照檔案,覆蓋舊的快照檔案。
     	  
     	  缺點: 有可能丟失最後一次持久化後的數據!
     	  
     	  
     工作:  
     		進行備份:    
     					dbfilename :  備份後的檔名,預設dump.rdb
     					dir :  rdb和aof備份檔案的存放目錄
     									預設./ (redis-server命令在哪個目錄啓動)
     									
     		恢復數據:  每次redis服務啓動時,讀取dir/dbfilename,將全部數據一次性讀入到記憶體
     		
     		
     備份的時機:  
     			主動備份: ①執行save/bgsave命令
     			           ②執行shutdown命令
     					   ③執行flushall命令,持久化的數據中沒有key-value
     			
     			自動備份:在redis.conf設定
     								save  <seconds> 且 <changes>
     								seconds: 舉例上次備份的時間
     								changes: 寫運算元
     								
     其他設定:  
    

八、AOF備份

	AOF備份也叫日誌備份。
	
	AOF需要手動開啓。appendonly yes
	
	AOF檔案人類可讀可寫。可以用來做一些致命操作的恢復,例如flushall。
			如果aof檔案損壞,可以使用redis-check-aof --fix 檔案進行自動修復。
	
	如果既有RDB也有AOF,預設採用AOF進行恢復。AOF安全性較高。
	
	備份: 只記錄寫操作到一個日誌檔案中
	
	恢復:  服務啓動時,讀入日誌檔案中所有的寫操作命令,從頭到尾依次執行來重建數據

	相關參數:  appendfilename :  儲存的日誌檔名稱
				dir            :   日誌檔案儲存的目錄
				
	如何備份:   appendfsync   always| everysec(預設) | no
					沒間隔1秒,將緩衝區中的寫操作命令持久化到磁碟。
					最多丟失1秒的數據。
					
	AOF重寫:  在不影響數據的情況下,重寫aof檔案,消除冗餘的寫命令。
					好處: ①節省磁碟空間   ②服務啓動恢復數據時,縮短啓動時間
					
	特點:   ①安全,預設最多隻丟失一秒數據
	         ②aof檔案,人類可操作,避免致命失誤flushall
			 
			 ③aof檔案,比rdb臃腫,佔用磁碟空間大
			 ④恢復時,速度慢

九、事務

	Redis中的事務不同於關係型數據庫中的事務!
	
	Redis中的事務,將多條命令,一起組隊,一起提交,防止多條命令按順序執行時,被其他
	用戶端發送的命令所打斷。
	
	命令:    
		multi  : 開啓一個事務塊
		exec   :提交一個事務塊執行
		discard : 解散一個事務塊

十、鎖

	鎖是爲了解決當多個執行緒同時操作同一資源時,競爭導致的數據錯誤問題!
	
	悲觀鎖:  安全,在多執行緒環境下,效率低!
	樂觀鎖:  在多讀的場景,效率高。
				在多寫的場景,存在資源浪費。
	
	Redis主要作爲快取數據庫。快取主要是讀的場景,redis採用了樂觀鎖的設計。
	
	加鎖: watch  key....
	加鎖需要和事務一起使用!

十一、Lua指令碼

	Lua指令碼和事務類似。Lua指令碼將多條命令,寫入到一個指令碼中。
	提交執行這個指令碼,就可以按順序執行多條命令。
	
	Lua指令碼和事務不同的地方在於命令的原子性。
		在事務中,每條命令是一個原子。
		在Lua指令碼中,整個指令碼是一個原子(命令)
	
	Lua指令碼支援呼叫C/C++程式碼,也支援被C/C++程式碼呼叫。

十二、主從複製

	適用於以下場景:
			①避免單點故障
			②提高併發讀的能力
			
	角色:  master : 主機
			slave  : 從機
			
	設定:  slaveof  主機ip 主機port
			slaveof no one ;解除主從關係
			
	原則:  配從不配主
	
	數據同步原理: 當從機執行slaveof時,向目標主機發送sync命令,請求同步主機所有的數據。
					主機收到命令後,執行一次rdb備份,將備份後的快照檔案發送給從機。
					從機讀取快照檔案,擁有和主機一樣的數據。
					sync命令之後,主機新增的數據,主機會將寫操作命令同步發送給從機,從機執行命令
					保證數據一致。
					
	細節:  ①設定主從後,從機複製主機所有的數據
	        ②主機宕機,從機依然在原地待命
			③從機宕機,從機重新啓動後,依然可以擁有宕機期間主機新增的記錄
			④如果主機向多個從機同步數據壓力過大,可以通過主--從(主)----從模式解決

十三、哨兵模式

	哨兵也是一個服務。哨兵服務主要用來監控主機從機的狀態,當主機宕機時,自動主從切換。
	
	狀態標識:  sdown :  主觀下線,當前哨兵認爲監控的機器已經下線
				odown :  客觀下線,所有哨兵在投票後,一旦sdown滿足投票數,就認爲當前機器已經odown
							在主機標識爲odown後,將執行主從切換
							
							
	主從切換過程:  ①哨兵監控到主機sdwon時,向其他哨兵發送訊息,請求其他哨兵同步當前主機狀態
					②一旦sdown滿足odown,這時,哨兵先執行選舉,選舉哨兵的leader
					③哨兵選舉後,由哨兵的leader提升一個從機爲主機
					④優先考慮slave-priority小的從機,如果優先順序都相同,考慮偏移量大
						否則再考慮pid小的
						將從機提升爲主機
					⑤讓其他存活的從機,從新認新主
					⑥如果之前的主機,重新啓動,需要變更身份,作爲從機,認新主

十四、使用Jedis連線redis

  1. Jedis
  2. JedisPool.getResource()
  3. 哨兵模式,可以建立一個哨兵的連線池
    JedisSetinelPool.getResource()