小白白话技术之高并发缓存概述

        连接数的概述描述了如何解决连接数的问题,多线程为高并发提供途径,然而到这里还不能停止,虽然我们有很多连接,每个连接也有线程在处理,但是如果每个线程处理时间太长也是不可接受的,同样会验证影响应用的处理能力,影响并发能力。那么怎么降低每个程序的执行时间呢,其中一个重要的方面就是降低资源IO的开销,比如采用缓存,这里就缓存进行一个概要介绍。

我们知道,从IO角度去考虑,CPU寄存器的最快,L1、L2、L3,接着是内存,最后是磁盘,当然磁盘也是有缓存的。借用网上一张图片(本图来源于网上)

所以,如果想要快,就使用更快的缓存,但是缓存也是有瓶颈的比如成本,容量大小等,所以应用层面更多考虑的是使用内存,即本地缓存,和分布式缓存。

这里关注的是缓存是用来加速访问的,但内存必定不是存储数据的地方,所以终究一些数据要考虑永久存储的,这就引来了数据存储与内存数据之间关系的问题。还有如何保证缓存数据被存储下来,如何保证存储数据能够被缓存中访问到,如何保证存储数据和缓存数据一致,如何保证有限的内存不被刷爆甚至如何保证缓存的问题带来存储数据的巨大压力带来的相关问题得到有效预防。

怎么做呢?首先要将需要存储的数据持久化,比如同步到数据库,同步到文件中等等,要建立评估数据被访问到的指标就是缓存命中率,通过提高缓存命中率来保证数据能被及时访问到,通过一定的机制来保证存储数据的一致性,通过缓存回收策略来保证内存不被刷爆,最后通过一些机制来预防缓存对存储数据的压力。

这里先介绍几个基本的概念与机制,

  1. 缓存命中率的计算,等于从缓存中读取的次数/总读取次数(指缓存的次数加慢介质的次数)
  2. 缓存回收策略,基于空间加回收算法、基于容量加回收算法、基于时间如存活期TTL,空闲期TTI,回收算法有FIFO先进先出、LRU最近最少使用、LFU最不常用等。
  3. 缓存使用模式

Cache-Aside和Cache-as-sor

缓存的内容的很多,如redis\ehcache\Guava Cache这些缓存技术以及MYSQL,实现多级缓存。

应用层面的多级缓存顺序是本地缓存如ehcache、guava cache,然后是分布式缓存如redis、memcache等。如何应用好缓存,可以用于特定场景特定数据,也可以建立一个缓存层,整个应用都围绕缓存来开发。解决缓存redis与mysql的同步问题,一个可以由业务来保证,也可以由专门设计的组件来完成。缓存问题带来的存储问题一般有这几个,缓存雪崩、缓存穿透、缓存并发、缓存击穿,需要采用一些策略规避这些问题。

什么事缓存穿透呢?

redis的缓存穿透是指查询一个数据库不存在的数据,一个正常的操作是用户查询数据首先查看redis缓存是否存在数据,不存在则查询数据库,查询出有数据则放入redis缓存,下次直接读取redis缓存,避免频繁读取数据库进行IO.如果我们查询一个不存在的数据,则会造成一直读取数据库,如果有人恶意攻击,则会造成数据库压力过大,甚至压垮服务器,这就是所谓的缓存穿透. 怎么解决呢,比如如果查询出的数据为空,也放入redis缓存,只是缓存时间设置短一些.

什么是缓存雪崩呢?

redis缓存放入大量的key,然后在某个时间点缓存集中过期失效.此刻就会造成大量的请求过来都会去同时查询数据库,而不走redis缓存,数据库压力陡增,在秒杀,双11等场景下,很容易压垮服务器.怎么解决呢,比如缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。如果缓存数据库是分布式部署,将热点数据均匀分布在不同的缓存数据库中。设置热点数据永远不过期.

什么是缓存击穿呢?

在某些特殊节点,一个热点数据被频繁访问,在失效的瞬间就会有大量的请求进来,导致部分越过缓存去读取数据库,在多线程高并发情况下,更为常见. 怎么解决呢,比如 双重校验(Dubbo Check)类似线程安全的懒汉单例模式实现,保证只会有一个线程去访问数据库

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值