中软:
1:redis的缓存击穿是怎么回事儿?怎么预防?
缓存击穿就是当某一个热点Key在缓存过期的一瞬间,同时有大量的请求打进来,由于此时缓存过期了,所以请求最终都会走到数据库,造成瞬时数据库请求量大、压力骤增,导致数据库存在被打挂的风险。
预防手段:
(1)加互斥锁:当大量请求进来之后,只有第一个请求可以获得锁并阻塞其他请求,此时该亲求查询数据并将结果写入到redis里面之后释放锁,后续的请求就都会从redis中获取结果。
(2)给缓存设置永不过期或者通过后台线程去根本更新缓存的过期时间。
----延申:
redis的雪崩和穿透:
redis的雪崩是指的是大面积的缓存过期或者失效的情况下,请求直接访问数据库,造成数据库宕机,跟雪崩的场景一样
预防方法:
(1)配置redis集群,避免出现的单个redis出现问题而导致所有的redis都不能用
(2)对接口请求进行限流
(3)给缓存的过期时间加上随机数,随机设置缓存的失效时间
(4)针对热点数据的缓存设置永不失效
redis的穿透指的是在缓存中大量的key根本不存在,直接导致请求落在数据库上,导致数据库宕机
预防方法:|
(1)对请求传入的参数进行校验,不合法的参数直接抛异常
(2)针对缓存中没有的key(无效的key),我们可以将这无效的key先存入缓存中,但是缓存的过期时间可以设置的短一点。
(3)通过布隆过滤器;我们先将数据库的数据预加载到布隆过滤器中,这样请求进来的时候我们先判断请求的key是否存在于布隆过滤器中,如果不存在直接报错,存在的话接着走下面的业务代码。(布隆过滤器:布隆过滤器它实际上是一个很长的二进制向量和一系列随机映射函数)
2:分布式锁的概念
分布式锁一般用于分布式集群,并发操作共享资源的数据安全问题
分布式锁的几种实现方式:
(1)手动实现:通过setnx命令来实现
给锁加上过期时间,来预防死锁问题;给锁延长过期时间来预防所释放后的并发问题
set lockname value EX timeout NX
(2)通过redis的分布式锁来实现(Redission:基于看门狗机制,实现锁过期时间的刷新)
基于 Lua 脚本语言实现的,可以保证操作的原子性。
释放锁请求:
(3)通过zookeeper来实现(这块不熟悉,后面补)
数据库查询优化:
(1)给必要的查询字段加上索引,通过explain命令来查看该查询时候有被优化
(2)分库分表(并发量大时分库,单表数据量大时分表)
(4)设置缓存机制
接口耗时性能优化:
(1)批量处理数据
(2)确认索引起效,优化索引结构
(3)对于调用的请求做异步处理
(4)预处理,相当于提前加载数据,放到缓存中
(5)深分页
(6)接口拆分(垂直拆分和水平拆分)
(7)微服务架构或者做负载均衡
(8)..........(后续了解了写上去)