不才,笔者第一次学习缓存,是在学习redis的时候,是在培训班学习了一些java的启蒙知识。但是在后来的深入学习之后,对缓存又有了新的认识。
1.池的思想。比如java的各种池,常量池,线程池,句柄池,连接池,池的思想也是源于缓存,就是把一些需要反复建立的对象从一个空间***搬***到一个更快更容易获取的空间,减少了因为对象的建立而导致的等待时间,也减少了反复新建一个对象的资源和空间。
2.Java的包装类也有自己的缓存数据,所以包装类的比较也是用equals,而不是“==”,比较的实际内容,而不是实际的堆内地址。
3.JIT(即时编译器)也会把热点代码(超过规定的阈值)放到本地内存,而不是反复的使用使用解释器反复编译,而是使用编译器把热点代码编译放到缓存,提升后续的编译效率。这个思想其实也启发了我在实际工作中对一些程序的优化思考。比如说,在程序中做一些埋点动作来记录一些数据和对象的出现次数,达到一定阈值后,可以考虑把这些热点数据存到redis或者本地HashMap,LinkedHashMap中来提高程序整体性能,也减少了堆的空间,减少JVM参数优化的必要。
4.Mybatis也有的自己的一级缓存和二级缓存,把第一次查询结构缓存到sqlsession和namespace中,实际上我们的Mysql的InnoDB存储引擎也暖心的增加了自己的缓存,所以实际上sqlssion级别的缓存只能提升一些ORM转换,和连接池建立的时间,实际上的sql查询已经被innoDB缓存了。
5.redis把硬盘的数据拿到了内存中,提升了服务器拿数据的效率,也减少了反复请求服务器,导致数据从硬盘上由文件转化为流的IO压力较大。
但是滥用缓存也会导致很多问题。缓存适用与不太经常变化的数据,如果数据变化太快,而导致缓存数据没即时跟新,将会导致一些数据不一致性的问题。缓存和索引一样,如果程序或者服务器本身获取数据就很快,缓存或者索引就失去了存在的必要性,反而会浪费空间和资源。
文笔有限,仅做读后感而写。