[NoSQL]-Redis


第1章 關系型與非關系型

關系型: mysql oracle
非關系型: mongo redis ES

第2章 redis重要特性

1.速度快
Redis 所有的數據都存放在內存中
Redis 使用c語言實現
Redis 使用單線程架構

2.基於鍵值對的數據結構服務器
5種數據結構:字符串,哈希,列表,集合,有序集合,地理位置

3.豐富的功能
提供了鍵過期功能,可以實現緩存
提供了發布訂閱功能,可以實現消息系統
提供了pipeline功能,客戶端可以將一批命令一次性傳到 Redis,減少了網絡開銷

4.簡單穩定
源碼很少,3.0版本以后5萬行左右
使用單線程模型法,是的Redis服務端處理模型變得簡單
不依賴操作系統的中的類庫

5.客戶端語言多
java,PHP,python,C,C++,Nodejs等

6.數據持久化
把所有的數據都存在內存中
RDB和AOF

7.主從復制
8.高可用和分布式
哨兵 redis-sentinel
集群 redis-cluster 

第3章 redis應用場景

1.緩存-鍵過期時間
	緩存session會話
	緩存用戶信息,找不到再去mysql查,查到然后回寫到redis
	商城優惠卷過期時間
	
2.排行榜-列表&有序集合
	熱度排名排行榜
	發布時間排行榜
	
3.計數器應用-天然支持計數器
	帖子瀏覽數
	視頻播放次數
	商品瀏覽數
	點贊/點踩
	
4.社交網絡-集合
	踩/贊,粉絲,共同好友/喜好,推送,打標簽
	
5.消息隊列系統-發布訂閱
	配合elk實現日志收集

第4章 redis安裝部署

1.目錄規划

/data/soft/							#redis下載目錄
/opt/redis_{PORT}/{conf,logs,pid}	#redis安裝目錄
/data/redis_{PORT}/redis_{PORT}.rdb	#redis數據目錄
/root/scripts/redis_shell.sh		#redis運維腳本

2.安裝命令

編輯hosts文件

[root@db01 ~]# tail -3 /etc/hosts
10.0.0.51 db01    
10.0.0.52 db02    
10.0.0.53 db03

安裝命令

yum install gcc -y
mkdir -p /data/soft
mkdir -p /data/redis_6379
mkdir -p /opt/redis_6379/{conf,pid,logs}
cd /data/soft/
wget http://download.redis.io/releases/redis-3.2.9.tar.gz
tar zxf redis-3.2.9.tar.gz -C /opt/
ln -s /opt/redis-3.2.9/ /opt/redis
cd /opt/redis
make && make install

3.配置文件

cat >/opt/redis_6379/conf/redis_6379.conf <<EOF
### 以守護進程模式啟動
daemonize yes
### 綁定的主機地址
bind 127.0.0.1 10.0.0.51 
### 監聽端口
port 6379
### pid文件和log文件的保存地址
pidfile /opt/redis_6379/pid/redis_6379.pid
logfile /opt/redis_6379/logs/redis_6379.log
### 設置數據庫的數量,默認數據庫為0
databases 16
### 指定本地持久化文件的文件名,默認是dump.rdb
dbfilename redis_6379.rdb
### 本地數據庫的目錄
dir /data/redis_6379
EOF

4.啟動redis

redis-server /opt/redis_6379/conf/redis_6379.conf

5.檢查是否啟動

ps -ef|grep redis
netstat -lntup|grep redis

6.進入redis

redis-cli	

第5章 redis全局命令操作命令

1.寫入key

set k1 v1
set k2 v2
set k3 v3

2.查看所有的key

注意!線上禁止使用!

keys *

3.查看有多少個key

注意!是估值

DBSIZE

4.查看是否存在這個KEY

EXISTS k1
EXISTS k1 k2 k3 

狀態碼:
0	表示這個key不存在
1	表示這個key存在
N 	表示有的N個key存在

5.刪除key

DEL k1
DEL k1 k2 k3

