ehcache2.4源码分析 - 持久化

ehcache2.4源码分析 ---- 持久化
参数:
overflowToDisk="true"  当为true时会持久化到硬盘,并非超出内存最大数时才会
diskPersistent="true"  当为false时,manager.shutdown()时会清空硬盘文件,下次启动时不会读取。为true时,manager.shutdown()时会保留硬盘文件,下次启动会读取。

当缓存为可持久化时,会用到这个工具
net.sf.ehcache.store.disk.DiskStorageFactory
protected DiskMarker write(Element element) throws IOException
protected Element read(DiskMarker marker) throws IOException, ClassNotFoundException

写的时候,put内存成功后,比如当前硬盘文件为空,则data文件的末尾position=0,element序列化后,用java.io.RandomAccessFile把内容异步写进硬盘。同时内存中data文件的末尾position+内容的size,而本element的position和size将会在内存中记录。如果不为空,则从内存中读出当前的data文件的末尾position来用。

data文件的末尾position这个值,他维护了一棵所有position组成的AA树。从这个树里找到最大的返回。我没看明白这个树有什么毛用,可能是为了以后的功能而预先写在这里的吧。也许在更高的版本里就有用了

当manager.shutdown()时,先生成一个XXX.index文件,把内存中记录的所有element的position和size都写进这个文件里。同时data文件的末尾position也会写进去。

当启动的时候,首先会把XXX.index里的内存全部加进内存,这相当于一个索引嘛。
当你get key='asd'时,先看索引里有没有asd,没有则不查硬盘data,有则先看内存中有无本element,有则取出返回,没有则取出其position和size,把data中的相应内容读出。先缓存到内存,再return.


我那天在网上看到有些朋友想用ehcache代替nosql,看了我上面的文章后,你不要再做这事了。这两种东西完全不是一个级别的东西。ehcache就是个缓存,没啥安全措施等数据库要有的特性。也存不了特大的文件。