美文网首页
高并发基础之缓存

高并发基础之缓存

作者: 被咬过的馒头 | 来源:发表于2020-05-05 17:02 被阅读0次

1 基于缓存的思考

1.1 引入缓存引发的问题
  1. 缓存和数据库信息不一致

解决方案:读的时候先读缓存,如果缓存没有就到数据库取数据做相应处理然后放入缓存,更新的时候先删除缓存后更新数据库。

理由:①删除缓存的原因是如果是更新缓存对于要缓存的数据可能需要经过多重处理,而如果该缓存后续没有被使用到将会是一种浪费资源。②先删除缓存后更新数据库的原因是如果反过来在程序半路崩溃的情况数据库中为新数据而缓存中还是旧数据会导致数据不一致,而先删除缓存可以保证基本的数据一致就算中途崩溃最后也是缓存中没有数据,数据库为旧数据的情况)

缺点:极端情况下,先删除缓存后更新数据库的时候可能会有读请求进来,然后读请求读取数据库中的旧数据并且更新缓存,最后导致数据库中为新数据,而缓存为旧数据

改进(如果要求强一致):对于同一个key的更新和读取同时进行的情况串行化,串行化的方式可以采用内部队列的方式,这个看具体情况变通

  1. 缓存雪崩

引发原因:①数据批量到期②缓存机器宕机了,从而流量全部落在数据库,重点的是批量

解决方案:①利用主从+哨兵机制建立集群让缓存变得高可用减少宕机引发的雪崩情况,并且做好持久化工作便于宕机快速恢复,②批量到期可能选择将到期时间随机生成并分散开来,并且分析热点数据设置永不过期,但是从整体角度讲可以使用hystrix进行限流和降级通过牺牲请求执行率,确保数据库正常提供服务

  1. 缓存穿透

引发原因:大量请求既不存在缓存中也不存在db中的key,重点是不存在的key

解决方案:①在搜寻db中没有的数据时默认返回一个空并且进行缓存处理②利用布隆过滤器,通过布隆过滤器可以在一定程度上过滤掉不存在的数据,但是也会有一些无法被过滤(有可能出现不同key但是hash出来的值相同),再和第一个方案结合一下就行

  1. 缓存击穿

引发原因:热点key缓存失效或者更新db删除缓存导致请求直接请求db,重点是热点

解决方案:缓存失效可以通过①设置该key永不过期②线程定时刷新过期时间解决,更新数据导致的缓存失效可以通过①对需要更新数据时的时访问db的操作加互斥锁解决(缺点是在更新很频繁的时候,需要不停的阻塞可能效果不大好)

  1. 缓存并发竞争key

引发原因:多客户端同时对一个redis服务进行set同一个数据时,由于顺序错误导致修改的最终结果错误

解决方案:利用分布式锁,①利用redis中的setnx获取锁保证同一时刻只有一个客户端执行,加上时间作为判断标准保证后面改变的值不会被前面的改变操作覆盖,②利用zookeeper获取临时节点,按照获取节点的顺序从小到大顺序执行,当执行完成删除节点

1.2 通过确定QPS判断是否需要引入缓存

QPS计算:QPS(TPS)= 并发数/平均响应时间 或者 并发数 = QPS*平均响应时间

简单的例子:假设一个系统峰值为10分钟,用户量有1000
qps为1000/(10*60)
平均响应时间1(s)
并发数为1.66
大致流程就是计算用户量->确定峰值->确定响应时间->确定并发数,当然实际情况可能复杂一点对于峰值的计算可能也没有规律可循,在有些情况下要提到qps但是并发数已经到了瓶颈就需要通过减少相应时间来解决问题,这时候就可以考虑引入缓存。

相关文章

  • 高并发基础之缓存

    1 基于缓存的思考 1.1 引入缓存引发的问题 缓存和数据库信息不一致 解决方案:读的时候先读缓存,如果缓存没有就...

  • 高并发与缓存

    本文主要讲述高并发下缓存会出现的问题。 在高并发下,缓存会出现的问题有:缓存一致性、并发问题、穿透问题、缓存的雪崩...

  • 高并发缓存架构:总览

    在高并发里面,缓存结构是不可避免的。 要搭建高可用,高并发的系统,需要一个复杂的缓存架构。 在高并发的时候,会遇到...

  • 14 高并发之缓存

    1️⃣缓存简介 在现在互联网的环境下,内容越来越复杂用户越来越多而服务的资源是有限的,数据库一定时间内能处理的请求...

  • Java 高并发之缓存

    Java并发编程与高并发解决方案 https://coding.imooc.com/class/195.html ...

  • 高并发扩容之缓存

    缓存 缓存 Guava Cache 学习redis网站 redis.cn RedisConfig RedisCli...

  • Java并发与高并发总结

    Java 并发和高并发 ava 多线程模块: 并发的基本概念: CPU 多级缓存 Cpu多级缓存的意义? Cpu对...

  • 【redis】四、常见问题

    Redis用作缓存,主要两个用途:高性能,高并发,因为内存天然支持高并发 一.缓存穿透: 缓存穿透是指查询一个一定...

  • 高并发秒杀API(六)

    前言 本篇将完成高并发优化,包括: Redis后端缓存优化 并发优化 一、高并发优化分析 在优化之前要明白高并发发...

  • 中并发控制(数据库)

    什么叫中等并发?不是高并发,不是低并发 并发度说明举?典型方案高并发短时间内的大量并发冲突秒杀活动redis缓存 ...

网友评论

      本文标题:高并发基础之缓存

      本文链接:https://www.haomeiwen.com/subject/wdzmghtx.html