狀態碼:
0	表示這個key不存在
1	表示這個key存在,並且刪除成功
N 表示有的N個key存在,並且刪除N個Key

6.鍵過期

設置過期時間
EXPIRE k1 100

取消過期時間,不修改key原來的值
PERSIST k1	

狀態碼:
0: 表示這個key不存在
1: 表示這個key存在,並且設置過期時間成功

查看key是否過期
TTL k1

狀態碼:
-1 :這個key存在,並且永不過期
-2 :這個key不存在
N  :這個key存在,並且在N秒后過期	

結論:
過期后的key直接會被刪除

第6章 字符串操作

1.設置一個key

set k1 v1 

2.查看一個key

get k1 

3.設置多個key

MSET k1 v1 k2 v2 k3 v3

4.查看多個key

MGET k1 k2 k3

5.天然計數器

加1:
set k1 1
INCR k1
get k1 

加N:
INCRBY k1 100

減1:
INCRBY k1 -1 

減N:
INCRBY k1 -N

第7章 列表操作

1.插入列表:

LPUSH:從列表左側插入數據
RPUSH:從列表右側插入數據

LPUSH list1 A 
LPUSH list1 B 
LPUSH list1 C
RPUSH list1 D

2.查看列表的長度:

LLEN list1

3.查看列表的內容

db01:6379> LRANGE list1 0 -1
1) "C"
2) "B"
3) "A"
4) "D"

4.刪除列表元素

LPOP: 從列表左側刪除
RPOP: 從列表右側刪除

LPOP list1 
RPOP list1

5.刪除列表內容

DEL list1

第8章 哈希操作

1.哈希類型

Hash看起來就像一個hash的樣子.由鍵值對組成
HMSET指令設置hash中的多個域
HGET取回單個域.
HMGET取回一系列的值

2.生成一個hash類型:

HMSET user:1 name xiaozhang job it age 28
HMSET user:2 name abc job it age 28
HMSET user:3 name def job it age 28

3.查看hash里的一個值

HMGET user:1 name

4.查看hash里的多個值

HMGET user:1 name age job

5.查看hash里的所有的值

HGETALL user:1

6.mysql數據和redis哈希對比

user表

uid  name  		job  age 
1	 xiaozhang  it   28 
2	 xiaoya  	it   28 
3	 yazhang  	it   28 

mysql查詢數據

select * from user where id = 3

redis緩存mysql數據

名字  key1 k1值 key2 k2的值 key3 k3的值
uid:1 name xiaozahng job it age 28
uid:2 name xiaoya job it age 28
uid:3 name yazahng job it age 28

第9章 集合操作

1.創建集合

db01:6379> SADD set1 1 2 3
(integer) 3
db01:6379> SADD set2 1 3 5 7
(integer) 4

2.查看集合的成員:

db01:6379> SMEMBERS set1
1) "1"
2) "2"
3) "3"
db01:6379> SMEMBERS set2
1) "1"
2) "3"
3) "5"
4) "7"

3.查看集合的差集

以前面一個集合為基准對比后面的,前面有,后面沒有則選出來

db01:6379> SDIFF set1 set2
1) "2"
db01:6379> SDIFF set2 set1
1) "7"

4.查看集合的交集

db01:6379> SINTER set1 set2
1) "1"
2) "3"
3) "5"

5.查看集合的並集

db01:6379> SUNION set1 set2
1) "1"
2) "2"
3) "3"
4) "5"
5) "7"
db01:6379> SUNION set1 set2 set3
1) "1"
2) "2"
3) "3"
4) "5"
5) "7"
6) "9"

6.注意

集合不允許出現重復的值

第10章 有序集合操作

1.添加成員

zadd key score member [score member]

zadd linux5 100 banzhang
zadd linux5 99  xuewei 10 zuzhang 150 mage 

2.計算成員個數

zcard linux5

3.計算某個成員分數

zscore key member 

zscore linux5 banzhang 

4.計算成員排名

zrank key member	
zrevrank key member

