个人理解向10.Redis问题

1.什么是缓存雪崩?如何解决?

个人理解:mysql数据库每秒理想支持并发为2000,类似大棚里的农作物。redis 理想能抗住10000,类似大棚外的膜。当大雪来临(请求过来时候)。先打在redis上,当redis没找到,去请求mysql。

缓存雪崩就是,对应大量请求都在redis缓存中未找到,直接打在mysql。极可能出现的场景为,给某一大波数据设置同样的过期时间。然后在某个时间点,这些数据同时失效。请求访问这大波数据,全部越过了redis 缓存,直接请求mysql。导致mysql宕机。

应对策略:对应数据时间戳添加随机数,错开同一时间大量缓存失效情况,给mysql数据库一定保护,或者提前刷新缓存,别等到失效之后的懒加载去设置。

2.什么是缓存穿透?怎么解决?

个人理解:redis也是等同于map。准确的key查询出具体的value。那么如果传递过来的是一个错误的key,那么通常是认为redis查询不到,是自己缓存未到位,就立即进行mysql数据库的查询。等于中间没有做限制,直接让对应数据到mysql进行无效查询。其实抛去无效这个概念。是否可以引入限流概念。也就是对传来数据进行限流,可以是已经查询到无效的数据放到缓存中,以及设置短时间内允许一定的数据库进行mysql查询。查询相同数据也一样,不过需要防止大量查询刚刚失效的key,导致的缓存穿透。

3.什么是缓存并发竞争?怎么解决?

**解释:**多个客户端写一个 key,如果顺序错了,数据就不对了。但是顺序我们无法控制

个人理解:并发就是多个进行参与修改。如果是不必要数据库,推荐用时间戳的乐观锁进行处理,对比数据中时间戳的先后顺序,如果数据库中时间戳已经是当前之前了,那么抛弃本次更新。也可以用mq,都扔到mq中,走队列进行控制,后一个覆盖前一个,不过也带上时间戳做简单判断,时间戳后面的覆盖前面的,也能进一步按一些权限进行覆盖策略。

4.什么是缓存和数据库双写不一样?怎么解决?

解释:连续写数据库和缓存,但是操作期间,出现并发了,数据不一致了。

通常,更新缓存和数据库有以下几种顺序:

  • 先更新数据库,再更新缓存。
  • 先删缓存,再更新数据库。
  • 先更新数据库,再删除缓存。

先更新数据然后更新缓存。可能存在部分数据是读取老数据

先删缓存 再更新数据,更新数据后补一次设置redis缓存 【个人觉得这种能满足大部分平时要求了】

先更新数据库,再删除缓存,然后获取缓存用懒加载。

2020-12-4 新增后续感想:
如果访问数量很大,对应更新数据是高频数据。那么对缓存更新又是另一种思考。
如果允许旧数据存在。那么缓存先不删除,先更新数据,然后更新对应缓存。【可应对很多访问数】
如果一定要准确数据。那么就删除缓存,在更新数据库,更新完之后缓存放回去。【较少量访问数可支持】
如果你说删缓存,会相当于没有缓存,直接去mysql数据库查询会击穿。那么就不能那个接口只查询缓存,不会去查询数据库,缓存没有就没有。等数据库跟新之后,对应缓存会放上去。【较大访问数,但是会因缓存数据不存在卡住部分流程吧】
什么你一定要数据?那么就对应请求放到mq。可以引入延迟队列。等过一会,在对应数据回调给你。本次没有。
之前觉得面试题很对,可能是因为想法太局限了,当引入其他来解决一个问题,思路也开扩很多。不能否认,引入其他,会导致系统复杂。不过需求复杂,却要求你技术简单明了就可以实现?兄弟,你看过五彩斑斓的黑色吗?


漫漫长路,一个小周跟他一个小陈朋友一起努力奔跑。


命题是来自来自公众号发表的面试题,记录下自己的认知,非正常性面经。

你可能感兴趣的:(java代码有感)