分布式缓存有哪些坑

分布式缓存有哪些坑

分布式缓存有哪些坑

在toC的系统之中,解决高并发场景下低延迟的问题,缓存是很重要的解决手段。多级缓存、数据异构、数据预处理都是相关的高性能方法论,那么使用分布式缓存会有哪些坑呢?

主要有如下三个坑需要填:

  1. 缓存一致性
  2. 缓存击穿
  3. 缓存雪崩

www.zeeklog.com  - 分布式缓存有哪些坑

缓存一致性

我们在引入缓存之后,首先要解决的就是数据源和缓存之间的缓存一致性问题,关于缓存写入有几种常用的方案:

  • cache aside pattern
  • cache through
  • write through

等。

其实在一致性角度讨论也存在多个视角,session一致性、因果一致性、线性一致性等。

在我们真实场景中往往采用的解决方案是,数据写入db,监听binlog,数据格式化处理,通过mq异构到cache服务。这样的好处是不需要维护db和cache的两个分布式事务,使用db的acid机制保障了事务性,通过mq的持久性和重试解决了cache维护的事务性,这样在整个数据写入和缓存维护过程中只需要关注一个事务就可以了(cache维护的事务性)。

缓存击穿

击穿的意思是请求来了之后,我们在应用层没有拦住请求(cache miss了),以至于请求穿透到db层,如果存在大量缓存击穿,对于db压力会很大,如果db扛不住会导致雪崩的问题。所以缓存击穿解决是系统稳定性需要考虑的,也是高流量c端服务在使用缓存时首先需要想到的一个问题。

穿透的流量有两种:

  1. 真实流量,但是由于cache失效导致了cache miss
  2. 异常流量,爬虫或是恶意攻击,导致大量cache miss

针对于第一种情况,可以通过监控手段观察缓存命中和miss的情况,适当维护缓存,保障一定的命中率。还可以在cache miss之后放一个空。也可以采用“双key解决方案”,请求来了之后通过redis的setnx修改cache_time的时间,同时去db获取元数据,并发请求来了之后发现cache_time没有过期,会获取cache_data的数据(不管数据新老与否)。

www.zeeklog.com  - 分布式缓存有哪些坑

针对于第二种情况,一般的方案就是“布隆过滤器”了,可以在单机缓存构造一个布隆过滤器,也可以基于redis实现一个分布式的布隆过滤器。

www.zeeklog.com  - 分布式缓存有哪些坑

缓存雪崩

缓存雪崩是指由于大量的热数据设置了相同或接近的过期时间,导致缓存在某一时刻密集失效,大量请求全部转发到 DB,或者是某个冷数据瞬间涌入大量访问,这些查询在缓存 MISS 后,并发的将请求透传到 DB,DB 瞬时压力过载从而拒绝服务。

目前常见的预防缓存雪崩的解决方案,主要是通过对 key 的 TTL 时间加随机数,打散 key 的淘汰时间来尽量规避,但是不能彻底规避。

www.zeeklog.com  - 分布式缓存有哪些坑

Read more

超快速,使用ChatGPT编写回归和分类算法

超快速,使用ChatGPT编写回归和分类算法

本文将使用一些 ChatGPT 提示,这些提示对于数据科学家在工作时非常重要。 微信搜索关注《Python学研大本营》,加入读者群,分享更多精彩 以下是一些示例ChatGPT 提示的列表以及数据科学家的响应。 ChatGPT 提示 为决策树回归算法生成 python 代码。 下面是使用scikit-learn在 Python 中进行决策树回归的示例代码: import numpy as np import matplotlib.pyplot as plt from sklearn.tree import DecisionTreeRegressor # Generate random data rng = np.random.default_rng() x = 5 * rng.random(100) y = np.sin(x) + 0.

By Ne0inhk
力扣每日一题:993.二叉树的堂兄弟节点 深度优先算法

力扣每日一题:993.二叉树的堂兄弟节点 深度优先算法

993.二叉树的堂兄弟节点 难度:简单 题目: 在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。 如果二叉树的两个节点深度相同,但 父节点不同 ,则它们是一对堂兄弟节点。 我们给出了具有唯一值的二叉树的根节点 root ,以及树中两个不同节点的值 x 和 y 。 只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true 。否则,返回 false。 示例: 示例 1: 输入:root = [1,2,3,4], x = 4, y = 3 输出:false

By Ne0inhk
1239.串联字符串的最大长度 关于字符串的回溯算法!

1239.串联字符串的最大长度 关于字符串的回溯算法!

题目: 给定一个字符串数组 arr,字符串 s 是将 arr 某一子序列字符串连接所得的字符串, 如果 s 中的每一个字符都只出现过一次,那么它就是一个可行解。 请返回所有可行解 s 中最长长度。 提示: 1 <= arr.length <= 16 1 <= arr[i].length <= 26 arr[i] 中只含有小写英文字母 示例: 示例 1: 输入:arr = ["un","iq","ue"] 输出:4 解释:所有可能的串联组合是

By Ne0inhk