Oscache的强行更新机制

原创 2006年06月21日 20:18:00
背景 :
在产品中也许不需要强行更新,但是测试的时候往往需要。

part 1
当你强行更新缓存时会发生如下步骤:
step1)
GeneralCacheAdministrator.flushAll----->

step2)
Cache.flushAll(Date date, String origin)

flushAll的源代码如下:
public void flushAll(Date date, String origin) {
        //更新Cache的flushDateTime
        flushDateTime = date;
        //通知监听器更新事件,如果你没有注册监听器,这个方法没用
        dispatchCachewideEvent(CachewideEventType.CACHE_FLUSHED, date, origin);
    }

也就是说强行更新时仅仅只是修改Cache的flushDateTime 属性
并不是更改数据

part 2
接着你刷新页面看你的强行刷新时候有效果
step1)
Cache.getFromCache(String key, int refreshPeriod, String cronExpiry)---->
step2)
Cache.isStale(cacheEntry, refreshPeriod, cronExpiry)----->

看看isStale源代码:
protected boolean isStale(CacheEntry cacheEntry, int refreshPeriod, String cronExpiry) {
        boolean result = cacheEntry.needsRefresh(refreshPeriod) || isFlushed(cacheEntry);


       //cronExpiry 定义了绝对时间,通常你不会用,所以以下代码没用
        if ((cronExpiry != null) && (cronExpiry.length() > 0)) {
            try {
                FastCronParser parser = new FastCronParser(cronExpiry);
                result = result || parser.hasMoreRecentMatch(cacheEntry.getLastUpdate());
            } catch (ParseException e) {
                log.warn(e);
            }
        }

        return result;
    }

step3)
Cache.isFlushed(CacheEntry cacheEntry)

看看isFlushed源代码:
 public boolean isFlushed(CacheEntry cacheEntry) {
        if (flushDateTime != null) {
            long lastUpdate = cacheEntry.getLastUpdate();

            return (flushDateTime.getTime() >= lastUpdate);
        } else {
            return false;
        }
    }

从上面源代码看出,因为Cache的flushDateTime被更新,所以肯定会大于等于cacheEntry的最后更新时间,所以Cache会认为缓存的数据是stale的,于是从数据库重新取数据。


总而言之:强行更新只是做个标记,并不真正的获取新数据,下次从缓存读数据时,缓存会根据做的标记从数据更新数据,即使还没到更新的时候。

Android 时间更新机制之网络更新时间

综述:Android网络时间更新,大体分两类。1、moderm相关更新,2、网络更新。本次主要介绍android设备网路时间同步。...

coreseek索引更新机制 (如果没有文档被索引,则$maxid会设置为0)

coreseek索引更新机制 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://fatal.blogbus.com/logs/45153968.html   = ...

Log4j2中RollingFile的文件滚动更新机制 一、什么是RollingFile RollingFileAppender是Log4j2中的一种能够实现日志文件滚动更新(rollover)的

http://www.cnblogs.com/yeyang/p/7944899.html Log4j2中RollingFile的文件滚动更新机制 一、什么是RollingFile Rollin...

【UI更新机制】handler

handler是android给我们提供用来更新UI的一套机制,也是一套消息处理机制,我们可以通过它发送消息,也可以通过它处理消息,如果不遵循这样的机制就没有办法更新UI信息的,就会抛出异常信息。Ha...

ui更新机制杂谈

主要是想到了 之前的问题,android 2.2时候 的系统和现在的系统,2.2之前即使直接在子线程更新也是可以的,现在除了个别的控件其他的都要放在主线程里面更新。就分析一下 ProgressBa...

开源一个适用iOS的数据库表结构更新机制的代码

在iOS上,提供一个数据库表结构更新的机制,保证用户无论从哪个版本安装程序,数据库结构保证适配。 如:用户A的数据库版本是v1,用户B是v2,用户C没装过App;现在,所有用户安装并运行最新App(数...

Android更新机制(自己服务器和GooglePlay更新)

本片文章主要介绍了自己服务器更新和GooglePlay更新的解决方案,不包含其他第三方(如Umeng、其他应用市场等)更新...

Android 时间更新机制研究

最近因工作的需要,开始接触到Android系统时间网络同步更新的问题。遇到的实际问题如下:1、手机恢复出厂设置后,系统时间没有及时更新。2、手机使用当中时间同步更新后,时间快了几分钟。3、手机状态栏的...

Android 时间更新机制之RIL更新时间

1、RIL.java CdmaServiceStateTracker以及GsmServiceStateTracker,在系统启动时,会调用如下方式,该方法将Tracher中的Handler与RIL中...

孙鑫VC++深入详解:Lesson6 Part2 -- MFC菜单更新机制 用该机制实现 Enable or Disable MenuItem

MFC菜单命令更新机制---用该机制实现 Enable or Disable  MenuItem 方法: 1)用资源中的菜单项"剪切"的ClassWizard添加一个UPDATE_COMMAND_U...
  • sergery
  • sergery
  • 2013年07月05日 12:22
  • 4038
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Oscache的强行更新机制
举报原因:
原因补充:

(最多只允许输入30个字)