java中的缓冲流是缓存在哪里?
1.计算机访问外部设备或文件,要比直接访问内存慢的多。如果我们每次调用read()方法或者writer()方法访问外部的设备或文件,CPU就要花上最多的时间是在等外部设备响应,而不是数据处理。
2.我们开辟一个内存缓冲区的内存区域,程序每次调用read()方法或writer()方法都是读写在这个缓冲区中。
3.当这个缓冲区被装满后,系统才将这个缓冲区的内容一次集中写到外部设备或读取进来给CPU。
4.使用缓冲区可以有效的提高CPU的使用率,能提高整个计算机系统的效率。在字符流操作中,所有的字符都是在内存中形成的,在字符流输出前都将保存在内存中的缓冲区内。
缓冲流:
再读写数据时,让数据在缓缓冲区能减少系统实际对原始数据来源的存取次数,因为一次能做多个数据单位的操作,相较而言,对于从文件读取数据或将数据写入文件,比起缓冲区的读写要慢多了。所以使用缓冲区的 流,一般都会比没有缓冲区的流效率更高,拥有缓冲区的流别称为缓冲流,包括BufferedInputStream、BufferedOutputStream类和BufferedReader、BufferedWriter类。缓冲流把数据从原始流成块读入或把数据积累到一个大数据块后再成批写出,通过减少通过资源的读写次数来加快程序的执行。
Java程序员面试中被问到缓存问题要如何解决?
缓存的面试问题
缓存的面试问题有很多,我个人总结大概有下面几点,你可以从这些方面作为面试参考。
1.为什么选用缓存?这个可以高性能高并发的方面回答面试官,由于缓存数据存储在内存中,其相对IO操作要快的多,而且内存天然就支撑高并发。
2.使用缓存做了什么?这个根据自己的项目的业务场景去回答,比如应对高并发访问热点数据,减轻数据库的压力;比如充当分布式锁,保证线程安全;比如充当消息队列;比如充当计数器;比如解决分布式应用中的共享Session问题。
3.缓存为什么快?可以从下面几点去回答:首先其数据存储在内存中,其次采用单线程避免上下文切换,还有使用多路I/O复用模型,非阻塞IO,以及一些底层的模型设计。
4.缓存的数据备份问题?这里可以有以下的相关问题,比如备份方式:Redis默认采用Rdb方式备份,符合设定的条件时redis会将内存中的所有数据自动生成一份副本保存到硬盘上,可以通过配置文件开启AOF备份。比如两种备份的区别:AOF持久化保存的数据更完整一些,但是同时会带来性能上的损耗。
5.缓存穿透问题?访问一个不存在的 key,缓存不起作用,请求会落到数据库上,如果请求量很大,数据库有可能会挂掉。解决方案:缓存空值,布隆过滤器,互斥锁排队。
6.缓存雪崩问题?缓存在同一时间内大量键过期(失效),接着来的一大波请求瞬间都落在了数据库中导致连接异常。解决方案:互斥锁排队,分散失效时间。
7.缓存无底洞问题?集群节点加机器性能没能提升,反而下降。解决方案:采用哈希一致性办法,将特定数据存在指定的缓存
希望我的回答对你有所帮助