一、redis 缓存常用的三种模式和为什么需要外部缓存?

redis

  1. 如何保证缓存与数据库的双写一致性
  2. 严格要求一致性:采用读请求和写请求串行化,串到一个内存队列去,会导致内存吞吐量降低
  3. 不严格要求
    1. cache aside pattern
      1. 读的时候先读缓存,缓存没有,读取数据库,放入缓存,返回相应
      2. 更新先更新数据库(锁表),再删除缓存,缓存设置过期时间
        1. 为什么删除,缓存不仅仅是数据库数据,
        2. 更新缓存代价比较好,不频繁数据不需要更新,两个并发写导致脏数据
        3. 有可能存在写多读少情况,有懒加载思想
      3. 问题:删除缓存失败,缓存中老数据,数据库中新数据
        1. 先删除缓存,在更新数据库,并发高也有问题,加锁,
        2. 设置过期时间,允许短时不一致
      4. 复杂数据不一致,上亿流量并发,每秒1万读请求,只要1s有写数据请求,就会出现问题
    2. read /write through pattern
      1. read through
        1. 读取数据,缓存中存在返回,缓存不存在,由缓存组件自己加载缓存,返回
      2. write through
        1. 写数据,如果,缓存失效,更新数据库,返回,如果缓存不失效,更新缓存,又缓存组件自己同步更新数据库
    3. write behind cache pattern
      1. write
        1. 写数据,直接更新缓存由缓存组件异步更新数据库,这样数据io操作非常快,而且可以合并多个更新请求
        2. 缺点:服务器宕机,数据丢失,逻辑复杂
    4. 为什么需要分布式缓存(redis)
      1. 本地缓存占用内存空间大
      2. 一个service多个机器集群部署,负载均衡器发个同一个请求到不同实例,每个实例会建立缓存,浪费
      3. 分布式系统需要有一个外部缓存,要求内存足够大,io密集型
      4. 内存大,可以利用数据分片技术,把缓存分不到不同机器,可以无限扩内存
        1. 命中率,80%算是高
        2. 缓存牺牲了强一致性
        3. 缓存过期时间也要设计好,太长浪费内存,太短热点数据频繁更新内存,采用lru
        4. 爬虫保护机制
    5. 为什么需要外部缓存,数据库不是有缓存吗?
      1. 我对mysql比较熟悉,这里说一下
1、 mysql第一种缓存叫sql语句结果缓存,但条件比较苛刻,程序员不可控,
    我们的dba线上都关闭这个功能,具体实现可以查一下
2、mysql第二种缓存是innodb buffer pool,缓存的是磁盘上的分页数据,不是sql的查询结果,
   sql的执行过程省不了。而mc,redis这些实际上都是缓存sql的结果,两种缓存方式,性能差很远。
因此,可控性,性能是数据库缓存和独立缓存的主要区别
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值