Redis是单线程的,并且是直接基于内存的,所以执行效率会非常高
为什么Redis是单线程的呢
官方回答 : 因为Redis是基于内存的,所以CPU不会是Redis的瓶颈,但是内存会是,而且多线程的实现比较麻烦,直接使用单线程更省事一点
redis 缓存雪崩
解释: 简单说就是在较高并发以上的时间,redis中的缓存数据同时失效,这时请求会直接命中数据库,大量的请求涌入数据导 致数据库宕机,即使重启数据库,而由于缓存还是无效所以还是会打到宕机。
原因:在使用redis时,对缓存使用了统一的到期时间,导致数据会同时失效。
解决:使用随机的到期时间,可有效缓解。
redis 缓存穿透
解释:当请求一个缓存中不存在的数据,会去数据库中查找,这时数据库中也没有就会返回null,所以缓存中还是不会存在这个数据。将这个情况次数增多到一定量级,就相当于没有设置缓存,对数据库的压力会非常大。
原因:理想状态下是不对存在这个问题,但不排除恶意请求和直接提供给第三方的接口。一旦发生也是数据库宕机。
解决:网关设置ip访问限制,代码设置基本的参数校验(比如id<0),取不到的数据缓存可以存成->{key-稍后再来看看}直接return 过期时间自己考虑,数据量少(酌情考虑)可直接缓存维护全部待查主键就可以自信return,布隆过滤器,服务降级
redis 缓存击穿
解释:当一个数据被大量使用(就是你想的那么大量),这个数据缓存时间到了(o(╥﹏╥)o)。这些请求会直接命中数据库,结果就是宕机。
原因:热点数据没有考虑好过期时间。心大
解决:热点数据直接永久保存(根据业务决定那些热点数据),加锁保证业务,服务降级
redis 缓存预热
事先将一些缓存存入,在某些业务中需要,定时刷新。
redis 缓存更新
监测:定时任务监控缓存,即将过期的缓存延期,设置热点权重对一定权重的数据才更新。
被动:请求来到,如果缓存过期才更新。
服务降级
为了保证核心业务分可用性,必要时必须放弃其他业务。
拒绝:直接拒绝掉非核心功能的所有请求,其实基本就是直接废弃掉某些模块
延迟:将请求加入到线程池中或队列中,延迟执行这些请求
能降级就要能升级