Liferay Dynamic CSS Filter方法的研究 - 计算资源文件的缓存base名

简介:

现在我们接着上文章讨论来解决疑问2:如何计算缓存base文件名.


引入:

当我们在上文中获取了资源文件在Liferay服务器上的真实路径后,下面一步就是获取缓存文件,当然了,最重要的一步是获取其base文件名,从上文结果看,这是一串很长的数字,


这里就是来分析这段数字得到的奥秘。


分析:

这个base名是通过以下调用:

String cacheCommonFileName = getCacheFileName(request);获得的。

我们来看下getCacheFileName()方法:

1
2
3
4
5
6
7
8
9
10
11
12
protected  String getCacheFileName(HttpServletRequest request) {
         CacheKeyGenerator cacheKeyGenerator =
             CacheKeyGeneratorUtil.getCacheKeyGenerator(
                 DynamicCSSFilter. class .getName());
         cacheKeyGenerator.append(request.getRequestURI());
         String queryString = request.getQueryString();
         if  (queryString !=  null ) {
             cacheKeyGenerator.append(sterilizeQueryString(queryString));
         }
         String cacheKey = String.valueOf(cacheKeyGenerator.finish());
         return  _tempDir.concat(StringPool.SLASH).concat(cacheKey);
     }


从这里可以看出,

(1)它首先是在第3行通过CacheKeyGeneratorUtil工具类来获取一个cacheKey产生器。

这里可以看出,它是一个HashCodeCacheKeyGenerator的实例。


然后第5行吧请求的requestURI附加到cacheKeyGenerator后面,实际是附加到cacheKeyGenerator的keyBundler中:


接下来,第6行从Request中获取查询字符串,这其中包括了一些浏览器信息,theme的Id之类信息:


然后第9行对于查询字符串进行sterilize处理:

说白了,这步骤作用就是消除平台差异,它吧所有查询字符串中的"/"和"\\"都替换为下划线"_":

最后吧sterilize后的字符串也拼接在cacheKeyGenerator的keyBundler后面。


最后第11行,它调用cacheKeyGenerator的finish()方法产生一个hash值,它委托HashcodeCacheKeyGenerator的getCacheKey()完成的,基本算法也是素数和一些hashCode的简单运算,不过基本可以保证唯一性:


最后,它12行,它吧这个产生的哈希数串和临时文件目录拼接在一起产生最终的缓存文件的base文件。

其中_tempDir这个值是SystemProperties中读取"SystemProperties.TMP_DIR"读来的,然后拼接/liferay/css字符串。

查阅后发现SystemProperties.TMP_DIR为字符串"java.io.tmpdir":

它会去先从system.properties和system-ext.properties中找java.io.tmpdir对应的值,如果没有则从环境中找。因为我们在启动liferay中配置了java.io.tmpdir,


深究下去其实对应的脚本在catalina.sh中:

这里可以看出它动态的传递了-Djava.io.tmpdir 为$CATALINA_TMPDIR


所以很快的就找到了结果是/app/Liferay/RI/liferay-portal-6.1.0-ce-ga1/tomcat-7.0.23/temp 目录。


这也和调试的结果匹配.


所以综上所述,我们获取的第12行的_tempDir就是上面的app/Liferay/RI/liferay-portal-6.1.0-ce-ga1/tomcat-7.0.23/temp 再拼接 /liferay/css/portal,然后再在后面拼接上我们的Hash值,这就形成了最终的缓存文件的base文件名。


所以最终结果是:


结论:

(1)缓存文件的文件名是一个hash值,它是由文件名,浏览器类型,themeId共同参与hash运算得到了。基本保证唯一性。

(2)缓存的文件的位置来自于动态的系统参数java.io.tmpdir,这个参数是由liferay启动时候提供的,在tomcat的temp目录。





本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/1282819,如需转载请自行联系原作者
目录
相关文章
|
3月前
|
前端开发
在Webpack配置文件中,如何配置loader以处理其他类型的文件,如CSS或图片
在Webpack配置文件中,通过设置`module.rules`来配置loader处理不同类型的文件。例如,使用`css-loader`和`style-loader`处理CSS文件,使用`file-loader`或`url-loader`处理图片等资源文件。配置示例:在`rules`数组中添加对应规则,指定`test`匹配文件类型,`use`指定使用的loader。
|
8天前
|
存储 数据挖掘 虚拟化
vsan数据恢复—vsan缓存盘故障导致虚拟机磁盘文件丢失的数据恢复案例
VMware vsan架构采用2+1模式。每台设备只有一个磁盘组(7+1),缓存盘的大小为240GB,容量盘的大小为1.2TB。 由于其中一台主机(0号组设备)的缓存盘出现故障,导致VMware虚拟化环境中搭建的2台虚拟机的磁盘文件(vmdk)丢失。
|
25天前
|
缓存 NoSQL Java
springboot怎么使用rides缓存方法的返回值 完整例子
通过上述步骤,我们成功地在 Spring Boot 项目中集成了 Redis 缓存,并通过注解的方式实现了方法返回值的缓存。这种方式不仅提高了系统的性能,还简化了缓存管理的复杂度。使用 Spring Boot 的缓存注解和 Redis,可以轻松地实现高效、可靠的缓存机制。
62 23
|
4月前
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
140 15
Android 系统缓存扫描与清理方法分析
|
3月前
|
存储 缓存 监控
利用 Redis 缓存特性避免缓存穿透的策略与方法
【10月更文挑战第23天】通过以上对利用 Redis 缓存特性避免缓存穿透的详细阐述,我们对这一策略有了更深入的理解。在实际应用中,我们需要根据具体情况灵活运用这些方法,并结合其他技术手段,共同保障系统的稳定和高效运行。同时,要不断关注 Redis 缓存特性的发展和变化,及时调整策略,以应对不断出现的新挑战。
94 10
|
3月前
|
缓存 监控 前端开发
CSS 提高性能的方法
【10月更文挑战第24天】在实际应用中,还需要根据具体项目的特点和需求,灵活选择和组合这些方法,不断进行优化和改进。同时,随着技术的不断发展,也需要持续关注新的性能优化技巧和最佳实践,以保持在性能优化方面的领先地位。你对 CSS 性能优化还有哪些深入的思考和经验呢?欢迎进一步交流和分享。
|
3月前
|
缓存 监控 NoSQL
Redis 缓存穿透的检测方法与分析
【10月更文挑战第23天】通过以上对 Redis 缓存穿透检测方法的深入探讨,我们对如何及时发现和处理这一问题有了更全面的认识。在实际应用中,我们需要综合运用多种检测手段,并结合业务场景和实际情况进行分析,以确保能够准确、及时地检测到缓存穿透现象,并采取有效的措施加以解决。同时,要不断优化和改进检测方法,提高检测的准确性和效率,为系统的稳定运行提供有力保障。
80 5
|
3月前
|
前端开发
css页面顶部底部固定,中间自适应几种方法
【10月更文挑战第22天】css页面顶部底部固定,中间自适应几种方法
|
4月前
|
SQL 缓存 Java
JVM知识体系学习三:class文件初始化过程、硬件层数据一致性(硬件层)、缓存行、指令乱序执行问题、如何保证不乱序(volatile等)
这篇文章详细介绍了JVM中类文件的初始化过程、硬件层面的数据一致性问题、缓存行和伪共享、指令乱序执行问题,以及如何通过`volatile`关键字和`synchronized`关键字来保证数据的有序性和可见性。
67 3
|
4月前
|
前端开发 容器
CSS 中几种常用的换行方法
CSS 中几种常用的换行方法
50 1