7.redis发布订阅
- SUBSCRIBE music asmr rap(订阅频道)
- PUBLISH rap 70%(指定频道发布消息)
- PSUBSCRIBE python*(模糊)
8.redis数据持久化
- 内存型数据库,断电数据消失,进程挂掉数据也消失
- 配置数据持久化的规则,让数据以文件形式存储在磁盘上
生成一个rdb方式存储数据的配置文件
- touch s22-rdb-redis.conf
打开配置文件并写入如下参数
- vim s22-rdb-redis.conf
######################## RDB方式参数 ########################
daemonize yes
port 6379 #可以修改,连接的时候指定端口
logfile /data/6379/redis.log #日志文件存放目录
dir /data/6379 #定义持久化文件存储位置
dbfilename s22dbmp.rdb #rdb持久化文件
bind 127.0.0.1 #redis绑定地址
#requirepass redhat #redis登录密码
save 900 1 #rdb机制 每900秒 有1个修改记录
save 300 10 #每300秒 10个修改记录
save 60 10000 #每60秒内 10000修改记录
######################## RDB方式参数 ########################
创建配置文件指定的文件夹
- mkdir -p /data/6379
指定rdb方式的配置文件启动服务端
- redis-server s22-rdb-redis.conf
启动客户端 redis-cli
手动持久化保存数据 save
生成一个aof方式存储数据的配置文件
- vim s22-aof-redis.conf
写入如下参数
######################## AOF方式参数 ########################
daemonize yes
port 6379
logfile /data/6379/redis.log
dir /data/6379
#dbfilename dbmp.rdb
#requirepass redhat
#save 900 1
#save 300 10
#save 60 10000
appendonly yes
appendfsync everysec #每秒钟记录一次修改类的操作
######################## AOF方式参数 ########################
- redis-server s22-aof-redis.conf
- redis-cli
实时查看appendonly.aof文件的记录情况
- tail -f appendonly.aof
9.redis主从同步
主库-可读可写
从库-复制主库的数据
redis支持多实例,一台机器上,通过不同的端口,不同的配置文件,运行多个单独的数据库
- 创建多个配置文件 (仅仅是端口的区别, 多个不同文件快速修改同一处内容的方法见最后的知识点补充)
- vim redis-6379.conf #添加如下配置
########### 6379 ###########
port 6379
daemonize yes
pidfile /data/6379/redis.pid
loglevel notice
logfile "/data/6379/redis.log"
dbfilename dump.rdb
dir /data/6379
#protected-mode no
########### 6379 ###########
- vim redis-6380.conf #添加如下配置
########### 6380 ###########
port 6380
daemonize yes
pidfile /data/6380/redis.pid
loglevel notice
logfile "/data/6380/redis.log"
dbfilename dump.rdb
dir /data/6380
#protected-mode no
########### 6380 ###########
- vim redis-6381.conf #添加如下配置
########### 6381 ###########
port 6381
daemonize yes
pidfile /data/6381/redis.pid
loglevel notice
logfile "/data/6381/redis.log"
dbfilename dump.rdb
dir /data/6381
#protected-mode no
########### 6381 ###########
创建配置文件指定的文件夹
- mkdir -p /data/{6379,6380,6381}
启动3个redis
- redis-server redis-6379.conf
- redis-server redis-6380.conf
- redis-server redis-6381.conf
通过命令创建主从的关系(slaveof ip port)
- slaveof 127.0.0.1 6379
通过命令查看身份
- info replication
- redis-cli -p 6380 info replication
主从身份创建好后,从库就有了主库的数据,但不能写入!
手动模拟主库故障,并进行主从切换
- 将主库进程杀死
- ps -ef|grep redis
- kill 52932
- 从库解除奴隶身份
- slaveof no one
- 另一个从库更换主人
- slaveof 127.0.0.1 6381
10.redis哨兵
redis-6379.conf
redis-6380.conf
redis-6381.conf
6380和6381的配置文件里写上: slaveof 127.0.0.1 6379
- 准备三个哨兵, 监测主库 (三个配置文件仅仅是端口的不同)
redis-26379.conf
redis-26380.conf
redis-26381.conf
############### 哨兵配置文件 ###############
# Sentinel节点的端口
port 26379
dir /data/sentinel/
logfile "26379.log"
# 当前Sentinel节点监控 127.0.0.1:6379 这个主节点(redis起在0.0.0.0)
# 2代表判断主节点失败至少需要2个Sentinel节点节点同意
# mymaster是主节点的别名
sentinel monitor mymaster 127.0.0.1 6379 2
# 每个Sentinel节点都要定期PING命令来判断Redis数据节点和其余Sentinel节点是否可达,如果超过30000毫秒30s且没有回复,则判定不可达
sentinel down-after-milliseconds mymaster 30000
# 当Sentinel节点集合对主节点故障判定达成一致时,Sentinel领导者节点会做故障转移操作,选出新的主节点,原来的从节点会向新的主节点发起复制操作,限制每次向新的主节点发起复制操作的从节点个数为1
sentinel parallel-syncs mymaster 1
# 故障转移超时时间为180000毫秒
sentinel failover-timeout mymaster 180000
# 后台运行
daemonize yes
############### 哨兵配置文件 ###############
创建哨兵配置文件里指定的文件夹
- mkdir -p /data/sentinel/
启动
- redis-sentinel redis-26379.conf
- redis-sentinel redis-26380.conf
- redis-sentinel redis-26381.conf
手动杀死主库
- kill -9 19380
通过命令查看从库身份
- redis-cli -p 6380 info replication
- redis-cli -p 6381 info replication
制定的时间到了后,从库身份自动发生变化!
原先的主库重启后,身份变为slave...
11.redis-cluster集群搭建
- 准备6个节点,用于搭建集群 (六个配置文件,仅仅是端口的不同)
redis-7000.conf
redis-7001.conf
redis-7002.conf
redis-7003.conf
redis-7004.conf
redis-7005.conf
########## redis集群配置文件 ##########
port 7000
daemonize yes
dir "/data/cluster"
logfile "7000.log"
dbfilename "dump-7000.rdb"
cluster-enabled yes #开启集群模式
cluster-config-file nodes-7000.conf #集群内部的配置文件
cluster-require-full-coverage no #redis cluster需要16384个slot都正常的时候才能对外提供服务,换句话说,只要任何一个slot异常那么整个cluster不对外提供服务。 因此生产环境一般为no
########## redis集群配置文件 ##########
创建配置文件指定的数据文件夹
- mkdir -p /data/cluster
进入集群直接写入数据,报错
[root@localhost redis-cluster]#redis-cli -c -p 7000
127.0.0.1:7000> set name tom
(error) CLUSTERDOWN Hash slot not served
- 集群创建好,相当于马车已经到位了,但是车上的箩筐没有,货物没地方摆放
- 下一步应该分配槽位了
安装ruby
- yum install ruby -y
安装操作ruby的模块
- wget http://rubygems.org/downloads/redis-3.3.0.gem
通过包管理工具安装
- gem install -l redis-3.3.0.gem
全局搜索以下命令
[root@localhost redis-cluster]#find / -name "redis-trib.rb"
/opt/redis-4.0.10/src/redis-trib.rb
ruby命令一键开启redis-cluster集群
- 上述命令 + "create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005"
[root@localhost redis-cluster]#/opt/redis-4.0.10/src/redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
[root@localhost redis-cluster]#redis-cli -c -p 7000
127.0.0.1:7000> set msg "oh my god"
-> Redirected to slot [6257] located at 127.0.0.1:7001 #放入6257槽位(归属7001)
OK
127.0.0.1:7001> #自动重定向到7001马车
#发现在7000马车上找不到刚刚写入的数据,但由于是一个集群,你get取数据,就会自动重定向到数据所在的马车!也就是说在哪个马车上都可以获取到数据了!
[root@localhost redis-cluster]#redis-cli -c -p 7000
127.0.0.1:7000> keys *
(empty list or set)
127.0.0.1:7000> get msg
-> Redirected to slot [6257] located at 127.0.0.1:7001
"oh my god"
127.0.0.1:7001> #自动重定向到7001马车
知识点补充:
主库身份信息
[root@localhost redis-master-slave]#redis-cli -p 6379 info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=280,lag=0
slave1:ip=127.0.0.1,port=6381,state=online,offset=280,lag=0
master_replid:ffd8eabfda7806daf0c69da7c93cfde8e362c98b
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:280
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:280
多个不同文件修改一个内容
sed "s/被替换内容/替换内容/g" 旧文件 > 新文件 (s替换模式 g全局修改 >重定向到新文件)
sed "s/26379/26380/g" redis-26379.conf > redis-26380.conf
启动哨兵后查看进程
[root@localhost redis-master-slave]#ps -ef|grep redis
root 19380 1 0 09:00 ? 00:00:03 redis-server *:6379
root 19385 1 0 09:00 ? 00:00:03 redis-server *:6380
root 19391 1 0 09:00 ? 00:00:03 redis-server *:6381
root 20072 1 0 09:30 ? 00:00:00 redis-sentinel *:26379 [sentinel]
root 20077 1 0 09:30 ? 00:00:00 redis-sentinel *:26380 [sentinel]
root 20082 1 0 09:30 ? 00:00:00 redis-sentinel *:26381 [sentinel]
root 20096 13538 0 09:32 pts/0 00:00:00 grep --color=auto redis
#[sentinel]为哨兵标识
启动redis集群文件查看进程
[root@localhost redis-cluster]#ps -ef|grep redis
root 21316 1 0 10:35 ? 00:00:00 redis-server *:7000 [cluster]
root 21321 1 0 10:35 ? 00:00:00 redis-server *:7001 [cluster]
root 21326 1 0 10:35 ? 00:00:00 redis-server *:7002 [cluster]
root 21331 1 0 10:35 ? 00:00:00 redis-server *:7003 [cluster]
root 21336 1 0 10:35 ? 00:00:00 redis-server *:7004 [cluster]
root 21341 1 0 10:35 ? 00:00:00 redis-server *:7005 [cluster]
root 21346 13538 0 10:35 pts/0 00:00:00 grep --color=auto redis
#[cluster]为集群标识