是什么?
Redis 是一个高性能的key-value存储系统(数据库)。
作用
- 解决应用服务器的cpu和内存压力
- 减少io的读操作,减轻io的压力
- 关系型数据库的扩展性不强,难以改变表结构,redis可以很好解决这个问题
适用场景:
- 数据高并发的读写
- 海量数据的读写
- 对扩展性要求高的数据
不适场景:
- 需要事务支持(不适用于非关系型数据库)
- 基于sql结构化查询储存,关系复杂
使用场景:
- 配合关系型数据库做高速缓存
- 缓存高频次访问的数据,降低数据库io
- 分布式架构,做session共享
- 可以持久化特定数据。
- 利用zset类型可以存储排行榜
- 利用list的自然时间排序存储最新n个数据
支持存储的value类型:
- string(字符串)
- list(链表)
- set(集合)
- zset(sorted set --有序集合)
- hash(哈希类型)
这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。
存储位置
为了保证效率,数据都是缓存在内存中。
redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
两种持久化的方式:
RDB
在不同时间点,将Redis存储的数据生成快照并存储到磁盘中
基本流程:
- 现将数据写到一个临时文件中,
- 待持久化过程结束了才会用这个临时文件替换上次持久化好的文件
由于快照文件总是完整可用的,可以随时进行备份
Redis的RDB持久化操作
Redis会fork一个子进程来进行持久化,主进程不会进行任何IO操作,保证了Redis的性能。
RDB的两种方式:
save命令:阻塞当前Redis,直到持久化结束
bgsave:交给一个子进程完成
AOF
将Redis执行过的所有指令记录下来
下一次Redis重启时,只要把写指令从前到后重复执行一遍,就可以实现数据恢复
AOF持久化策略时长 1s
默认 AOF 持久化策略是每秒就会把缓存的写指令记录到磁盘中(即使出现问题,像断电之类,也只损失那1s的数据)
AOF文件重写机制:
每次AOF把指令追加到AOF文件末尾,这样一来文件会越来越大,所以Redis提供了AOF文件重写机制。
具体方式
当问价大小到达一定阈值,Redis会启动AOF文件压缩,只保留可以恢复数据的最小指令集(把多条指令合并)。
在AOF重写时,还是先写临时文件,全部完成才会替换。
AOF重写流程:
- Redis会fork一个”重写子进程“
- 子进程先读取现有AOF文件,并将其包含的指令进行分析压缩写到另一个临时文件
- 与此同时,主工作进程会将新接收到的写指令一边累积到内存缓冲区中,一边写到原AOF文件中(保证AOF文件的可用性,避免重写过程中出现意外)
- 重写完成,子进程会给父进程发一个信号
- 父进程收到信号后将内存中缓存的写指令追加到新AOF文件中
- 追加结束后,Redis会用新AOF文件代替旧AOF文件,之后有新的写指令都会追加到新的AOF文件中
Redis支持主从同步
数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。
1、主从服务器的设置使得稳健性得以提升,如果主服务器发生故障,可以把作为备份的从服务器提升为主服务器
2、master服务器一般用于写操作,slave服务器用于读操作(读写分离)
主从复制
为了达到主从模式,需要进行主从复制
在master和slave服务器之间进行数据同步操作
1、全量同步(slave初始化阶段,slave需要将Master上所有数据都复制一份)
2、增量同步:
slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程
增量复制过程:主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收到并执行收到的写命令。
Redis同步策略:
主从刚连接时进行全量同步,同步结束之后,进行增量同步
如果有需要,slave在任何时候都可以进行全量同步
Redis无论如何都会先尝试增量同步,如果不成功才会进行全量同步