1. 程式人生 > >20181021 Spring使用Redis資料庫

20181021 Spring使用Redis資料庫

一、linux下redius的安裝
1.下載https://redis.io/download
2.redis圖形化工具redisClient
3.將下載的包上傳到linux上
4.解壓 : tar -zxvf redis檔名.tar.gz
5.進入解壓後的目錄,執行 make 命令
①若報make[1]: *** [adlist.o] 錯誤 127,按順序逐個執行以下命令:(ps:Redis是C實現的,需要gcc來進行編譯,所以原因是系統未安裝gcc.)
(可選)
yum install cpp
yum install binutils
yum install glibc
yum install glibc-kernheaders
yum install glibc-common
yum install glibc-devel
yum install gcc
yum install make
②若報“在包含自 adlist.c:34 的檔案中:
zmalloc.h:50:31: 錯誤:jemalloc/jemalloc.h:沒有那個檔案或目錄”,
執行以下命令:make MALLOC=libc
6.進入src目錄,執行make install
7.啟動在bin資料夾中 執行./redis-server
8.若遠端連線報錯,修改redis.conf檔案,將bind 127.0.0.1註釋掉,將"protected-mode yes" 改為 “protected-mode no” ,通過./redis-server redis.conf啟動
9.redis預設為前臺啟動,當啟動後會佔用linux前臺程序導致無法linux進行其他操作,通過修改redis.conf的"daemonize no" 改為 “daemonize yes”.

二、redis的五種資料型別,String,list,set,zset,hash

三、整合
1.導包

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>

2.操作示例

import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

@Service
public class RedisService {
	@Autowired
	private StringRedisTemplate stringRedisTemplate;// 操作redis的類,springboot以整合,注入即可

	public void setString(String key, String value) {
		setObject(key, value, null);
	}
	
	public void setString(String key, String value, Long time) {
		setObject(key, value, time);
	}

	public void setList(String key, List<String> value, Long time) {
		setObject(key, value, time);
	}

	public void setMap(String key, Map<String, String> map, Long time) {
		setObject(key, map, time);
	}

	public void setObject(String key, Object value, Long time) {
		if (StringUtils.isEmpty(key) || value == null) {
			return;
		}

		// 存放的String型別
		if (value instanceof String) {
			String str = (String) value;
			if (time != null) {
				stringRedisTemplate.opsForValue().set(key, str, time, TimeUnit.SECONDS);
			} else {
				stringRedisTemplate.opsForValue().set(key, str);
			}
			return;
		}

		// 存放list
		if (value instanceof List) {
			List<String> list = (List<String>) value;
			for (int i = 0; i < list.size(); i++) {
				stringRedisTemplate.opsForList().leftPush(key, list.get(i));
			}
			return;
		}

		// 存放Hash
		if (value instanceof Map) {
			Map<String, String> map = (Map<String, String>) value;
			stringRedisTemplate.opsForHash().putAll(key, map);
			return;
		}
	}
}

4.主從複製
①哨兵機制:選舉leader
②keepalived監聽,自動重啟。重啟失敗發郵件
③主從複製,在從伺服器的redis上配置redis.conf檔案 “slaveof 主伺服器id 主伺服器埠號”,若主伺服器有密碼 配置“masterauth ”;
④主從複製,進入主伺服器客戶端"./redis-cli -h 127.0.0.1 -p 6379" ,輸入"info",可以看到從伺服器資訊。
⑤主從複製,從redis預設只讀。

5.哨兵機制
5.1 但當前的主伺服器宕機,選舉叢集中的主伺服器。
5.2
在redis解壓目錄中配置sentinel.conf檔案,埠號預設為26379

