redis如何保证持久化
通过AOF 和RDB
日常生产以AOF和RDB结合使用
RDB 是以快照的形式, 每隔一段时间 记录一下快照, 记录到DB文件中, 默认是 十五分钟 一次, 五分钟十次 一分钟一万次改动, 都回生成RDB文件
实际生产, 会将RDB文件备份到其他服务中.
优点: 操作较快, 以内存快照的形式恢复,.
缺点: 以一段时间出发内存快照, 会造成数据的丢失
AOF 以日志的形式记录redis的操作, 记录到appendonly.aof文件中
优点: 记录日志较全,
缺点: 记录占用资源较大, 如果因为网络波动, 导致服务器短暂失效, AOF恢复耗时较长, 比较消耗资源 ,
主从复制:(读写分离,容灾恢复)
slave 链接到master时, 会发送一个snyc的命令
当master接到snyc 启动存盘进程 搜集所有修改数据,整合到一个数据集, 全部同步到slave上面
全量复制: 第一次链接到master会执行全量复制
增量复制: 之后都执行增量复制, 将修改的数据,同步到slave
一主两从 ,
薪火相传 , a(master)-b(slave,master)-c(slave)
反客为主 , 当master挂掉之后, slave会接过master将自己升级为master,
哨兵机制. 当master挂掉之后, slave会进行一个选举, 选举出一个master 然后将自己升级为master
缓存的雪崩:
某一时刻内, 缓存内的大量数据 集中失效, 请求访问就会去数据库查询, 造成数据库的压力,
解决方案, 避免大量数据同时失效, 再失效时间后加上一个随机值, 来解决.
缓存击穿: 当请求访问某一个数据时, 发现redis中数据失效, 然后这个请求会去访问数据库,.
解决方案: 加分布式互斥锁, 然后当用户请求过来时, 发现数据不存在, 让用户再一次在redis上查询, 如果还不存在, 那就去访问数据库, 同时将访问的数据写在redis上
后面的请求过来时就可以直接在redis上访问到了
缓存穿透: 恶意访问redis和mysql中不存在的数据,
解决方案: 布隆过滤器: 我理解是二进制的一个数组文件, 每次存数据时用hash值来 给数据的下标 标位1 , 当请求来查询时, 先
判断查询数据的下标值是否存在, 如果不存在,那就不查询redis和mysql
redis为什么快:
纯内存操作,
单线程操作, 避免了上下文的一个频繁切换.
采用了非阻塞的I/O多路复用的机制 将所有的请求加入一个线程中. 使用事务控制器, 将出口锁死, 从外边取数据.
redis过期策略以及内存 淘汰机制:
定期删除+惰性删除