Redis持久化机制
RDB
rdb:持久话的是数据本身,也就是给数据做一次快照。
达到某个条件进行快照
如:
save 900 1 900秒内有1此修改
save 300 10 300秒内有10此修改
save 60 10000 60秒内有1w次修改
优点:
-
rdb是二进制文件,占用空间小。
-
在恢复数据时,redis会启用一个子进程,不会占用父进程,异步,redis是单线程的(多路复用)
缺点:会丢失最后一次快照后修改的数据。
AOF
aof:持久化保存的是一系列指令,把生成数据的命令保存到硬盘上的文件中。
保存方式
- 每秒保存一次(推荐)
save操作使用的子进程的方式,不会占用主进程。
- 每修改一次就保存一次
会执行write和save操作,这里的save在主进程调用,可能会造成阻塞。
aof文件重写
aof重写保证了数据最终一致性,省略了部分中间步骤,使得文件变小。
优点:理论上可以保证数据完整性,但是性能又比较差。修改一次保存一次
缺点:aof文件比较大,恢复速度比rdb要慢。
RDB和AOF
一般进行持久化操作时,两种方式并存。
方式:先用rdb进行数据恢复,再使用aof进行数据补全。
Redis事务控制
redis虽然支持事务,但是不支持回滚(所以了解即可),并且执行了事务也不一定对。
事务控制
加入队列时错误
遇到了入队时即可检测到的错误,整个队列都不会执行。
执行队列时出错
错误在入队列时检测不出来,整个队列执行时有错的命令,而执行失败,且不支持回滚。
为什么不支持回滚
官方:
如果你有使用关系式数据库的经验, 那么 “Redis 在事务失败时不进行回滚,而是继续执行余下的命令”这种做法可能会让你觉得有点奇怪。以下是这种做法的优点:
1.Redis 命令只会因为错误的语法而失败(并且这些问题不能在入队时发现),或是命令用在了错误类型的键上面:这也就是说,从实用性的角度来说,失败的命令是由编程错误造成的,而这些错误应该在开发的过程中被发现,而不应该出现在生产环境中。
2.因为不需要对回滚进行支持,所以 Redis 的内部可以保持简单且快速。
有种观点认为 Redis 处理事务的做法会产生 bug , 然而需要注意的是, 在通常情况下, 回滚并不能解决编程错误带来的问题。 举个例子, 如果你本来想通过 INCR 命令将键的值加上 1 , 却不小心加上了 2 , 又或者对错误类型的键执行了 INCR , 回滚是没有办法处理这些情况的。
乐观锁和悲观锁
乐观锁
认为当前环境下不容易发生碰撞,所以执行操作前不加锁,如果发生了碰撞,会检查版本号:
- 如果是基于最新版本修改的,执行操作,服务器接受,修改成功。
- 如果不是,服务器不接受,修改失败,整个MULTI队列中的操作都被丢弃。
Redis主从复制机制
读写分离的好处
- 性能优化:服务器只专注于一件事,主服务器只专注于写操作,可以用更适合写入数据的工作模式,从服务器只专注于读操作,可以用更适合读取数据的模式工作。
- 强化数据安全,避免单点故障:由于数据同步机制的存在,各个服务器之间数据保持一致,所以其中某个服务器宕机不会导致数据丢失或者无法访问。
搭建步骤
- 创建三个不同的配置文件,在执行时,分别带入不同的配置文件参数。
mkdir /usr/local/cluster-redis
redis6000.conf
redis7000.conf
redis8000.conf
redis6000.conf修改的位置有
daemonize yes
dir /usr/local/cluster-redis
port 6000
dbfilename dump6000.rdb
logfile /var/logs/redis6000.log
pidfile /var/run/redis6000.pid
7000 和 8000直接对6000进行复制,替换6000即可
cp redis6000.conf redis7000.conf
命令行模式下
:%s/6000/7000
查询7000
:/7000
- 分别启动三个redis
/usr/local/redis/bin/redis-server ./redis6000.conf
/usr/local/redis/bin/redis-server ./redis7000.conf
/usr/local/redis/bin/redis-server ./redis8000.conf
- 查看redis进程
ps -ef | grep redis | grep -v grep (-v表示去除grep查询)
- 查看redis端口
netstat -anp | grep redis
- info replication (查看信息(主服务器为谁,多少台从))
- 建立主从关系
slaveof 127.0.0.1 6000 (给其他端口的redis设置主服务器为6000redis)
- 取消主从关系
slaveof no one
注意
- 在没有哨兵的情况下,主服务器挂了,从服务器不会自动晋升,且关联的主服务器不会改变。
- 从服务器宕机,恢复后,不会自动关联主服务器。
- 读写分离,从服务器只能读。
哨兵模式
意义
通过哨兵服务器监控master/slave实现主从复制集群的自动管理。
监控的相关概念
主观下线
有一台哨兵检测到某个节点服务器下线。
客观下线
认为某个节点服务器下线的哨兵服务器达到指定数量。这个数量后面在哨兵的启动配置文件中指定(一般为过半的哨兵检测到某个节点的服务器下线)。
注意:只有 master 服务器做客观下线的判断, slave 只做主观下线的判定。
心跳检查
客户端为了确认服务器是否存活,不断的向服务器发送很小的数据包,服务器在一定时间内返回了数据包,证明服务器是否存活。
配置
vim /usr/local/cluster-redis/sentinel.conf
| 格式 | sentinel monitor 为主机命名 主机IP 主机端口号 将主机判定为下线时需要Sentinel同意的数量 |
|---|---|
| 例子 | sentinel monitor mymaster 127.0.0.1 6000 1 |
直接插入文件内即可。
启动
启动哨兵
/usr/local/redis/bin/redis-server /usr/local/cluster-redis/sentinel.conf --sentinel
注意:还是使用redis-server启动,最后要加--sentinel表示当前时哨兵。
启动哨兵
关闭8000
重启8000
关闭6000
重启选举
选举为7000
重启6000,成为从服务器
选举
- 情况1:
- slave A:投票给 slave B
- slave B:投票给 slave A
- 两个服务器各得一票,平手,不能确定,需要继续投票
- 情况2:
- slave A:投票给自己
- slave B:投票给自己
- 两个服务器各得一票,平手,不能确定,需要继续投票
- 情况3:
- slave A:投票给自己
- slave B:投票给 slave A
- slave A 得 2 票,slave B 没有得票,所以 slave A 当选
发布订阅(消息队列)
订阅一个频道
SUBSCRIBE cctv
发送消息给队列
PUBLISH cctv nihao
收到推送的消息
SUBSCRIBE cctv
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "cctv"
3) (integer) 1
1) "message"
2) "cctv"
3) "nihao"