Redis詳解
- redis安裝 1.1 redis叢集搭建 1.2 redis.conf配置檔案說明 1.3 redis持久化
- jedisapi
1 redis安裝
redis 主要分單節點、主從、哨兵、叢集,本篇文章主要將叢集搭建
1.1 叢集搭建:
(1)、下載redis安裝包
cd /home/gz/software/ //安裝目錄
tar -zxvf /redis-3.2.8.tar.gz -C redis //解壓
(2)、編譯安裝
cd redis-3.2.8
make && make install //編譯安裝
(3)、建立redis節點
cd /home/gz/software/redis/redis-cluster
mkdir 7000 7001 7002 7003 7004 7005 //建立資料夾
cp /home/gz/software/redis/redis-3.2.1/redis.conf …/redis_cluster/700*/ //拷貝redis.conf到700*目錄下
(4)、修改700*下的每個redis.conf配置檔案
dir /home/gz/software/redis/redis-cluster/700* appendonly yes logfile /home/gz/software/redis/redis-cluster/700*/redis-700*.log bind (本機ip) daemonize yes //redis後臺執行 pidfile /var/run/redis_700*.pid //pidfile檔案對應7000,7002,7003 port 700* //埠 cluster-enabled yes //開啟叢集 把註釋#去掉 cluster-config-file nodes_700*.conf //叢集的配置 配置檔案首次啟動自動生成 7000,7001,7002 cluster-node-timeout 5000 //請求超時 設定5秒夠了 appendonly yes //aof日誌開啟 有需要就開啟,它會每次寫操作都記錄一條日誌
(5)、啟動所有的redis
cd /home/gz/software/redis/redis-cluster
/home/gz/software/redis/redis-3.2.8/src/redis-server 700*/redis.conf
6、檢視服務
ps -ef | grep redis #檢視是否啟動成功
netstat -tnlp | grep redis #可以看到redis監聽埠
(7)、安裝叢集
apt-get install ruby ruby-devel rubygems //安裝ruby
gem install redis //再用 gem 這個命令來安裝 redis介面 gem是ruby的一個工具包.
cd /home/gz/software/redis/redis-3.2.8/src
./redis-trib.rb create --replicas 1 192.168.75.138:7000 192.168.75.138:7001 192.168.75.138:7002 192.168.75.138:7003 192.168.75.138:7004 192.168.75.138:7005
注:如果安裝發現 gem install redis ERROR: Error installing redis: redis requires Ruby version >= 2.2.2.異常 解決方案:redis requires ruby version 2.2.2的解決方案
(8)、客戶端連線
cd /home/gz/software/redis/redis-3.2.8/src
./redis-cli -c -h 192.168.75.138 -p 700*
cluster nodes //檢視是否是叢集
(9)、關閉客戶端
cd /home/gz/software/redis/redis-3.2.8/src
./redis-cli -c -h 192.168.75.138 -p 700* shutdown
1.2 redis.conf配置檔案說明
(1). daemonize no 預設情況下,redis不是在後臺執行的,如果需要在後臺執行,把該項的值更改為yes
//daemonize yes
(2)、當Redis以守護程序方式執行時,Redis預設會把pid寫入/var/run/redis.pid檔案,可以通過pidfile指定
//pidfile /var/run/redis.pid
(3)、指定redis執行的埠,預設是6379
//port 6379
(4)、指定redis只接收來自於該IP地址的請求,如果不進行設定,那麼將處理所有請求,在生產環境中最好設定該項
//bind 127.0.0.1
(5)、工作目錄,資料庫映象備份的檔案放置的路徑。這裡的路徑跟檔名要分開配置是因為redis在進行備份時,先會將當前資料庫的狀態寫入到一個臨時檔案中,等備份完成時,
再把該該臨時檔案替換為上面所指定的檔案,而這裡的臨時檔案和上面所配置的備份檔案都會放在這個指定的路徑當中。AOF檔案也會存放在這個目錄下面注意這裡必須制定一個目錄而不是檔案
//dir ./
############################## 日誌 ###############################
(6)、指定日誌記錄級別
Redis總共支援四個級別:debug、verbose、notice、warning,預設為verbose
debug 記錄很多資訊,用於開發和測試
varbose 有用的資訊,不像debug會記錄那麼多
notice 普通的verbose,常用於生產環境
warning 只有非常重要或者嚴重的資訊會記錄到日誌
//loglevel debug
(7)、配置log檔案地址
//logfile /var/log/redis/redis.log
############################## rdb(快照) ###############################
(8)、本地持久化資料庫檔名,預設值為dump.rdb
//dbfilename dump.rdb
############################## 主從 ###############################
(9)、主從複製. 設定該資料庫為其他資料庫的從資料庫。設定當本機為slav服務時,設定master服務的IP地址及埠,在Redis啟動時,它會自動從master進行資料同步
slaveof
(10)、當master服務設定了密碼保護時(用requirepass制定的密碼)slav服務連線master的密碼
masterauth
############################## AOF ###############################
(11)、是否開啟aof
//appendonly no
(12)、AOF檔名稱 (預設: “appendonly.aof”)
//appendfilename appendonly.aof
(13)、Redis支援三種同步AOF檔案的策略
//appendfsync always
//appendfsync everysec
//appendfsync no
############################## cluster(叢集) ###############################
(14)、開啟叢集 把註釋#去掉
//cluster-enabled yes
(15)、叢集的配置
//cluster-config-file nodes_7000.conf
(16)、請求超時
//cluster-node-timeout 5000
1.3 redis持久化
redis是一個持久化的記憶體資料庫,也就是說redis需要經常將記憶體中的資料同步
到硬碟上保證持久化。
redis持久化兩種方式:
- snapshotting(快照)預設方式,將記憶體中以快照方式寫入到二進位制中,預設
為dump.rdb,可以通過配置設定自動做快照持久化的方式。我們可以配置redis在n
秒內如果超過m個key則修改就自動做快照。
snapshotting設定:
save 900 1 #900秒內如果超過1個key被修改則發起快照儲存
save 300 10 #300秒內超過10個key被修改,則發起快照儲存
注:如果對資料的完整性要求不太高,可以用,比如評論,
- append-only file(縮寫aof)的方式(有點類似oracle日誌)由於快照方式在
一定時間間隔做一次,所以可能發生redis意外down的情況會資料丟失最後一次快照後的所有修改的資料、
aof比快照方式更好的持久化性,是由於在使用aof時,redis會將每一個用到的寫命令都通過write函式追加
到命令中。當redis重新啟動時會重新執行檔案中儲存的寫命令在記憶體中重建這個資料庫內容,這個檔案在bin目錄下:
appendonly.aof:aof不是立即寫到硬碟上,可能通過配置檔案修改強制寫到硬碟中。
aof設定:
appendonly yes //啟動aof持久化方式有三種修改方式
appendfsync always //收到寫命令就立即寫到磁碟,效率最慢,但保證完全的持久化
appendfsync everysec //每秒鐘寫入磁碟一次,在效能和持久化方面做了最好的折中
appendfsync no //完全依賴作業系統 新能最好,持久化沒有保證
2 jedisapi
1、單機模式
通過 Jedis實現
2、分片模式
通過分片池ShardedJedisPool 實現
3、叢集模式
通過JedisCluster實現
(1). 單機模式
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.75.138", 7004);
jedis.set("gz20180226", "gz20180226");
jedis.disconnect();
}
(2). 分片模式
(2.1). 分片模式直連方式
public void jedisShardNormal() {
List<JedisShardInfo> shards = Arrays.asList(
new JedisShardInfo("localhost",6379),
new JedisShardInfo("localhost",6380));
ShardedJedis sharding = new ShardedJedis(shards);
long start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
String result = sharding.set("sn" + i, "n" + i);
}
long end = System.currentTimeMillis();
System.out.println("[email protected] SET: " + ((end - start)/1000.0) + " seconds");
sharding.disconnect();
}
(2.2). 分片模式連線池方式
public void jedisShardSimplePool() {
List<JedisShardInfo> shards = Arrays.asList(
new JedisShardInfo("localhost",6379),
new JedisShardInfo("localhost",6380));
ShardedJedisPool pool = new ShardedJedisPool(new JedisPoolConfig(), shards);
ShardedJedis one = pool.getResource();
long start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
String result = one.set("spn" + i, "n" + i);
}
long end = System.currentTimeMillis();
pool.returnResource(one);
System.out.println("[email protected] SET: " + ((end - start)/1000.0) + " seconds");
pool.destroy();
}
注:
(1). 事務和管道都是非同步的,個人感覺,在管道中再進行事務呼叫,沒有必要,不如直接進行事務模式。
(2). 分散式呼叫中不支援事務。因為事務是在伺服器端實現,而在分散式中,每批次的呼叫物件都可能訪問不同的機器,所以,沒法進行事務。