class LocalFileStoreApp class CachedFileStore CACHE_SIZE=30000 DEFAULT_WRITE_DELAY=30 def initialize(store,writeDelay=nil,cacheSize=nil) @writeDelay=writeDelay @writeDelay||=DEFAULT_WRITE_DELAY @cacheSize=cacheSize @cacheSize||=CACHE_SIZE @store=store @dataCache={} @dataAccessTime={} @dataWriteTime={} @lastWrite=nil @mutex=Mutex.new end def []=(name,value) @mutex.synchronize { @dataCache[name]=value @dataAccessTime[name]=Time.now @dataWriteTime[name]=Time.now checkWriteCache } end def [](name) @mutex.synchronize { unless @dataCache.key?(name) @dataCache[name]=@store[name] @dataAccessTime[name]=Time.now end d=@dataCache[name] checkWriteCache d } end def rm(name) @store.rm(name) end def flush @mutex.synchronize { oldDelay=@writeDela @writeDelay=-10000 checkWriteCache @writeDelay=oldDelay assert { @dataWriteTime.length==0} } end private def checkWriteCache @dataWriteTime.each{|k,v| if v@cacheSize # remove least recently accessed leastTime=@dataAccessTime.values.min keys=@dataAccessTime.keys.select{|k|@dataAccessTime[k]<=leastTime} keys.each{|key| unless @dataWriteTime.key?(key) removeFromCache(key) end } end end def removeFromCache(key) @dataCache.delete(key) @dataAccessTime.delete(key) @dataWriteTime.delete(key) end end end