redis
redis数据库是一个nosql数据库,存储的数据格式是key-value。由于redis运行在内存中所以redis的速度非常快。但是,也由于他是运行在内存中的所以只要服务器已关机,或者出现了说明问题。数据就很容易丢失。因此redis给我们提供了两种数据持久化的方式。
Redis应用场景
点赞、关注、热度排行榜,服务器缓存
Redis持久化
RDB(redis database)
RDB的方式就是把数据以快照(当前时刻的数据)的形式放在硬盘中。存在一个默认名为dump.rdb的二进制文件中。
RDB实现方式
- 使用save来进行RDB操作会导致redis在保存数据时阻塞,无法响应客户端请求(所以一般也没人用他)
- 使用bgsave来进行RDB操作时,redis会fork一个子进程来进行数据的保存。redis可以继续相应客户端的请求不会阻塞(在fork子进程的时候会阻塞一会会)
- 根据情况自动保存,可以在配置文件中修改配置做到在m秒内出现了n次数据变动就自动使用bgsave进行RDB操作
AOF(append only file)
aof操作会把redis的每次操作都添加到aof文件中。AOF有三种方式,每次修改追加、每秒追加和不追加
AOF重写机制
随着时间增长,AOF文件的大小也会随之变大。redis就提供了重写机制来给AOF文件瘦身。
redis会根据现有数据来生成一个新的AOF文件,在生成新AOF文件的过程中,redis也在相应客户端的请求,在这个过程中会产生新的数据。这个数据会存在缓存中。等新的AOF生成完了,再把缓存中的数据加过去。再然后用新的AOF文件替换老的AOF文件。这样就获得了一个新的,更小的AOF文件。
AOF和RDB优缺点
- RDB只能保存当前的快照数据,如果在RDB保存后redis服务宕机就会导致上一次保存完的时间点到宕机的时间点内的数据丢失。
- RDB数据恢复的速度比AOF快
- AOF文件比RDB文件大
- AOF的IO开销比RDB大
混合持久化
混合持久化就是同时应用了AOF和RDB的持久化方式,在redis4中引入。
上面说了AOF的重写机制,混合持久化就是在重写阶段将前面的全量(所有)数据以RDB的形式写入AOF文件,然后再将后面的增量数据(缓存区里面的)以AOF的形式写入AOF文件“缝合怪" 文件形式是这样 {[RDB],[AOF]}