Navigation Menu

Skip to content

Commit

Permalink
✏更新 缓存
Browse files Browse the repository at this point in the history
  • Loading branch information
0xcaffebabe committed Nov 15, 2020
1 parent 576e8dc commit 90c73f9
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 12 deletions.
Binary file added assets/20201115141154.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
49 changes: 37 additions & 12 deletions 软件工程/架构/系统设计/缓存.md
Expand Up @@ -4,8 +4,8 @@

收益:

- 加速读写:缓存通常都是全内存的
- 降低后端负载:帮助后端减少访问量和复杂计算(以复杂SQL为主
- 加速读写:缓存通常都是全内存的(缓解IO压力)
- 降低后端负载:帮助后端减少访问量和复杂计算(缓解CPU压力

成本:

Expand All @@ -15,9 +15,16 @@

## 特征

### 吞吐量

使用OPS值(每秒操作数,Operations per Second,ops/s)来衡量,反映了对缓存进行并发读、写操作的效率

在并发读写的场景下, 避免竞争是最关键的

### 命中率

某个请求能够通过访问缓存而得到响应时,称为缓存命中
某个请求能够通过访问缓存而得到响应时,称为缓存命中率

缓存命中率越高,缓存的利用率也就越高

### 最大空间
Expand All @@ -26,15 +33,33 @@

当缓存存放的数据量超过最大空间时,就需要淘汰部分数据来存放新到达的数据

### 更新策略
### 分布式支持

缓存可分为“进程内缓存”和“分布式缓存”两大类

- 复制式缓存:每个节点里面都存在有一份副本,读取数据时无需网络访问,直接从当前节点的进程内存中返回,当数据发生变化时,就必须遵循复制协议,将变更同步到集群的每个节点中,这种复制性能随着节点的增加呈现平方级下降,变更数据的代价十分高昂
- 集中式缓存:是目前分布式缓存的主流形式,集中式缓存的读、写都需要网络访问,其好处是不会随着集群节点数量的增加而产生额外的负担,其坏处自然是读、写都不再可能达到进程内缓存那样的高性能。由于对象更新一个字段可能也会导致整个对象的序列化传输,所以集中式缓存更提倡缓存原始类型

使用多级缓存同时得到两种类型的优点:

当缓存使用量超过了预设的最大值时候 FIFO LRU LFU 等算法用来剔除部分数据 数据一致性最差(因为数据的过期完全取决于缓存) 但基本没有维护成本
![20201115141154](/assets/20201115141154.png)

### 扩展功能

#### 更新策略

当缓存使用量超过了预设的最大值时候 FIFO(先进先出) LRU(最久未使用) LFU(最少使用) 等算法用来剔除部分数据 数据一致性最差(因为数据的过期完全取决于缓存) 但基本没有维护成本

针对LRU的一些缺点,出现了一些算法,这些算法在某些条件下往往有更好的表现:

- TinyLFU:会用少量的样本数据来估计全体数据的特征,并且每隔一段时间,便会把计数器的数值减半,以此解决“旧热点”数据难以清除的问题
- W-TinyLFU:用来解决TinyLFU无法应对稀疏突发访问的问题

超时剔除通过给缓存数据设置过期时间,让其在过期时间后自动删除 段时间窗口内(取决于过期时间长短)存在一致性问题 维护成本不高 只需要设置一个过期时间

应用方对于数据的一致性要求高,需要在真实数据更新后,立即主动更新缓存数据 一致性很高 但是维护成本也是最高的

### 缓存粒度
#### 缓存粒度

究竟是缓存全部属性还是只缓存部分重要属性呢 从三个维度判断:

Expand All @@ -45,6 +70,7 @@
## 位置

- 浏览器缓存
- CDN
- ISP缓存
- ISP是网络访问的第一跳,这个地方有缓存能大大加快用户的访问速度
- 反向代理缓存
Expand All @@ -56,13 +82,11 @@
- 一般数据库都有自己的缓存机制
- CPU缓存

## cdn

## 缓存问题
## 缓存风险

### 缓存雪崩

在高并发的情况下吗,由于于数据没有被缓存中或者缓存都采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部发到DB,DB瞬时压力过重雪崩
在高并发的情况下吗,由于于数据没有被缓存中或者缓存都采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部发到数据库,数据库瞬时压力过重

#### 解决方案

Expand All @@ -72,7 +96,7 @@
- 消息中间件
- 缓存中间件没有命中的情况下,生产者将数据库查询请求通过消息中间件发送给消费者,消费者查询数据库后再返回给生产者,生产者再返回给客户端,MQ具有削峰的功能,能缓解数据库过高的请求压力
- 使用多级缓存以及分布式缓存
- 分析用户的行为,尽量让缓存失效的时间均匀分布
- 分析用户的行为,尽量让缓存失效的时间均匀分布(将过期时间上下浮动一定范围)

概括:

Expand All @@ -82,6 +106,7 @@
### 热点key

对于一些设置了过期时间的key,如果这些key可能会在某些时间点被超高并发地访问,是一种非常“热点”的数据。这个时候,需要考虑一个问题:缓存被“击穿”的问题:

如果这个key的计算不能在短时间完成,那么在这个 key 在效的瞬间,大量的请求就击穿了缓存,直接请求数据库,就像是在一道屏障上凿开了一个洞

#### 解决方案
Expand All @@ -103,7 +128,7 @@

### 缓存一致性

要求数据更新的同时缓存数据也能够实时更新
缓存中的数据与真实数据源中的数据不一致的现象

#### 解决

Expand Down

0 comments on commit 90c73f9

Please sign in to comment.