redis手冊(常用知識總結)
文章目錄
redis介紹
redis安裝
網址
官網:https://redis.io/
下載地址:http://download.redis.io/releases/
安裝
- 準備環境: yum install tcl make gcc
- 第一步:redis的tar包上傳到linux系統
- 第二步:解壓縮redis。tar –xvf xxx.tar.gz,解壓到某處: /usr/local/redis
- 第三步:編譯。直接在redis 目錄下敲make
- 第四步:安裝。make install
啟動
cd ./src
./redis-server …/redis.conf
redis.conf為配置檔案,如果需要啟動多個redis例項,配置多份redis.conf檔案即可
連線
cd ./src
./redis-cli
(啟動的語法 ./redis-cli [-h ip] [-p port] [-a password])
配置檔案
vim /usr/local/redis/redis.conf
#修改如下幾行資訊
bind 0.0.0.0#不限制訪問ip和遠端連線
protected-mode no#保護模式
daemonize yes#後臺執行執行緒
redis服務開機自啟動
啟動指令碼 redis_init_script 位於位於redis的 /utils/ 目錄下。
#大致瀏覽下該啟動指令碼,發現redis習慣性用監聽的埠名作為配置檔案等命名,我們後面也遵循這個約定。
#redis伺服器監聽的埠
REDISPORT=6379
#服務端所處位置,在make install後預設存放與/usr/local/bin/redis-server
,如果未make install則需要修改該路徑,下同。
EXEC=/usr/local/bin/redis-server
#客戶端位置
CLIEXEC=/usr/local/bin/redis-cli
#Redis的PID檔案位置
PIDFILE=/var/run/redis_${REDISPORT}.pid
#配置檔案位置,需要修改
CONF="/etc/redis/${REDISPORT}.conf"
配置環境
1.根據啟動指令碼要求,將修改好的配置檔案以埠為名複製一份到指定目錄。需使用root使用者。
mkdir /etc/redis
cp redis.conf /etc/redis/6379.conf
2.將啟動指令碼複製到/etc/init.d目錄下,本例將啟動指令碼命名為redisd(通常都以d結尾表示是後臺自啟動服務)。
cp redis_init_script /etc/init.d/redisd
3.設定為開機自啟動
在啟動指令碼開頭新增如下兩行註釋以修改其執行級別:
#!/bin/sh
#設定為開機自啟動伺服器
chkconfig redisd on
#開啟服務
service redisd start
#關閉服務
service redisd stop
redis五種資料結構
- string 字串型別
- hash 雜湊型別
- list 列表型別
- set 集合型別
- zset(Sorted Set) 有序集合型別
java操作redis
jedis
spring boot 整合redis
StringRedisTemplate
Spring整合Redis叢集
1.pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
</dependency>
2.application.properties
##伺服器
spring.redis.cluster.nodes=192.168.159.129:7001,192.168.159.129:7002,192.168.159.129:7003,192.168.159.129:7004,192.168.159.129:7005,192.168.159.129:7006
##連線池最大連線數(使用負值表示沒有限制)
spring.redis.pool.max-active=300
##Redis資料庫索引(預設為0)
spring.redis.database=0
##連線池最大阻塞等待時間(使用負值表示沒有限制)
spring.redis.pool.max-wait=-1
##連線池中的最大空閒連線
spring.redis.pool.max-idle=100
##連線池中的最小空閒連線
spring.redis.pool.min-idle=20
##連線超時時間(毫秒)
spring.redis.timeout=60000
RedisTemplate
StringRedisTemplate
redis 主從複製
修改master redis.conf配置檔案
- bind 0.0.0.0 #不限制訪問ip和遠端連線(或者直接註釋掉)
- protected-mode no#保護模式
- requirepass 123456
修改slave redis.conf配置檔案
- slaveof 192.168.98.129(mater的ip) 6379(master port)
- masterauth 123456(master的密碼)
主從複製的過程原理
1.當從庫和主庫建立MS關係後,會向主資料庫傳送SYNC命令
2.主庫接收到SYNC命令後會開始在後臺儲存快照(RDB持久化過程),並將期間接收到的寫命令快取起來
3.當快照完成後,主Redis會將快照檔案和所有快取的寫命令傳送給從Redis
4.從Redis接收到後,會載入快照檔案並且執行收到的快取的命令
5.之後,主Redis每當接收到寫命令時就會將命令傳送從Redis,從而保證資料的一致
redis 哨兵模式 高可用
在Redis的原始碼中包含了一個名為 sentinel.conf 的檔案, 這個檔案就是帶有註釋的Sentinel(哨兵)的配置檔案的示例。
如果想要執行一個“哨兵”程式,需修改以下配置:
# bind 127.0.0.1 192.168.1.1#註釋掉或者值為0.0.0.0
protected-mode no#關閉保護模式
port 26379 #埠號
daemonize yes#後臺執行
dir /usr/local/tmp#解除掛載資訊目錄
sentinel monitor mymaster 192.168.98.129 6379 1#設定 主名稱 ip地址(當前master) 埠號 參與選舉的哨兵數
sentinel down-after-milliseconds mymaster 3000#sentinel心跳檢測主3秒內無響應,視為掛掉,開始切換其他從為主
sentinel parallel-syncs mymaster 1#每次最多可以有1個從同步主。一個從同步結束,另一個從開始同步。
sentinel failover-timeout mymaster 18000#主從切換超時時間
啟動哨兵模式
./redis-server …/sentinel.conf --sentinel &
或者
./redis-sentinel …/sentinel.conf
注意事項
所有的配置檔案裡面都需配置masterauth “123456”(如果有密碼).因為當master掛掉再重啟後就會變成slave,需在從新的master上同步快照資料。
master 掛掉哨兵重新選出master之後,sentinel.conf redis.conf對應的檔案內容都會發生變化
redis持久化
rdb
RDB持久化是指在指定的時間間隔內將記憶體中的資料集快照寫入磁碟。
也是預設的持久化方式,這種方式是就是將記憶體中資料以快照的方式寫入到二進位制檔案中,預設的檔名為dump.rdb。
可以通過配置設定自動做快照持久化的方式。我們可以配置redis在n秒內如果超過m個key被修改就自動做快照,下面是預設的快照儲存配置
save 900 1 #900秒內如果超過1個key被修改,則發起快照儲存
save 300 10 #300秒內容如超過10個key被修改,則發起快照儲存
RDB 的優缺點
優點:
1 適合大規模的資料恢復。
2 如果業務對資料完整性和一致性要求不高,RDB是很好的選擇。
3 rdb在關閉redis時會儲存一會檔案。
缺點:
1 資料的完整性和一致性不高,因為RDB可能在最後一次備份時宕機了。
2 備份時佔用記憶體,因為Redis 在備份時會獨立建立一個子程序,將資料寫入到一個臨時檔案(此時記憶體中的資料是原來的兩倍哦),最後再將臨時檔案替換之前的備份檔案。
所以Redis 的持久化和資料的恢復要選擇在夜深人靜的時候執行是比較合理的。
aof
1 redis 預設關閉,開啟需要手動把no改為yes
appendonly yes
2 指定本地資料庫檔名,預設值為 appendonly.aof
appendfilename “appendonly.aof”
3 指定更新日誌條件
在Redis的配置檔案中存在三種同步方式,它們分別是:
appendfsync always #每次有資料修改發生時都會寫入AOF檔案。
appendfsync everysec #每秒鐘同步一次,該策略為AOF的預設策略。
appendfsync no #從不同步。高效但是資料不會被持久化。
AOF 的優缺點
優點:資料的完整性和一致性更高
缺點:因為AOF記錄的內容多,檔案會越來越大,資料恢復也會越來越慢。
redis事務
public void setString(String key, Object object) {
stringRedisTemplate.setEnableTransactionSupport(true);
// 開啟事務
stringRedisTemplate.multi();
try {
// 如果是String 型別
String value = (String) object;
stringRedisTemplate.opsForValue().set(key, value);
} catch (Exception e) {
// 回滾
stringRedisTemplate.discard();
} finally {
// 提交
stringRedisTemplate.exec();
}
}
redis叢集
redis叢集原理
搭建redis叢集
- 建立目錄
我們計劃叢集中 Redis 節點的埠號為 9001-9006
,埠號即叢集下各例項資料夾。資料存放在 埠號/data
資料夾中。
mkdir /usr/local/redis-cluster
cd redis-cluster/
mkdir -p 9001/data 9002/data 9003/data 9004/data 9005/data 9006/data
- 複製指令碼
在 /usr/local/redis-cluster 下建立 bin 資料夾,用來存放叢集執行指令碼,並把安裝好的 Redis 的 src 路徑下的執行指令碼拷貝過來。看命令:
安裝的redis目錄/usr/local/redis
mkdir redis-cluster/bin
cd /usr/local/redis/src
cp mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server redis-trib.rb /usr/local/redis-cluster/bin
- 複製一個新 Redis 例項
我們現在從已安裝好的 Redis 中複製一個新的例項到 9001 資料夾,並修改 redis.conf 配置
cp -r /usr/local/redis /usr/local/redis-cluster/9001
注意,修改 redis.conf 配置和單點唯一區別是下圖部分,其餘還是常規的這幾項:
port 9001(每個節點的埠號)
daemonize yes
bind 192.168.119.131(綁定當前機器 IP)
dir /usr/local/redis-cluster/9001/data/(資料檔案存放位置)
pidfile /var/run/redis_9001.pid(pid 9001和port要對應)
cluster-enabled yes(啟動叢集模式)
cluster-config-file nodes-9001.conf(9001和port要對應)
cluster-node-timeout 15000
appendonly yes
- 再複製出五個新 Redis 例項
我們已經完成了一個節點了,其實接下來就是機械化的再完成另外五個節點,其實可以這麼做:把 9001 例項 複製到另外五個資料夾中,唯一要修改的就是 redis.conf 中的所有和埠的相關的資訊即可,其實就那麼四個位置。
\cp -rf /usr/local/redis-cluster/9001/* /usr/local/redis-cluster/9002
\cp -rf /usr/local/redis-cluster/9001/* /usr/local/redis-cluster/9003
\cp -rf /usr/local/redis-cluster/9001/* /usr/local/redis-cluster/9004
\cp -rf /usr/local/redis-cluster/9001/* /usr/local/redis-cluster/9005
\cp -rf /usr/local/redis-cluster/9001/* /usr/local/redis-cluster/9006
\cp -rf
命令是不使用別名來複制,因為 cp 其實是別名 cp -i,操作時會有互動式確認
- 修改 9002-9006 的 redis.conf 檔案
其實非常簡單了,你通過搜尋會發現其實只有四個點需要修改,我們全域性替換下吧,進入相應的節點資料夾,做替換就好了。命令非常簡單
vi /usr/local/redis-cluster/9002/redis/etc/redis.conf
vi /usr/local/redis-cluster/9003/redis/etc/redis.conf
vi /usr/local/redis-cluster/9004/redis/etc/redis.conf
vi /usr/local/redis-cluster/9005/redis/etc/redis.conf
vi /usr/local/redis-cluster/9006/redis/etc/redis.conf
:%s/9001/9002
:%s/9001/9003
:%s/9001/9004
:%s/9001/9005
:%s/9001/9006
其實我們也就是替換了下面這四行:
port 9002
dir /usr/local/redis-cluster/9002/data/
cluster-config-file nodes-9002.conf
pidfile /var/run/redis_9002.pid
分別啟動
./bin/redis-server ./9001/redis/etc/redis.conf
./bin/redis-server ./9002/redis/etc/redis.conf
./bin/redis-server ./9003/redis/etc/redis.conf
./bin/redis-server ./9004/redis/etc/redis.conf
./bin/redis-server ./9005/redis/etc/redis.conf
./bin/redis-server ./9006/redis/etc/redis.conf
- 安裝叢集所需軟體
由於 Redis 叢集需要使用 ruby 命令,所以我們需要安裝 ruby 和相關介面。
yum install ruby
yum install rubygems
gem install redis (這步有可能出錯)可以手工上傳安裝 軟體地址https://pan.baidu.com/s/1R0fqmAnTnZEyRIMh7debUA
進入到上傳目錄執行gem install -l redis-3.2.1.gem
- 啟動叢集
/usr/local/redis-cluster/bin/redis-trib.rb create --replicas 1 192.168.212.150:9001 192.168.212.150:9002 192.168.212.150:9003 192.168.212.150:9004 192.168.212.150:9005 192.168.212.150:9006
通過命令,可以詳細的看出叢集資訊和各個節點狀態,主從資訊以及連線數、槽資訊等。這麼看到,我們已經真的把 Redis 叢集搭建部署成功啦!
設定一個 mafly:
你會發現,當我們 set name “123” 時,出現了 Redirected to slot 資訊並自動連線到了9002節點。
redis相關問題
1、主從架構的核心原理
當啟動一個slave node的時候,它會發送一個PSYNC命令給master node
如果這是slave node重新連線master node,那麼master node僅僅會複製給slave部分缺少的資料; 否則如果是slave node第一次連線master node,那麼會觸發一次full resynchronization
開始full resynchronization的時候,master會啟動一個後臺執行緒,開始生成一份RDB快照檔案,同時還會將從客戶端收到的所有寫命令快取在記憶體中。RDB檔案生成完畢之後,master會將這個RDB傳送給slave,slave會先寫入本地磁碟,然後再從本地磁碟載入到記憶體中。然後master會將記憶體中快取的寫命令傳送給slave,slave也會同步這些資料。
slave node如果跟master node有網路故障,斷開了連線,會自動重連。master如果發現有多個slave node都來重新連線,僅僅會啟動一個rdb save操作,用一份資料服務所有slave node。
2、主從複製的斷點續傳
從redis 2.8開始,就支援主從複製的斷點續傳,如果主從複製過程中,網路連線斷掉了,那麼可以接著上次複製的地方,繼續複製下去,而不是從頭開始複製一份
master node會在記憶體中常見一個backlog,master和slave都會儲存一個replica offset還有一個master id,offset就是儲存在backlog中的。如果master和slave網路連線斷掉了,slave會讓master從上次的replica offset開始繼續複製
但是如果沒有找到對應的offset,那麼就會執行一次resynchronization
3、無磁碟化複製
master在記憶體中直接建立rdb,然後傳送給slave,不會在自己本地落地磁碟了
repl-diskless-sync
repl-diskless-sync-delay,等待一定時長再開始複製,因為要等更多slave重新連線過來
4、過期key處理
slave不會過期key,只會等待master過期key。如果master過期了一個key,或者通過LRU淘汰了一個key,那麼會模擬一條del命令傳送給slave。