1、Redis的持久化策略有哪些?有什么区别吗?项目中一般用哪种?
1)RDB 和 AOF
2)
RDB原理是对整个当前内存数据进行快照备份,体积小。AOF原理是每条操作指令都会持久化到文件,导致文件体积比较大
RDB的两次备份时间间隔最短1分钟,时间长,容易导致数据丢失。而AOF默认间隔1秒1次,时间短,数据完整性高!
恢复速度上来说,RDB比AOF稍快一些,因为体积小。
3)实际项目我们公司有运维团队维护Redis服务器的配置,我暂时没去修改过,但是我了解到通常为了保证数据完整更高,同时
开启RDB和AOF,Redis在启动时也会优先加载完整性更高的AOF ,这时RDB备份更多的为了在AOF文件损坏的情况下使用
2、如果系统中存入Redis的数据过多,导致Redis压力过大,怎么解决?
可以搭建Redis主从架构+哨兵集群。
3、什么是Redis缓存穿透,如何解决?
缓存穿透是指用户在短时间内发出海量的请求访问数据库和缓存都不存在的数据时,引发数据库可能崩溃的行为。
解决办法:
1)设置key-null + 30秒过期时间,这样能应付同一个key的穿透情况。
第1次访问某key时,如果缓存和数据库都不存在,则把该key存入redis,value为null,这样后续访问该key就走redis缓存了。
防止过多无效key占用内存,必须设置过期时间 (如30秒)
2)布隆过滤器(BloomFilter)
先将需要缓存的所有key,放入布隆过滤器中,当一个查询请求过来时,先经过布隆过滤器查询,如果判断该key存在,则继续查询(访问缓存或数据库);如果判断该key不存在,则直接丢弃。我大概了解布隆过滤器的原理是这样,先将所有key利用特定算法存储到一个二进制(只有0和1)变量中,当请求某个key时,利用n个哈希函数计算得到该key的n个位置值,但位置值包含0,代表该key必须不存在。如果所有位置值为1,代表该key大概率存在。(布隆过滤器有一定的误判概率)
参考文章:https://zhuanlan.zhihu.com/p/66485901
4、什么是Redis缓存雪崩,如何解决?
同一时刻大量缓存失效,导致请求全部打到数据库,引发数据库宕机
解决办法:
1)缓存数据的过期时间设置固定值+随机值,防止同一时间大量数据过期现象发生
2)采用多级缓存,如加入JVM缓存,Nginx本地缓存,而且不同缓存的过期时间尽可能分散
3)将热点数据设置为永不过期
5、什么是Redis缓存击穿,如何解决?
缓存雪崩的一种,雪崩是多个key失效,击穿是指某个key失效,同一时刻,大量的相同请求会直接打到数据库。
解决办法:
1)将热点数据设置为永不过期
2)采用互斥锁(ReentrantLock)
大概原理就是,多个线程同时去查询数据库的这条数据,那么我们可以在第一个查询数据的请求线程上使用一个互斥锁来锁住它。其他的线程走到这一步拿不到锁就等着,等第一个线程查询到了数据,然后做缓存。后面的线程进来发现已经有缓存了,就直接走缓存。
Lock lock = new ReentrantLock()
String str = redisTemplate.opsForValue().get(‘1001’);
if(str==null){
if(lock.tryLock()){
//代表该线程获取到互斥锁
String a = queryById(‘1001’);
redisTemplate.opsForValue().set(‘1001’,xxx);
Thread.sleep(10);
lock.unLock() //释放锁
}
}
3)采用多级缓存,如加入JVM缓存,Nginx本地缓存,而且不同缓存的过期时间尽可能分散
