一、为什么要使用缓存
-
高性能 在频繁访问不改变的数据场景中,频繁访问数据库会带来较高的延时,使用缓存可以提升百倍性能
-
高并发 单机MySQL的QPS推荐是不超过2000,而Redis可以达到10W+的QPS
使用缓存会有哪些问题,有何解决方案
1. 缓存与数据库双写不一致
(1)串行化:
读请求和写请求串行化,串到一个内存队列里去
串行化能保证一定不会出现不一致的情况,但是也会导致系统的吞吐量大幅度降低
(2)Cache Aside Pattern:
读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应
更新的时候,先更新数据库,然后再删除缓存。
- 为什么是删除缓存不是更新缓存?
1、很多时候,在复杂点的缓存场景,缓存不单单是数据库中直接取出来的值。
2、更新缓存的代价有时候是很高,频繁更新的缓存可能是冷数据
缓存不一致问题及解决方案
-
问题:先更新数据库,再删除缓存。如果删除缓存失败了,那么会导致数据库中是新数据,缓存中是旧数据,数据就出现了不一致。
解决思路:先删除缓存,再更新数据库。如果数据库更新失败了,那么数据库中是旧数据,缓存中是空的,那么数据不会不一致。 因为读的时候缓存没有,所以去读了数据库中的旧数据,然后更新到缓存中。
-
数据发生了变更,先删除了缓存,然后要去修改数据库,此时还没修改。一个请求过来,去读缓存,发现缓存空了,去查询数据库,查到了修改前的旧数据,放到了缓存中。随后数据变更的程序完成了数据库的修改。数据库和缓存中的数据不一样了…
2. 缓存雪崩、缓存穿透、缓存击穿
3. 缓存并发竞争
使用缓存有哪些注意的地方
-
Key的生成规则 Redis推荐的Key生成规则:
-
合理的数据结构
-
缓存时间
Redis使用场景有哪些?
- 缓存
- 分布式锁
- 计数器
- 消息队列
- 社交关系
Redis和其他缓存框架的区别
Redis为什么高性能?
- 纯内存操作
- 核心是基于非阻塞的 IO 多路复用机制
- 单线程反而避免了多线程的频繁上下文切换问题