关于redis的面试题网上有很多很多,都成了八股文了,我遇到的大概也就这么几个问题,还有一个问题比较随性:在项目中你是怎么使用redis的,都用来做了啥啊?答:噼里啪啦…
当一个查询请求过来,缓存没有命中,也就是说Redis内存数据库没有,于是查询MySQL等数据,结果也没有,于是本次查询失败。当多用户发同一请求时,会给数据库造成很大的压力。
解决方案: 1)缓存空对象: 即使查询结果为空也缓存起来并设置过期时间,也可以保护数据库。 导致的新问题:a)如果空值被缓存起来,越来越多的空值占用内存空间; b)即使设置了过期时间,假如未过期时,数据库有了该结果,就会导致数据不一致的问题。
2)布隆过滤器: 在控制层先进行校验,不符合则弃掉,从而避免对数据库系统过多压力;
缓存击穿是指热key问题,大量并发集中对一个点进行访问,当这个key在失效的瞬间,持续的大并发击穿缓存,直接请求数据库,造成数据库巨大压力。
解决方案: 1)设置热点数据永不过期; 2)加互斥锁:使用分布式锁,保证对每个key同时只有一个线程去查询后端服务,其他线程没有权限则等待,将压力转移到了分布式锁上…
在某一时间段,缓存集中过期失效。所有请求都未命中,就只能去查询数据库,导致数据库压力变大。
解决方案: 1)redis高可用,多搞几台redis,挂掉一个还有其他的提供服务; 2)限流降级:在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量; 3)数据预热:就是把有可能的访问量大的数据先预先访问一下,让其加载到缓存中。
从速度上来看,CPU>内存>硬盘。我们应该明白高性能的服务器不一定是多线程的,多线程也不一定比单线程效率高,因为多线程的情况,CPU要进行上下文切换,比较耗费时间。对于内存系统来说,如果没有上下文切换效率就是最高的,redis是将所有的数据全部存放在内存中的,所以使用单线程去操作效率是最高的,