这种方式基于一个时间节点去备份数据,比如14:00去备份,只会备份这个时间点以前的数据,设置的时间间隔为1小时的话,14:30分停电了,就会导致数据恢复不完整
这种是通过apped方法去追加命令的方式去执行的,如果发生断电,会第一时间将aof文件中的命令重新执行一遍,这种方式的缺点就是,可能会重复操作过程数据,现在到redis6之后的话,会通过overwrite的方式不让执行过程数据,直接回复最终数据
一般在使用的过程当中,一般会将两种缓存的机制配合使用,因为rdb的方式,体量较小并且执行高效,比如在14:00这个节点用rdb的方式恢复数据,这个时间的节点以后用apped追加的命令来恢复数据,这样就可以高效并完整的恢复redis的数据。
方案一:延时双删,先删除缓存,在写数据库,休眠一会后在进行缓存的删除,如果数据库写的操作很频繁,同样会出现脏数据的问题。
方案二:引入MQ,保证原子操作;redis发送指令给mq,mq有两个消费费者,一个负责去删缓存,一个负责去写数据,如果删缓存失败的话,可以通过mq的重试机制进行再次删除,还是会存在一个问题,如果在重试的过程中,有多次写的操作,同样会读到脏数据
有四种算法:
1.random算法随机移除某个key
2.ttl算法,在设置的过期时间里面找到即将过期的key进行移除
3.lru算法,去移除最近很少使用的key
4.lfu算法,维护一个大小为16的候选池,候选池里面的数据会根据时间去排序,每次抽取5个key放到候选池里面,当候选池满了以后,访问时间间隔最大的key会被删除
redis是一个基于内存的非关系型数据库,能够存储的数据类型也比较全面(String、Hash、List、Set、Sorted Set),使用单线程实现io操作,可以支持数据的持久化
1.缓存穿透:当用户访问了一个本身不存在的数据,请求都会去直接访问数据库,
解决办法:1.使用布隆过滤器判断缓存是否存在
2.为请求设置一个为null的缓存,设置一个比较短的过期时间
2.缓存击穿:当缓存过期失效,高并发下直接访问数据库会导致,数据库压力过大
解决办法: 1.让热点数据的缓存永不过期
2.采用分布式锁,缓存失效后只有一个线程更新缓存
3.缓存雪崩:大面积的缓存击穿或服务器不可用
解决办法: 1.使用redis哨兵或者集群等架构提升可用性
2.采用和缓存击穿一样的方式
主从模式:有一个主节点,其他为从节点,有主节点提供服务,从节点相当于业务备份,如果主节点挂掉,则需要手动从从节点上选择一个从节点作为主节点,可用性不高
哨兵模式:对于主从模式新增了哨兵节点,监听每一个主从节点,客户端通过哨兵获取到主节点的ip及端口号去访问主节点,如果主节点挂掉之后,哨兵会从从节点中重新选举出主节点
集群架构:对于单个主节点只能存储100g左右,如果超了,则使用集群架构,用切片的方式将数据分到每一个主从节点上面,官方推荐不超过1000个节点,如果小的集群中的主节点挂掉之后,则会影响读写,如果访问不是该节点,则完全不影响
核心方法:setnx+expire