Redis基础与使用SpringBoot整合Redis
Redis进阶学习之数据持久化
Redis进阶学习之主从复制、读写分离
Redis进阶学习之哨兵模式和分片集群
Redis主从复制集群搭建
Redis哨兵集群搭建
Redis分片集群搭建
Redis使用RedisTemplate配置和访问集群
Redis缓存策略
Redis缓存异常场景分类
Redis缓存读写策略
Redis和数据库如何保证数据的一致,redis有三种缓存策略
1. Cache-Aside(旁路缓存模式)
2. Read/Write Through Pattern(读写穿透)
3. Write-Behind(异步缓存写入)
1. Cache-Aside(旁路缓存模式)
1.1 写操作
先更新数据库的记录,再删除缓存中的旧数据
如果先删再写,会导致数据库和缓存数据不一致(redis的写入速度要快于数据库)
1.2 读
从缓存中读取数据,读取不到再从数据库读取,再将数据库读取的数据同步到缓存中。
缺点
- 首次请求数据一定不在缓存中,则每次第一次请求都会请求数据库。
解决办法:可以将热点数据可以提前放入cache 中。 - 写操作比较频繁的话导致缓存中的数据会被频繁被删除,这样会影响缓存命中率 。
解决办法:
数据库和缓存数据强一致场景 :更新DB的时候同样更新cache,不过我们需要加一个锁/分布式锁来保证更新cache的时候不存在线程安全问题。
可以短暂地允许数据库和缓存数据不一致的场景 :更新DB的时候同样更新cache,但是给缓存加一个比较短的过期时间,这样的话就可以保证即使数据不一致的话影响也比较小。
2. Read/Write Through Pattern(读写穿透)
2.1. 写
以缓存为主体,查询缓存数据,如果查询不到缓存数据则直接更新数据库数据;如果查询到缓存数据,则更新缓存数据,之后再通过缓存的数据更新数据库。
2.2. 读
读取缓存,如果缓存没有则将数据库的数据同步到缓存中,再重新读取缓存。
缺点:首次请求数据一定不再 cache 的问题,对于热点数据可以提前放入缓存中
3. Write Behind Pattern(异步缓存写入)
异步缓存写入和 读写穿透很相似,两者都是由 缓存服务来负责缓存 和 数据库的读写。
不同点
- 读写穿透是同步更新 缓存和数据库
- 异步缓存写入则是只更新缓存,不直接更新数据库,而是改为异步批量的方式来更新数据库。
异步缓存写入对数据一致性带来了更大的挑战,比如缓存数据可能还没异步更新数据库的话,缓存服务可能就就挂掉了。这种策略在我们平时开发过程中也非常非常少见,但是不代表它的应用场景少,比如消息队列中消息的异步写入磁盘、MySQL 的 InnoDB Buffer Pool 机制都用到了这种策略。