1:redis的缓存击穿,缓存雪崩,缓存穿透
redis的缓存击穿:是指大量的并发请求去redis查询一个不存在的key,然后大规模的数据透过redis命中了数据库,给数据库带来了负担,导致数据库宕机。
解决办法:在redis查数据之前,先判断key是否存在,如果不存在,就不再数据库查询,就不再往数据库中查询,而是将他的结果设置成一个空值或者默认值,存储在redis。
缓存血崩:redis大量的key在同一时间失效,导致大量请求直接访问数据库。
解决办法:设置不同的过期时间,防止同时失效。
使用队列:将请求发送到队列里,有序执行,防止同时失效。
备份缓存:通过缓存集群和数据同步,备份缓存数据,在缓存失效的时候可以从备份中获取数据。
缓存穿透:攻击者大量查询不存在的key,导致数据库宕机。
解决办法:在查询缓存之前,先检查请求参数是否合法。
2:redis为什么是单线程的还这么快?
1:基于内存操作,避免了频繁的磁盘io。
2:多路复用,异步的io,redis采用了异步的io模型,通过非阻塞的方式处理网络请求,避免了等待io的操作,减少了线程切换的开销,和上下文切换的过程。
3:单线程模型:所有的请求都在一个线程中串行执行,避免了切换上下文的开销,减小了锁竞争的概率,也使用了类似事件驱动的方式处理请求,就是在等待请求的时候进入睡眠模式,有请求的时候唤醒线程,避免线程空转,提高效率。
3:Reis的持久化:
redis提供了两种持久化方案:AOF和RDB
RDB:将指定时间的数据进行快照的存储,将数据写入到磁盘,redis会创建一个子线程进行持久化操作,先将数据写到一个临时文件上,等持久化结束后,用临时文件替换掉之前的文件,在这个过程中不需要进行任何io操作,确保了极高的性能
保存策略 : save 900 1 900秒内如果有一个key得值发生变化,保存。
AOF:以日志的形式记录每个更新操作
redis在重启的时候会读取这个文件,重新执行新建,修改数据的命令恢复数据。
缺点:比rdb更加消耗内存空间,备份速度慢,存在bug时,造成不能恢复。