● save:同步持久化。实行过程对 redis 做事是壅塞的,在新的快照被创建后,如果存在旧快照则会进行原子性更换。● bgsave:异步持久化。主进程会 fork 一个子进程用来进行持久化操作,快照创建后向主进程发送旗子暗记。上风是:文件经由压缩,适宜用来备份;规复大数据的速率快;每一次都是全量备份。缺陷是:bgsave 天生快照时,主进程仍可修正数据,在两次备份期间修正的数据不会被保存。
● AOF文件
redis 将每一条命令追加写入到文件中,以 AOF 格式保存。利用 bgrewriteaof 命令可以重构 AOF 文件内容,便是将多条命令压缩成高效的批量命令。AOF 有两种持久化机制:● always:同步持久化。每次数据发生改变就将命令同步写入磁盘● everysec:异步持久化。每秒进行记录,如果做事崩溃,最多丢失一秒的数据上风是:比 RDB 更能担保数据不丢失;AOF 格式是人类可读的,可以进行容灾处理和文件修复,比较灵巧。缺陷是:AOF 文件体积比 RDB 大;规复速率一样平常比 RDB 要慢。
Redis 的故障处理
● 验证持久化文件:redis供应了工具,可以扫描 AOF 文件,创造第一个不完全的命令后,会删除这条命令及之后的所有命令;但破坏的 RDB 快照文件无法修复,最好为快照文件保留多个备份,并通过打算快照的散列值来校验。
● 更换主理事器:当主理事器涌现故障时,首先向从做事器发送 SAVE 命令,然后将从服的快照发送到新启动的主理事器,然后在新的主理事器向从做事器发送 SLAVEOF 命令重修主从链。另一种方法是让从做事器升级为主理事器,并为升级后的主理事器创建从做事器。
缓存系统面临的问题● 缓存穿透:用户不断要求缓存和数据库中都没有的数据(如 id = -1),导致数据库压力过大,办理方案:
● 将数据库查不到的空值也进行缓存,但过期韶光远小于正常数据的过期韶光。● 利用布隆过滤器,将数据映射到过滤器中,查询数据库之前先检讨数据是否不存在。
● 缓存击穿:大量用户同时要求缓存中没有,但数据库中有的数据(可能是缓存过期了),导致数据库压力过大,办理方案:
● 设置热点数据永不过期。● 要求数据库之前给查询操作加排他锁,壅塞其他事务的查询。
● 缓存雪崩:缓存中大批数据同时过期,当查询量大时导致数据库瞬间压力过大,办理方案:
● 设置缓存过期韶光时,加上一段随机韶光,防止缓存同时过期。● 热点数据可以设置永不过期。
Redis 的数据类型和运用处景
● string
● 分布式锁
● sorted set
● 计数旗子暗记量:利用凑集的唯一性和分数排序,判断元素是否超出限定数量。
● bitmap
● 用户签到:本日在一年中的天数 a,今年的总天数 n;key 的格式为年份:用户ID,实现为:key = a % n
● 用户在线状态:按用户 ID 设置位状态即可
● Bloom 过滤器:由 redis 模块供应
RabbitMQ 如何担保可靠传输办理生产者丢失问题,可以采取事务或 Confirm 模式,个中 Confirm 的性能比事务要高。办理行列步队丢失问题,可以采取持久化机制。办理消费者数据丢失问题,可以采取手动确认的办法,在处理完毕之后应答即可。由于默认的自动确认机制会在收到时急速回答确认,后续可能导致丢失。
项目中引入 RabbitMQ 须要把稳什么rabbitmq 在分布式系统中作为中间件存在,是一种全局做事,引入 mq 将增加系统繁芜度,须要把稳:
● 命名的规范:生产者与 exchange、消费者与 queue 的命名该当具有关联性,最好将命名过程进行封装自动创建,让利用者不须要关心命名问题。
● 消费者的幂等性:网络问题等成分会触发重试机制,以是消费者该当实现幂等。
● 无序性