redis缓存更新策略主要有三种:Cache Aside Pattern、Read/Write Through Pattern、Write Behind Caching Pattern
Cache Aside Pattern(旁路缓存)
Cache Aside策略是最常用的,应用程序直接与「数据库、缓存」交互,并负责对缓存的维护,该策略又可以细分为「读策略」和「写策略」
写策略:先更新数据库中的数据,再删除缓存中的数据
读策略:如果读取的数据命中了缓存,则直接返回数据;如果读取的数据没有命中缓存,则从数据库中读取数据,然后将数据写入到缓存,并且返回给用户。
其中需要注意的是写策略为什么先更新数据库 再删除缓存中的数据,这是因为缓存的写入通常要远远快于数据库的写入,不容易出现缓存和数据库的数据不一致性的问题。这种策略适合读多写少的情况。
Read/Write Through Pattern(读穿 / 写穿)策略
缓存与数据库整合为一个服务,由服务来维护一致性。调用者调用该服务,无需关心缓存一致性问题。应用程序只和缓存交互,不再和数据库交互,而是由缓存和数据库交互。
Read Through 策略:先查询缓存中数据是否存在,如果存在则直接返回,如果不存在,则由缓存组件负责从数据库查询数据,并将结果写入到缓存组件,最后缓存组件将数据返回给应用。
Write Through 策略:当有数据更新的时候,先查询要写入的数据在缓存中是否已经存在:
- 如果缓存中数据已经存在,则更新缓存中的数据,并且由缓存组件同步更新到数据库中,然后缓存组件告知应用程序更新完成
- 如果缓存中数据不存在,直接更新数据库,然后返回
Write Behind Caching Pattern(写回)策略
调用者只操作缓存,由其他线程异步的将缓存数据持久化到数据库,保证最终一致。
实际上,这种策略也不能应用到我们常用的数据库和缓存的场景中,因为 Redis 并没有异步更新数据库的功能
这种策略适合于写多读少的情况,CPU 的缓存、操作系统中文件系统的缓存都使用了这种策略。