Redis-基础和应用篇 (2)

现象:缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。

解决方案:

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.令牌算法

十五、GEO

Redis通过GeoHash算法实现附近的人查询功能;

内部数据结构是zset,通过score还原就可以得到原始坐标;

集群环境中单个key对应的数据不宜超过1M,如果超过需要按相应业务规则拆分降低key的数据大小。

十六、scan

通过游标分步进行,相比于keys,不会阻塞线程

提供limit参数可以控制返回结果条数

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpdgzd.html