RedisⅡ

7.redis发布订阅

- SUBSCRIBE music asmr rap(订阅频道)
- PUBLISH rap 70%(指定频道发布消息)
- PSUBSCRIBE python*(模糊)

8.redis数据持久化

- 内存型数据库,断电数据消失,进程挂掉数据也消失
- 配置数据持久化的规则,让数据以文件形式存储在磁盘上
  • RDB方式
生成一个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方式
生成一个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, 一主两从
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]为集群标识
原文地址:https://www.cnblogs.com/straightup/p/13856495.html