为什么用Redis 作缓存?
这里拿MySQL 举例,MySQL 数据是存储在硬盘上的,虽然MySQL 有查询缓存,但在查询数据时不可避免的会读盘载入数据,写入数据更是不可避免进行磁盘I/O 这之间的耗时比Redis多得多。在应对海量事务请求时MySQL 自然无法承受,Redis 舍弃MySQL 数据更可靠高持久化的特点直接将所有数据存储在内存中,换来了比MySQL高 数十倍的事务性能(QPS),所以用Redis 作缓存是一个合理的 方案.
Redis 缓存的几种模式
Cache aside (旁路缓存)
最常见的模式了,直接把Redis 当作 后端数据库的 查询buffer, 客户直接请求 redis 服务查数据. client -> redis
Read through (读穿透)
在旁路缓存的模式上加入一层代理服务(也就所谓的数据服务),客户不直接请求redis, 而是向代理服务 请求插数据,代理服务从redis 或者从后端数据库(缓存击穿) 拿数据返回给客户
Write through (写穿透)
跟上面读穿一样,只不过是写业务代理,写入顺序和 (write back)异步写入 相反,先写数据库,在同步缓存。客户端写请求不直接给后端数据库或者Redis 而是向代理发送写请求,有代理操作Redis 和 后端数据库.
Write-Behind[write back] (异步写入)
和写穿相反,先写缓存,在异步更新数据库。也是由代理服务器完成,可以说是上面写穿的变种.
异步写入后端数据库可以作写入请求合并、定时写入、批量写入...
优缺点分析
旁路
缺点: 编码工作较其他三种稍复杂一点,因为需要分别与缓存服务和后端数据服务通讯
优点: 直接和数据服务本身通讯对比其他三种省去中间商延迟
代理(读/写穿、异步写回)
优点:资源统一管理,客户只需要找代理服务就行,不用向旁路一样还需要去操作后端数据库
缺点:代理服务很可能为关键节点,出现延迟不可避免。或者说中间多了一层链路传输,延迟会增加。
谁先更新?
这部分说的是,数据变更是先更新后端数据库还是先更新缓存.
这里得看数据一致性要求,如果对数据一致性要求不那么严格,比如排行榜之类的,可以先更缓存,再写后端数据库
要求比较严格的一致性先更新数据库,再更新缓存,但更新缓存可能会出现时序问题,所以还是删除为妙,否则为了保序带来的工作了可能不小。
怎么更新
现在稳妥的方案是先更新数据库,在删缓存【因为先更新缓存会可能会出现缓存挂了,没写后端数据服务,数据没了...或者网络原因的时序问题导致最终出现问题】。
四种模式怎么选
用的最多的是旁路缓存
银行金融类要求高一致性的,不能忍受数据丢失,对缓存要求及时高,用write through