5.降序排行

zrank linux5 xuewei			

6.升序排行

zrevrank linux5 xuewei

7.刪除成員

zrem key member
zrem user:ranking oldzhang

8.增加成員分數

zincrby key increment member

zincrby linux5 1 banzhang 

9.返回指定排名范圍的成員

zrang 	  key start end [wishscores]
zrevrange key start end [wishscores]

zrange linux5 0 2 withscores 

10.返回指定分數范圍的成員

zrangebyscore 	 key min max [wishscores] [limit offect count]
zrevrangebyscore key max min [wishscores] [limit offect count]

zrangebyscore 	  linux5 100 200 withscores
ZREVRANGEBYSCORE  linux5 200 99 withscores

11.返回指定分數范圍成員個數

zount key min max 
zcount linux5 100 200 

第11章 Redis持久化

1.RDB和AOF優缺點

RDB: 快照,把當前內存里的狀態快照到磁盤上
優點: 壓縮格式/恢復速度快
缺點: 可能會丟失數據

AOF: 類似於mysql的binlog,重寫,、每次操作都寫一次/1秒寫一次
優點: 安全,有可能會丟失1秒的數據
缺點: 文件比較大,恢復速度慢 

2.配置RDB

save 900 1
save 300 10
save 60 10000
dir /data/redis_6379/
dbfilename redis_6379.rdb

3.RDB結論:

1.執行shutdown的時候,內部會自動執行bgsave,然后再執行shutdown
2.pkill kill killall 都類似於執行shutdown命令.會觸發bgsave持久化
3.恢復的時候,rdb文件名稱要和配置文件里寫的一樣
4.如果沒有配置save參數,執行shutdown不會自動bgsave持久化 
5.如果沒有配置save參數,可以手動執行bgsave觸發持久化保存

4.配置AOF

appendfilename "redis_6379.aof"
appendonly yes
appendfsync everysec

5.RDB和AOF讀取實驗

實驗背景:

如果aof和rdb文件同時存在,redis會如何讀取?

實驗步驟:

1.插入一條數據
aof: 有記錄
rdb: 沒有記錄 
2.復制到其他地方 
3.把redis停掉
4.清空數據目錄
5.把數據文件拷貝過來
aof: 有記錄
rdb: 沒有記錄
6.啟動redis
7.測試,如果有新插入的數據,就表示讀取的是aof,如果沒有,就表示讀取的是rdb

實驗結論:

如果2種數據格式都存在,優先讀取aof

6.如何選擇:

官方文檔:
https://redis.io/topics/persistence

好的,那我該怎么用?
通常的指示是,如果您希望獲得與PostgreSQL可以提供的功能相當的數據安全性,則應同時使用兩種持久性方法。
如果您非常關心數據,但是在災難情況下仍然可以承受幾分鍾的數據丟失,則可以僅使用RDB。
有很多用戶單獨使用AOF,但我們不建議這樣做,因為不時擁有RDB快照對於進行數據庫備份,加快重啟速度以及AOF引擎中存在錯誤是一個好主意。
注意:由於所有這些原因,我們將來可能會最終將AOF和RDB統一為一個持久性模型(長期計划)。
以下各節將說明有關這兩個持久性模型的更多詳細信息。

第12章 Redis用戶認證

1.配置文件

requirepass 123456

2.使用密碼登錄

兩種方式:

第一種:

redis-cli -h db01
AUTH 123456

第二種:

redis-cli -h db01 -a 123456 get k_1

第13章 禁用危險命令

配置文件里添加禁用危險命令的參數

1.禁用命令

rename-command KEYS ""
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""

2.重命名命令

rename-command KEYS "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
rename-command FLUSHALL "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
rename-command FLUSHDB "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
rename-command CONFIG "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

第14章 Redis主從復制

1.快速創建第二台redis節點命令

