缓存----学习总结
1:什么是缓存,缓存有什么作用,缓存在什么情况下使用?
系统设计中,有一些比较耗时的操作,比如读取数据库,如果将数据库中的数据放到内存中,这样不用每次查询都去查询数据库。类似于这种将数据放到内存或者硬盘上的操作,我称之为缓存。
目前,我能想到的缓存使用情景如下:1 页面访问较慢,并且页面访问的内容很少更新。2 页面访问较慢,并且页面对实时性的要求不高,维护的数据不要求能立刻看到,2分钟后看到,1小时后看到,1天后看到可以接受。3:页面访问较慢,并发量很大。
2:java里的缓存解决方案,缓存如何实现?一些核心参数如何配置?
Ehcache :Hibernate用它,Spring也提供对它的支持,网上说它也一直有人维护。所以咱也用它。
学习一门技术从实例开始,一来容易建立信息,二来可操作可以看到的东西能够给人形象易懂的印象。Ehcache也是这样。
这个demo模拟了一个查询,如果不使用缓存,大概需要3秒的时间(使用了sleep模拟),使用了缓存后就会变的很快。可以在页面上看到每次查询的时间,和服务器已经缓存的数据,也可以看到缓存的配置,界面如下:
缓存的配置文件及注释如下:
<?xml version="1.0" encoding="UTF-8"?> <!-- maxElementsInMemory: 缓存最大数目 eternal:缓存是否持久 overflowToDisk: 意思是表示当缓存中元素的数量超过限制时,就把这些元素持久化 到硬盘,如果overflowToDisk 是false ,那么maxElementsOnDisk 的设置就没有什么意 义了 timeToIdleSeconds:当缓存闲置n 秒后销毁 timeToLiveSeconds:当缓存存活n 秒后销毁 memoryStoreEvictionPolicy: ehcache 中缓存的3 种清空策略: 1 FIFO,first in first out,这个是大家最熟的,先进先出,不多讲了 2 LFU, Less Frequently Used,就是上面例子中使用的策略,直白一点就是讲一直以来 最少被使用的。如上面所讲,缓存的元素有一个hit 属性,hit 值最小的将会被清出缓存。 2 LRU,Least Recently Used,最近最少使用的,缓存的元素有一个时间戳,当缓存容量 满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时 间最远的元素将被清出缓存。 : --> <ehcache name="ColorCache"> <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" diskSpoolBufferSizeMB="30" maxElementsOnDisk="10000000" diskPersistent="false" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU"/> <cache name="colors" maxElementsInMemory="100" maxElementsOnDisk="0" eternal="false" timeToIdleSeconds="20" timeToLiveSeconds="0" memoryStoreEvictionPolicy="LFU"> </cache> </ehcache>
一些感悟:
在工作中需要有一定的知识面,当需要某种东西,你需要知道它,问题的关键是你需要知道到什么程度。如果知道的太多,会花费大量的时间并且以后可能你也不会用得到而会忘记,如果知道的太少,则跟不知道没什么区别,提不出什么建设性的意见。所以一个基本的demo是刚刚满足要求的做法。