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提交事務