第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