现象:缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。
解决方案:
1.设置热点数据永远不过期
2.接口限流与熔断,降级
3.加互斥锁
4.布隆过滤器
十、缓存雪崩现象:大量key同一时间点失效,同时又有大量请求打进来,导致流量直接打在DB上,造成DB不可用。
解决方案:
1.设置key永不失效(热点数据);
2.设置key缓存失效时候尽可能错开;
3.使用多级缓存机制,比如同时使用redsi和memcache缓存,请求->redis->memcache->db;
4.购买第三方可靠性高的Redis云服务器;
十一、Redis热点key处理 1 热点key发现监控热key(抓包程序抓redis监听端口的数据,抓到数据后往kafka里丢。接下来,flink流式计算系统消费kafka里的数据,进行数据统计即可)
通知系统做处理
2 解决方案
本地缓存(利用ehcache或HashMap将发现的热key加载到jvm,热key直接走jvm查询)
集群(把这个热key,在多个redis上都存一份)
阿里云Redis已经在内核层面解决热点key问题
3. 热key的危害
流量集中,达到物理网卡上限。
请求过多,缓存分片服务被打垮。
DB 击穿,引起业务雪崩。
十二、拒绝大KEY集群环境,大key会导致数据迁移卡顿
如果被删除时,内存一次性回收,也会卡顿
扩容时,会一次性申请更大的内存,也会卡顿
注意:如果Redis内存起伏较大,很有可能是大key导致,这时需要定位大key并优化
定位大key可以使用scan、或者redis-cli指令完成
十三、Redis是单线程的,但Redis为什么这么快1、基于内存
2、数据结构和操作简单
3、多路I/O复用模型(非阻塞IO)
4、单线程避免了不必要的上下文切换和竞争条件
十四、漏斗限流分布式限流:redis-cell
单机:Google的guava包提供了RateLimiter类
限流的常见算法有以下三种:
1.时间窗口算法
2.漏桶算法
3.令牌算法
Redis通过GeoHash算法实现附近的人查询功能;
内部数据结构是zset,通过score还原就可以得到原始坐标;
集群环境中单个key对应的数据不宜超过1M,如果超过需要按相应业务规则拆分降低key的数据大小。
十六、scan通过游标分步进行,相比于keys,不会阻塞线程
提供limit参数可以控制返回结果条数