rsync -avz db01:/opt/* /opt/*
rm -rf /data 
mkdir /data/redis_6379/ 

cd /opt/redis 
make install 
sed -i 's#51#52#g' /opt/redis_6379/conf/redis_6379.conf
redis-server /opt/redis_6379/conf/redis_6379.conf

2.主從配置方法

方法1:

臨時生效
[root@db-02 ~]# redis-cli -h 10.0.0.52
10.0.0.52:6379> SLAVEOF 10.0.0.51 6379
OK

方法2:

寫入配置文件
SLAVEOF 10.0.0.51 6379

3.主從復制流程

簡單流程:

1.從節點發送同步請求到主節點
2.主節點接收到從節點的請求之后,做了如下操作
- 立即執行bgsave將當前內存里的數據持久化到磁盤上
- 持久化完成之后,將rdb文件發送給從節點
3.從節點從主節點接收到rdb文件之后,做了如下操作
- 清空自己的數據
- 載入從主節點接收的rdb文件到自己的內存里
4.后面的操作就是和主節點實時的了

分析日志:

從節點請求同步:
2602:S 09 Nov 15:58:25.703 * The server is now ready to accept connections on port 6379
2602:S 09 Nov 15:58:25.703 * Connecting to MASTER 10.0.1.51:6379
2602:S 09 Nov 15:58:25.703 * MASTER <-> SLAVE sync started
2602:S 09 Nov 15:58:25.703 * Non blocking connect for SYNC fired the event.
2602:S 09 Nov 15:58:25.703 * Master replied to PING, replication can continue...
2602:S 09 Nov 15:58:25.704 * Partial resynchronization not possible (no cached master)
2602:S 09 Nov 15:58:25.705 * Full resync from master: be1ed4812a0bd83227af30dc6ebe36d88bca5005:1

主節點收到請求之后開始持久化保存數據:
12703:M 09 Nov 15:58:25.708 * Slave 10.0.1.52:6379 asks for synchronization
12703:M 09 Nov 15:58:25.708 * Full resync requested by slave 10.0.1.52:6379
12703:M 09 Nov 15:58:25.708 * Starting BGSAVE for SYNC with target: disk
12703:M 09 Nov 15:58:25.708 * Background saving started by pid 12746
12746:C 09 Nov 15:58:25.710 * DB saved on disk
12746:C 09 Nov 15:58:25.710 * RDB: 6 MB of memory used by copy-on-write

從節點接收主節點發送的數據,然后載入內存:
2602:S 09 Nov 15:58:25.805 * MASTER <-> SLAVE sync: receiving 95 bytes from master
2602:S 09 Nov 15:58:25.805 * MASTER <-> SLAVE sync: Flushing old data
2602:S 09 Nov 15:58:25.805 * MASTER <-> SLAVE sync: Loading DB in memory
2602:S 09 Nov 15:58:25.806 * MASTER <-> SLAVE sync: Finished with success

主節點收到從節點同步完成的消息:
12703:M 09 Nov 15:58:25.809 * Background saving terminated with success
12703:M 09 Nov 15:58:25.809 * Synchronization with slave 10.0.1.52:6379 succeeded

4.取消主從復制

SLAVEOF no one

5.主從復制注意

1.從節點只讀不可寫
2.從節點不會自動故障轉移,它會一直同步主
10.0.0.52:6379> set k1 v1
(error) READONLY You can't write against a read only slave.
3.主從復制故障轉移需要人工介入
- 修改代碼指向REDIS的IP地址
- 從節點需要執行SLAVEOF no one
4.從節點會清空自己原有的數據,如果同步的對象寫錯了,就會導致數據丟失

6.安全的操作

無論是同步,無論是主節點還是從節點,請先備份一下數據

第15章 Redis哨兵

1.db03上快速安裝redis節點

rsync -avz 10.0.0.51:/opt/* /opt/
mkdir /data/redis_6379 -p
cd /opt/redis 
make install 
sed -i 's#51#53#g' /opt/redis_6379/conf/redis_6379.conf
redis-server /opt/redis_6379/conf/redis_6379.conf
redis-cli

2.啟動所有的單節點

redis-server /opt/redis_6379/conf/redis_6379.conf 

3.配置主從復制

redis-cli -h 10.0.0.52 slaveof 10.0.0.51 6379
redis-cli -h 10.0.0.53 slaveof 10.0.0.51 6379

4.安裝部署3個哨兵節點

===========================

!!!!注意!!!! 三個節點的bind IP修改為自己的IP地址

===========================

mkdir -p /data/redis_26379
mkdir -p /opt/redis_26379/{conf,pid,logs}

5.配置哨兵的配置文件

注意!三台機器都操作

cat >/opt/redis_26379/conf/redis_26379.conf << EOF
bind $(ifconfig eth0|awk 'NR==2{print $2}')
port 26379
daemonize yes
logfile /opt/redis_26379/logs/redis_26379.log
dir /data/redis_26379
sentinel monitor myredis 10.0.0.51 6379 2 
sentinel down-after-milliseconds myredis 3000
sentinel parallel-syncs myredis 1
sentinel failover-timeout myredis 18000
EOF

6.啟動哨兵

redis-sentinel /opt/redis_26379/conf/redis_26379.conf

7.驗證主節點

redis-cli -h 10.0.0.51 -p 26379 Sentinel get-master-addr-by-name myredis
redis-cli -h 10.0.0.52 -p 26379 Sentinel get-master-addr-by-name myredis
redis-cli -h 10.0.0.53 -p 26379 Sentinel get-master-addr-by-name myredis

8.模擬故障轉移

關閉主節點服務上的所有redis進程
觀察其他2個節點會不會發生選舉
查看配置文件里會不會自動更新
查看新的主節點能不能寫入
查看從節點能否正常同步

9.模擬故障修復上線

啟動單節點
啟動哨兵 

10.模擬權重選舉

設置其他節點的權重為0
手動發起重新選舉
觀察所有節點消息是否同步
觀察切換結果是否符合預期

命令解釋:

查詢命令:CONFIG GET slave-priority
設置命令:CONFIG SET slave-priority 0
主動切換:sentinel failover myredis

操作命令:

redis-cli -h 10.0.0.52 -p 6379 CONFIG SET slave-priority 0
redis-cli -h 10.0.0.53 -p 6379 CONFIG SET slave-priority 0
redis-cli -h 10.0.0.51 -p 26379 sentinel failover myredis

驗證選舉結果:

redis-cli -h 10.0.0.51 -p 26379 Sentinel get-master-addr-by-name myredis

11.Redis哨兵+主從+密碼

主從密碼配置文件里添加2行參數:
requirepass "123456"
masterauth "123456"

哨兵配置文件添加一行參數:
sentinel auth-pass myredis 123456

第16章 redis集群手動搭建部署

1.目錄規划

主節點		6380
從節點		6381

2.db01創建命令

pkill redis
mkdir -p /opt/redis_{6380,6381}/{conf,logs,pid}
mkdir -p /data/redis_{6380,6381}
cat >/opt/redis_6380/conf/redis_6380.conf<<EOF
bind 10.0.0.51
port 6380
daemonize yes
pidfile "/opt/redis_6380/pid/redis_6380.pid"
logfile "/opt/redis_6380/logs/redis_6380.log"
dbfilename "redis_6380.rdb"
dir "/data/redis_6380/"
cluster-enabled yes
cluster-config-file nodes_6380.conf
cluster-node-timeout 15000
EOF
cd /opt/
cp redis_6380/conf/redis_6380.conf redis_6381/conf/redis_6381.conf
sed -i 's#6380#6381#g' redis_6381/conf/redis_6381.conf 
rsync -avz /opt/redis_638* 10.0.0.52:/opt/
rsync -avz /opt/redis_638* 10.0.0.53:/opt/
redis-server /opt/redis_6380/conf/redis_6380.conf
redis-server /opt/redis_6381/conf/redis_6381.conf
ps -ef|grep redis

3.db02操作命令

pkill redis
find /opt/redis_638* -type f -name "*.conf"|xargs sed -i "/bind/s#51#52#g"
mkdir –p /data/redis_{6380,6381}
redis-server /opt/redis_6380/conf/redis_6380.conf
redis-server /opt/redis_6381/conf/redis_6381.conf
ps -ef|grep redis

4.db03操作命令

pkill redis
find /opt/redis_638* -type f -name "*.conf"|xargs sed -i "/bind/s#51#53#g"
mkdir –p /data/redis_{6380,6381}
redis-server /opt/redis_6380/conf/redis_6380.conf
redis-server /opt/redis_6381/conf/redis_6381.conf
ps -ef|grep redis

5.集群互相發現節點

redis-cli -h 10.0.0.51 -p 6380 CLUSTER MEET 10.0.0.51 6381
redis-cli -h 10.0.0.51 -p 6380 CLUSTER MEET 10.0.0.52 6380
redis-cli -h 10.0.0.51 -p 6380 CLUSTER MEET 10.0.0.52 6381
redis-cli -h 10.0.0.51 -p 6380 CLUSTER MEET 10.0.0.53 6380
redis-cli -h 10.0.0.51 -p 6380 CLUSTER MEET 10.0.0.53 6381
redis-cli -h 10.0.0.51 -p 6380 CLUSTER NODES

6.手動分配槽位

6.1.槽位規划

db01:6380  0-5460
db02:6380  5461-10921‬
db03:6380  10922-16383

6.2.分配槽位

redis-cli -h 10.0.0.51 -p 6380 CLUSTER ADDSLOTS {0..5460}
redis-cli -h 10.0.0.52 -p 6380 CLUSTER ADDSLOTS {5461..10921‬}
redis-cli -h 10.0.0.53 -p 6380 CLUSTER ADDSLOTS {10922..16383}

6.3.查看集群狀態

redis-cli -h db01 -p 6380 CLUSTER info

6.4.允許的槽位個數誤差范圍2%以內

7.手動部署復制關系

redis-cli -h 10.0.0.51 -p 6381 CLUSTER REPLICATE db02的6380的ID
redis-cli -h 10.0.0.52 -p 6381 CLUSTER REPLICATE db03的6380的ID
redis-cli -h 10.0.0.53 -p 6381 CLUSTER REPLICATE db01的6380的ID

8.測試集群

8.1.嘗試插入一條數據發現報錯

10.0.0.51:6380> set k1 v1
(error) MOVED 12706 10.0.0.53:6380

8.2.目前的現象

在db01的6380節點插入數據提示報錯
報錯內容提示應該移動到db03的6380上
在db03的6380上執行相同的插入命令可以插入成功
在db01的6380節點插入數據有時候可以,有時候不行
使用-c參數后,可以正常插入命令,並且節點切換到了提示的對應節點上

8.3.問題原因

因為集群模式有ASK路由規則,加入-c參數后,會自動跳轉到目標節點處理
並且最后由目標節點返回信息

8.4.測試足夠隨機足夠平均

#!/bin/bash

for i in {1 10000}
do
    redis-cli -c -h db01 -p 6380 set k_${i} v_${i} && echo "set k_${i} is ok"
done

第17章 使用工具搭建部署Redis Cluster

1.安裝依賴-只要在db01上操作

yum makecache fast
yum install rubygems -y
gem sources --remove https://rubygems.org/
gem sources -a http://mirrors.aliyun.com/rubygems/
gem update –system
gem install redis -v 3.3.5

2.還原環境-所有節點都執行

pkill redis
rm -rf /data/redis_6380/*
rm -rf /data/redis_6381/*

3.啟動集群節點-所有節點都執行

redis-server /opt/redis_6380/conf/redis_6380.conf
redis-server /opt/redis_6381/conf/redis_6381.conf
ps -ef|grep redis

4.使用工具搭建部署Redis

cd /opt/redis/src/
./redis-trib.rb create --replicas 1 10.0.0.51:6380 10.0.0.52:6380 10.0.0.53:6380 10.0.0.51:6381 10.0.0.52:6381 10.0.0.53:6381

5.檢查集群完整性

./redis-trib.rb check 10.0.0.51:6380

6.檢查集群負載是否合規

./redis-trib.rb rebalance 10.0.0.51:6380

第18章 使用工具擴容節點

1.創建新節點-db01操作

mkdir -p /opt/redis_{6390,6391}/{conf,logs,pid}
mkdir -p /data/redis_{6390,6391}
cd /opt/
cp redis_6380/conf/redis_6380.conf redis_6390/conf/redis_6390.conf
cp redis_6380/conf/redis_6380.conf redis_6391/conf/redis_6391.conf
sed -i 's#6380#6390#g' redis_6390/conf/redis_6390.conf
sed -i 's#6380#6391#g' redis_6391/conf/redis_6391.conf
redis-server /opt/redis_6390/conf/redis_6390.conf
redis-server /opt/redis_6391/conf/redis_6391.conf
ps -ef|grep redis
redis-cli -c -h db01 -p 6380 cluster meet 10.0.0.51 6390
redis-cli -c -h db01 -p 6380 cluster meet 10.0.0.51 6391
redis-cli -c -h db01 -p 6380 cluster nodes

2.使用工具擴容步驟

cd /opt/redis/src/
./redis-trib.rb reshard 10.0.0.51:6380

第一次交互:每個節點保留多少個槽位
How many slots do you want to move (from 1 to 16384)? 	4096

第二次交互:接收節點的ID是什么
What is the receiving node ID? 	6390的ID

第三次交互:哪個節點需要導出
Source node #1: all

第四次交互:確認是否執行分配
Do you want to proceed with the proposed reshard plan (yes/no)? yes

3.檢查集群完整性

./redis-trib.rb check 10.0.0.51:6380

4.檢查集群負載是否合規

./redis-trib.rb rebalance 10.0.0.51:6380

5.調整復制順序

redis-cli -h 10.0.0.53 -p 6381 CLUSTER REPLICATE 51-6390的ID
redis-cli -h 10.0.0.51 -p 6391 CLUSTER REPLICATE 51-6380的ID

6.測試寫入腳本

[root@db01 ~]# cat for.sh 
#!/bin/bash
for i in $(seq 1 100000)
do
    redis-cli -c -h db01 -p 6380 set k_${i} v_${i} && echo "set k_${i} is ok"
done

7.測試讀腳本

[root@db03 ~]# cat du.sh 
#!/bin/bash 
for i in $(seq 1 100000)
do
    redis-cli -c -h db01 -p 6380 get k_${i}
    sleep 0.1 
done

第19章 使用工具收縮節點

1.使用工具收縮節點

cd /opt/redis/src/
./redis-trib.rb reshard 10.0.0.51:6380

2.使用工具縮容步驟

第一次交互: 要遷移多少個
How many slots do you want to move (from 1 to 16384)? 1365

第二次交互: 輸入第一個需要接收節點的ID
What is the receiving node ID?  db01的6380的ID

第三次交互: 輸入需要導出的節點的ID
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1: db01的6390的ID
Source node #2:	done

第四次交互: 確認
Do you want to proceed with the proposed reshard plan (yes/no)?  yes

繼續重復的操作,直到6390所有的槽位都分配給了其他主節點

確認集群狀態是否正常,確認6390槽位是否都遷移走了

忘記以及下線節點
./redis-trib.rb del-node 10.0.0.51:6390 baf9585a780d9f6e731972613a94b6f3e6d3fb5e
./redis-trib.rb del-node 10.0.0.51:6391 e54a79cca258eb76fb74fc12dafab5ebac26ed90

第20章 數據遷移

0.工具安裝

yum install libtool autoconf automake git bzip2 -y 
cd /opt/
git clone https://github.com/vipshop/redis-migrate-tool.git
cd redis-migrate-tool/
autoreconf -fvi
./configure
make && make install 

1.單節點數據遷移到集群

1.1 編寫配置文件

cat > 6379_to_6380.conf << EOF
[source]
type: single
servers:
- 10.0.0.51:6379

[target]
type: redis cluster
servers:
- 10.0.0.51:6380 

[common]
listen: 0.0.0.0:8888
source_safe: true
EOF

1.2 單節點生成測試數據

redis-server /opt/redis_6379/conf/redis_6379.conf 
cat >input_6379.sh<<EOF 
#!/bin/bash
for i in {1..1000}
do
	redis-cli -c -h db01 -p 6379 set oldzhang_\${i} oldzhang_\${i}
	echo "set oldzhang_\${i} is ok"
done
EOF

1.3 運行工具遷移單節點數據到集群

redis-migrate-tool -c 6379_to_6380.conf

1.4 運行工具驗證數據是否遷移完成

redis-migrate-tool -c 6379_to_6380.conf -C redis_check

2.RDB文件遷移到集群

2.1 先把集群的RDB文件都收集起來

在從節點上執行bgsave命令生成RDB文件
redis-cli -h db01 -p 6381 BGSAVE
redis-cli -h db02 -p 6381 BGSAVE
redis-cli -h db03 -p 6381 BGSAVE

2.2 把從節點生成的RDB文件拉取過來

mkdir rdb_backup
cd rdb_backup/
scp db01:/data/redis_6381/redis_6381.rdb db01_6381.rdb
scp db02:/data/redis_6381/redis_6381.rdb db02_6381.rdb
scp db03:/data/redis_6381/redis_6381.rdb db03_6381.rdb

2.3 清空數據

redis-cli -c -h db01 -p 6380 flushall
redis-cli -c -h db02 -p 6380 flushall
redis-cli -c -h db03 -p 6380 flushall

2.4 編寫配置文件

cat >rdb_to_cluter.conf <<EOF
[source]
type: rdb file
servers:
- /root/rdb_backup/db01_6381.rdb 
- /root/rdb_backup/db02_6381.rdb 
- /root/rdb_backup/db03_6381.rdb 

[target]
type: redis cluster
servers:
- 10.0.0.51:6380 

[common]
listen: 0.0.0.0:8888
source_safe: true
EOF

2.5 使用工具導入

redis-migrate-tool -c rdb_to_cluter.conf 

第21章: 使用工具分析key的大小

0.需求背景

redis的內存使用太大鍵值太多,不知道哪些鍵值占用的容量比較大,而且在線分析會影響性能.

1.安裝命令

yum install python-pip gcc python-devel -y
cd /opt/
git clone https://github.com/sripathikrishnan/redis-rdb-tools
cd redis-rdb-tools
pip install python-lzf
python setup.py install

2.生成測試數據

redis-cli -h db01 -p 6379 set txt $(cat txt.txt)

3.執行bgsave生成rdb文件

redis-cli -h db01 -p 6379 BGSAVE

4.使用工具分析

cd /data/redis_6379/
rdb -c memory redis_6379.rdb -f redis_6379.rdb.csv

5.過濾分析

awk -F"," '{print $4,$3}' redis_6379.rdb.csv |sort -r

6.將結果整理匯報給領導,詢問開發這個key是否可以刪除

第22章 內存管理配置

1.設置內存最大限制

config set maxmemory 2G

2.內存回收機制

當達到內存使用限制之后redis會出發對應的控制策略
redis支持6種策略:
1.noevicition		默認策略,不會刪除任務數據,拒絕所有寫入操作並返回客戶端錯誤信息,此時只響應讀操作
2.volatile-lru		根據LRU算法刪除設置了超時屬性的key,指導騰出足夠空間為止,如果沒有可刪除的key,則退回到noevicition策略
3.allkeys-lru		根據LRU算法刪除key,不管數據有沒有設置超時屬性
4.allkeys-random	隨機刪除所有key
5.volatile-random	隨機刪除過期key
5.volatile-ttl		根據key的ttl,刪除最近要過期的key

3.動態配置

config set maxmemory-policy


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM