cs note
  • 首页
  • 广告业务
    • RTA
  • 操作系统
    • 1.计算机系统漫游
    • 2.硬件结构
    • 3.内存管理
    • 4.进程管理
    • 5.文件系统
    • 6.设备管理
    • 7.网络系统
  • 网络
    • 高并发短链接
    • 网络编程
    • 网络通信
    • 网络协议详解
    • 网络与io模型
    • 网络io
    • 握手分手问题
    • 压测到网络IO
    • nio
    • osi七层参考模型
    • select,poole,poll详解
    • websocket
  • mysql
    • 一、基础
      • 1.1执行过程
      • 1.2存储过程
    • 二、索引
      • mysql索引
      • mysql索引优化1
      • mysql索引优化2
      • mysql索引优化3
    • 三、事务
    • 四、锁
      • 4.1锁详解
    • 五、日志
  • redis
    • 一、常见数据结构
      • 1.1数据类型
      • 1.2特殊数据类型
    • 二、线程模型 *
    • 三、持久化
      • 3.2主从同步
    • 四、锁
      • 4.1实现锁
    • 五、淘汰策略 *
    • 六、缓存
      • 6.1缓存一致性问题
      • 6.2缓存策略
  • kafka
    • 消息幂等通用方案
    • kafka基础使用
    • kafka集群搭建
    • kafka问题精选
    • mq常见问题
    • mq常见问题及解决方案
    • rabbitmq
  • 算法
    • 每日一题202312
    • 每日一题202401
    • 每日一题202402
    • 每日一题202403
    • LeetCode热题
由 GitBook 提供支持
在本页
  1. redis
  2. 六、缓存

6.2缓存策略

最后更新于1年前

Cache Aside 策略

旁路缓存策略 Cache Aside(旁路缓存)策略是最常用的,应用程序直接与「数据库、缓存」交互,并负责对缓存的维护,该策略又可以细分为「读策略」和「写策略」。

写策略的步骤:

  • 先更新数据库中的数据,再删除缓存中的数据。 读策略的步骤:

  • 如果读取的数据命中了缓存,则直接返回数据;

  • 如果读取的数据没有命中缓存,则从数据库中读取数据,然后将数据写入到缓存,并且返回给用户。 注意,写策略的步骤的顺序顺序不能倒过来,即不能先删除缓存再更新数据库,原因是在「读+写」并发的时候,会出现缓存和数据库的数据不一致性的问题。

file

Cache Aside 策略适合读多写少的场景,不适合写多的场景,因为当写入比较频繁时,缓存中的数据会被频繁地清理,这样会对缓存的命中率有一些影响。如果业务对缓存命中率有严格的要求,那么可以考虑两种解决方案:

一种做法是在更新数据时也更新缓存,只是在更新缓存前先加一个分布式锁,因为这样在同一时间只允许一个线程更新缓存,就不会产生并发问题了。当然这么做对于写入的性能会有一些影响; 另一种做法同样也是在更新数据时更新缓存,只是给缓存加一个较短的过期时间,这样即使出现缓存不一致的情况,缓存的数据也会很快过期,对业务的影响也是可以接受。

Read/Write Through 策略

读穿/写穿策略 Read/Write Through(读穿 / 写穿)策略原则是应用程序只和缓存交互,不再和数据库交互,而是由缓存和数据库交互,相当于更新数据库的操作由缓存自己代理了。

Read Through 策略

先查询缓存中数据是否存在,如果存在则直接返回,如果不存在,则由缓存组件负责从数据库查询数据,并将结果写入到缓存组件,最后缓存组件将数据返回给应用。

Write Through 策略

当有数据更新的时候,先查询要写入的数据在缓存中是否已经存在:

  • 如果缓存中数据已经存在,则更新缓存中的数据,并且由缓存组件同步更新到数据库中,然后缓存组件告知应用程序更新完成。

  • 如果缓存中数据不存在,直接更新数据库,然后返回;

缓存节点而非应用程序来和数据库打交道

Write Back 策略

写回策略 Write Back(写回)策略在更新数据的时候,只更新缓存,同时将缓存数据设置为脏的,然后立马返回,并不会更新数据库。对于数据库的更新,会通过批量异步更新的方式进行。

Write Back 是计算机体系结构中的设计,比如 CPU 的缓存、操作系统中文件系统的缓存都采用了 Write Back(写回)策略。

Write Back 策略特别适合写多的场景,因为发生写操作的时候, 只需要更新缓存,就立马返回了。比如,写文件的时候,实际上是写入到文件系统的缓存就返回了,并不会写磁盘。

但是带来的问题是,数据不是强一致性的,而且会有数据丢失的风险,因为缓存一般使用内存,而内存是非持久化的,所以一旦缓存机器掉电,就会造成原本缓存中的脏数据丢失。所以你会发现系统在掉电之后,之前写入的文件会有部分丢失,就是因为 Page Cache 还没有来得及刷盘造成的。

file
file