源于《Redis实战》
持久化
有两种持久化方式,可以配合使用。
RDB
简介:快照,某一时刻所有数据写入硬盘。
使用:把快照复制到其他服务器备份、重启服务器的时候使用。
创建方法:
- BGSAVE命令(Windows不支持):Redis会fork个子进程,然后子进程把快照写入硬盘,父进程继续处理新命令。一般留30%-45%的内存用于执行命令,创建记录写命令的缓冲区。
- SAVE命令:创建完成快照之前不会接受新的命令,优点是节省内存。
- 配置文件
sava A B
A秒内有B个写入的时候,进行bgsave。 - Redis收到SHOUTDOWN或者TERM信号的时候。
性能:
- 几个GB的时候可以使用这种持久化方式。
- 进程每占用1G,创建子进程就要增加10-20毫秒,虚拟机需要增加的时间更多200-300毫秒。比如Redis进程占用20G内存,在标准硬件创建子进程将导致停顿200-400毫秒,Xen虚拟机停顿4-6秒。 当然创建完子进程写入硬盘需要花费更多的时间。
AOF
执行写命令时,把命令复制到硬盘。
同步频率:
- always 每条命令(可能会降低固态硬盘寿命)
- everysec 每秒一次(推荐使用,Redis性能几乎不受影响)
- no 不自动同步
问题:
占用空间很大,可以用BGREWRITE命令重写(这个命令也是通过子进程进行的),需要注意的是,重写后删除好几G旧文件的时候会造成。
主从结构
复制
为了提高负载,和系统的可靠性。命令:slaveof no one,slaveof host port
,只可以主从复制,不支持主主复制。
过程:
如果有新的从服务器连接主服务器,如果步骤3尚未执行,所有从服务器收到相同的快照和缓存区写命令。
否则,重新执行1-5步骤。
主从链
如果读明显多于写,而读请求数量远超一台Redis服务器可以解决的问题。随着负载上升,主节点可能无法快速更新所有服务器,用户可用过中间层来分担复制工作,如下图
一致性\性能
事务
格式
MULTI
中间业务代码
EXEC
在MULTI和EXEC之间的命令在执行的时候不会被其他客户端打扰,底层通过流水线提高性能。
流水线
一次性发送多个命令,减少通信次数,从而降低延迟。
性能瓶颈
可以用redis-benchmark工具测试服务器的Redis性能。