NingG +

基础原理系列:缓存通用原理和实践

1. 概念解释

1.1. 缓存数据级别

根据粒度不同,从大到小,基本可分为:

1.2. 几个时间

使用缓存,目标是提高数据访问性能,其中涉及几个时间:

1.3. CAP理论

分布式领域 CAP 理论:

定理:任何分布式系统,只可能同时满足两点,无法三者兼顾。架构师应该在CAP上做好取舍。

一个DB服务 搭建在两个机房(北京,广州),两个DB实例同时提供写入和读取,不同方案下,出现网络故障时,均无法同时保证CAP:

在没有出现网络故障的时候,满足CA原则,C 即我的任何一个写入,更新操作成功并返回客户端完成后,分布式的所有节点在同一时间的数据完全一致, A 即我的读写操作都能够成功,但是当出现网络故障时,我不能同时保证CA,即P条件无法满足

这种操作保证了在出现网络故障时,双边机房都是可以提供服务的,且读写操作都能成功,意味着他满足了AP ,但是它不满足C,因为更新操作返回成功后,双边机房的DB看到的数据会存在短暂不一致,且在网络故障时,不一致的时间差会很大(仅能保证最终一致性)

降级服务,如停止写入,只提供读取功能,这样能保证数据是一致的,且网络故障时能提供服务,满足CP原则,但是他无法满足可用性原则

1.4. ACID

关系数据库的ACID模型拥有 高一致性 + 可用性,但很难进行分区:

1.5. BASE

BASE模型,不同ACID模型,牺牲高一致性,获得可用性、可靠性:

BASE思想的主要实现有

1.6. 穿透、雪崩、并发

简要解释:

1.7. 缓存指标

缓存命中率:从缓存成功读取数据的次数/从缓存读取数据的次数。

1.8. 缓存策略

1.8.1. Eviction policy

移除策略,即如果缓存满了,从缓存中移除数据的策略;常见的有LFU、LRU、FIFO:

1.8.2. TTL(Time To Live )

存活期,即从缓存中创建时间点开始直到它到期的一个时间段(不管在这个时间段内有没有访问都将过期)

1.8.3. TTI(Time To Idle)

空闲期,即一个数据多久没被访问将从缓存中移除的时间。

2. 实践建议

使用缓存的基本步骤:

缓存中几个基本问题:

3. Spring 中缓存实践:缓存、事务、数据库

关于 Spring AOP 中,「缓存」、「索引」、「事务」的织入顺序,踩过几个坑:

(前方高能预警:下面是最佳实践)

整体来说,为保证「事务」、「缓存」、「索引」操作时,不会出现缓存污染问题,可以采取下述措施:

具体,最佳实践建议如下:

整体建议:

4. 参考来源

Top