sentinel monitor mymaster 127.0.0.1 6379 2   //配置主伺服器ip埠號
解釋:這一行代表sentinel(哨兵)監控的master的名字叫做mymaster,地址為127.0.0.1:6379,行尾最後的一個2代表什麼意思呢?我們知道,網路是不可靠的,有時候一個sentinel會因為網路堵塞而誤以為一個master redis已經死掉了,當sentinel叢集式,解決這個問題的方法就變得很簡單,只需要多個sentinel互相溝通來確認某個master是否真的死了,這個2代表,當叢集中有2個sentinel認為master死了時,才能真正認為該master已經不可用了。(sentinel叢集中各個sentinel也有互相通訊,通過gossip協議)。
sentinel auth-pass <master-name> <password> //配置主伺服器密碼
sentinel down-after-milliseconds <master-name> <milliseconds>//配置心跳檢測時間
sentinel會向master傳送心跳PING來確認master是否存活,如果master在“一定時間範圍”內不迴應PONG 或者是回覆了一個錯誤訊息,那麼這個sentinel會主觀地(單方面地)認為這個master已經不可用了(subjectively down, 也簡稱為SDOWN)。而這個down-after-milliseconds就是用來指定這個“一定時間範圍”的,單位是毫秒。

5.3啟動哨兵 ./redis-server sentinel.conf --sentinel &

6.redis的持久化
6.1將記憶體資料儲存到硬碟上
6.2 持久化方式
6.2.1 RBD持久化:RDB 是以二進位制檔案,是在某個時間 點將資料寫入一個臨時檔案,持久化結束後,用這個臨時檔案替換上次持久化的檔案,達到資料恢復。
優點:使用單獨子程序來進行持久化,主程序不會進行任何 IO 操作,保證了 redis 的高效能
缺點:RDB 是間隔一段時間進行持久化,如果持久化之間 redis 發生故障,會發生資料丟失。所以這種方式更適合資料要求不嚴謹的時候
6.2.2 ROF持久化:
Append-only file,將“操作 + 資料”以格式化指令的方式追加到操作日誌檔案的尾部,在 append 操作返回後(已經寫入到檔案或者即將寫入),才進行實際的資料變更,“日誌檔案”儲存了歷史所有的操作過程;當 server 需要資料恢復時,可以直接 replay 此日誌檔案,即可還原所有的操作過程。AOF 相對可靠,它和 mysql 中 bin.log、apache.log、zookeeper 中 txn-log 簡直異曲同工。AOF 檔案內容是字串,非常容易閱讀和解析。
優點:可以保持更高的資料完整性,如果設定追加 file 的時間是 1s,如果 redis 發生故障,最多會丟失 1s 的資料;且如果日誌寫入不完整支援 redis-check-aof 來進行日誌修復;AOF 檔案沒被 rewrite 之前(檔案過大時會對命令進行合併重寫),可以刪除其中的某些命令(比如誤操作的 flushall)。
缺點:AOF 檔案比 RDB 檔案大,且恢復速度慢。

6.3 Redis 預設使用RDB持久化方式。儲存的檔名可在redis.conf中的dbfilename “dump.rdb” 中配置。通過在redis.conf配置檔案中配置save來配置持久化策略#save時間,ps:(以下分別表示更改了1個key時間隔900s進行持久化儲存;更改了10個key300s進行儲存;更改10000個key60s進行儲存。
save 900 1
save 300 10
save 60 10000 )

6.4AOF進行持久化

##此選項為aof功能的開關,預設為“no”,可以通過“yes”來開啟aof功能  
##只有在“yes”下,aof重寫/檔案同步等特性才會生效  
appendonly yes  

##指定aof檔名稱  
appendfilename appendonly.aof  

##指定aof操作中檔案同步策略,有三個合法值:always everysec no,預設為everysec  
appendfsync everysec  
##在aof-rewrite期間,appendfsync是否暫緩檔案同步,"no"表示“不暫緩”,“yes”表示“暫緩”,預設為“no”  
no-appendfsync-on-rewrite no  

##aof檔案rewrite觸發的最小檔案尺寸(mb,gb),只有大於此aof檔案大於此尺寸是才會觸發rewrite,預設“64mb”,建議“512mb”  
auto-aof-rewrite-min-size 64mb  

##相對於“上一次”rewrite,本次rewrite觸發時aof檔案應該增長的百分比。  
##每一次rewrite之後,redis都會記錄下此時“新aof”檔案的大小(例如A),那麼當aof檔案增長到A*(1 + p)之後  
##觸發下一次rewrite,每一次aof記錄的新增,都會檢測當前aof檔案的尺寸。  
auto-aof-rewrite-percentage 100  

6.5redis事務
mulit開啟事務,exec提交事務