作者:不清不慎,Java大数据开发工程师一枚,热爱研究开源技术! 架构师社区合伙人!
一、什么是缓冲区,与缓存的区别?
首先简单的说下什么是缓存,缓冲的目的的是用来缓解应用程序上下层之间的性能差异,从而提高系统的性能。
缓存是为了提高数据的访问性能,存放经常访问的数据以便于提高系统的性能。
简单来说,而这都是为了提高系统的性能。但是它们之间存在着本质的差别:
对于缓存它也可以消除上下层之间的速度不匹配的情况,最常见的在我们的计算机中,最早的计算机CPU直接和磁盘进行交互,但是磁盘的发展赶不上CPU的发展速度,为了均衡两者之间访问速度的巨大差异,引入了内存,但是在后来内存的发展赶不上CPU的发展,进而引入了CPU L1缓存,L2缓存,L3缓存等等。在java内部也有缓存,最明显的莫过于HashMap,从其本质出发,缓存的出现不仅是为了缓解上下层速度不匹配的情况,更重要的是它是为了提高读性能。在我们常见的分布式系统中,我们常常需要考虑缓存的架构,比如使用Redis等等,当然,缓存也不能随意使用,需要根据场合仔细考虑,防止出现缓存击穿,缓存穿透,缓存雪崩以及数据不一致性等问题。
对于缓冲区,我们常常会听说缓冲区溢出这些词,即缓冲区需要考虑合适的大小,过小的缓存达不到缓冲区的效果,过大的内存只会增加系统的资源消耗与回收成本,在java中自带一些Buffer,它方便了开发者的使用,从其本质出现,缓冲区可以协调上下层之间的性能差异,而且也可以提高写性能。当然也可以提高读性能。最为常见的就是当我们在频繁的写数据的时候,经常会设置一些缓冲区,当达到一定大小的时候才会去刷新到磁盘,这样就避免了频繁的直接与磁盘进行操作,增加IO负载,提高系统的性能,很多优秀的开源框架都使用了这一机制。
2.Java中缓冲区的使用
在Java中,它为我们提供了两种类型的Buffer,一种是堆内Buffer,另外一种是堆外(Direct)Buffer。
在java中为我们提供了7个基本的缓冲区,分别由7个类来管理,位于java.nio包下,分为为ByteBuffer,ShortBuffer,IntBuffer,CharBuffer,FloatBuffer,DoubleBuffer,LongBuffer。它们都是抽象类。
上