OSCache缓存监控实现

标签: oscache 缓存 监控 | 发表时间:2012-10-08 03:21 | 作者:
出处:http://www.iteye.com

最近一个项目用到OsCache的页面片段缓存,google了一下居然没有找到OsCache的监控工具(list all keys from cache),于是大略读了一下OSCache-2.4.1的源码,发现Cache.java类的cacheMap定义成了私有变量,如下:

 /**
     * The actual cache map. This is where the cached objects are held.
     */
    private AbstractConcurrentReadCache cacheMap = null;
 

所以只能用反射机制暴力破解了(按照Sun公司的JVM规范是许可的^_^),主要代码如下:


1) OsCacheUtil.java

/**
      * 通过反射机制获取Cache私有成员变量cacheMap, 2012/10/8, by jeffsang
      * @return
      */
     public static AbstractConcurrentReadCache getCacheMap(ServletContext ctx) {
            //获取Cache对象实例
           Cache cache = ServletCacheAdministrator.getInstance(ctx).getAppScopeCache(ctx);
           
            //通过反射机制获取Cache私有成员变量cacheMap
           AbstractConcurrentReadCache cacheMap = null;
            try {
            Field field = Cache.class.getDeclaredField("cacheMap" );
            field.setAccessible( true);
            cacheMap = (AbstractConcurrentReadCache) field.get(cache);
            field.setAccessible( false);
        }
        catch (Exception e) {
            log.warn( "can't acquire oscache Cache.cacheMap! " , e);
        }
            return cacheMap;
     }


     /**
      * 获取ServletCache的全部Application Scope的cache, 2012/10/8, by jeffsang
      * @return
      */
     public static Map getAppScopeCaches(ServletContext ctx) {
           Map map = new HashMap();

           //获取Cache对象实例
           Cache cache = ServletCacheAdministrator.getInstance(ctx).getAppScopeCache(ctx);

            //通过反射机制获取Cache私有成员变量cacheMap
           AbstractConcurrentReadCache cacheMap = getCacheMap(ctx);
           
           
            //返回包含在cacheMap中的Map关系的 Set视图。
           @SuppressWarnings("unchecked")
           Set> setEntry = cacheMap.entrySet();
           
            //使用Iterator遍历器
            //Iterator> it = cacheMap.entrySet().iterator();
           
            //使用for遍历cacheMap中的entrySet
            for (Map.Entry entry : setEntry) {
                String key = entry.getKey();
                Object value = cache.getFromCache(key);
                
                 //以下方法只能得到CacheEntry对象实例Id
                 //Object value = entry.getValue();
                
                map.put(key, value);
           }

            return map;
     }
 

2)  oscache_list.jsp

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page import="java.util.*" %>
<%@ page import="com.lasun.util.OsCacheUtil" %>

<%
Map<String, Object> map = OsCacheUtil.getAppScopeCaches(request.getServletContext());
request.setAttribute("map", map);
%>

<table border="1">
<tr>
	<th>No</th>
	<th>Key</th>
	<th>Value</th>
</tr>
<c:forEach var="entry" items="${map}" varStatus="status">
<tr>
	<td>${status.index+1}</td>
	<td>${entry.key}</td>
	<td>${entry.value}</td>
</tr>
</c:forEach>
</table>
 

小结:


本例子只实现ServletCache中的Application Scop的cache list功能;通过Listener或持久化也能实现监控。

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [oscache 缓存 监控] 推荐:

OSCache缓存监控实现

- - ITeye博客
最近一个项目用到OsCache的页面片段缓存,google了一下居然没有找到OsCache的监控工具(list all keys from cache),于是大略读了一下OSCache-2.4.1的源码,发现Cache.java类的cacheMap定义成了私有变量,如下:. 所以只能用反射机制暴力破解了(按照Sun公司的JVM规范是许可的^_^),主要代码如下:.

oscache之刷新缓存flushEntry的使用

- - ITeye博客
==========================  困扰和痛苦多时的oscache刷新缓存start  =======================. Everyday都不同于2015-9-19 周六15:30 . 【前言】一般而言,oscache缓存常用于在高并发的情形下. 当你初次调用缓存的方法时,如果缓存中还没有响应的key,则会去执行底层的sql语句,并把结果缓存起来.

OSCache 缓存重建在 Race Condition 下的 NRE 问题

- - 博客园_旁观者
高并发情况下,使用 OSCache 作为本地缓存中间件的前端服务,日志文件中会出现大量如下错误信息:. 无论你使用哪一种本地缓存中间件,如果你缓存数据片段时设置了过期时间,都需要考虑缓存失效后的缓存重建(repopulate the cache)场景. 进一步必须考虑 Race Condition (同进程下多线程,或不同进程)下如何重建.

缓存算法

- lostsnow - 小彰
没有人能说清哪种缓存算法由于其他的缓存算法. (以下的几种缓存算法,有的我也理解不好,如果感兴趣,你可以Google一下  ). 大家好,我是 LFU,我会计算为每个缓存对象计算他们被使用的频率. 我是LRU缓存算法,我把最近最少使用的缓存对象给踢走. 我总是需要去了解在什么时候,用了哪个缓存对象.

Hibernate 缓存

- - ITeye博客
1数据缓存:(date caching) 是一种将数据暂时存于内存缓存去中的技术,缓存通常是影响系统性能的关键因素. 2.ORM的数据缓存策略有3中.   1.事务级缓存:  分为 数据库事务和 应用级事务,是基于Session的生命周期的实现,每个session都会在内部维持一个数据缓存, 随session的创建和消亡.

hibernate缓存,一级缓存,二级缓存,查询缓存

- - CSDN博客推荐文章
1、缓存是数据库数据在内存中的临时容器,它包含了库表数据在内存中的临时拷贝,位于数据库和访问层之间. 2、ORM在进行数据读取时,会根据缓存管理策略,首先在缓冲中查询,如果发现,则直接使用,避免数据库调用的开销. 事务级缓存:当前事务范围内的数据缓存. 应用级缓存:某个应用中的数据缓存. 分布式缓存:多个应用,多个JVM之间共享缓存.

缓存相关——缓存穿透、缓存并发、缓存失效、缓存预热、缓存雪崩、缓存算法

- - 编程语言 - ITeye博客
我们在项目中使用缓存通常都是先检查缓存中是否存在,如果存在直接返回缓存内容,如果不存在就直接查询数据库然后再缓存查询结果返回. 这个时候如果我们查询的某一个数据在缓存中一直不存在,就会造成每一次请求都查询DB,这样缓存就失去了意义,在流量大时,可能DB就挂掉了. 要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞.

ZooKeeper监控

- - 淘宝网通用产品团队博客
        在公司内部,有不少应用已经强依赖zookeeper,比如meta和精卫系统,zookeeper的工作状态直接影响它们的正常工作. 目前开源世界中暂没有一个比较成熟的zk-monitor,公司内部的各个zookeeper运行也都是无监控,无报表状态. 目前zookeeper-monitor能做哪些事情,讲到这个,首先来看看哪些因素对zookeeper正常工作比较大的影响:.

性能监控

- - 互联网 - ITeye博客
一旦你的服务器是在控制台模式下运行,你就可以开始我们接下来的内容. iostat  iostat 命令用来显示存储子系统的详细信息,通常用它来监控磁盘 I/O 的情况. 要特别注意 iostat 统计结果中的 %iowait 值,太大了表明你的系统存储子系统性能低下. meminfo 和 free  Meminfo 可让你获取内存的详细信息,你可以使用 cat 和 grep 命令来显示 meminfo 信息: 1 cat /proc/meminfo  另外你可以使用 free 命令来显示动态的内存使用信息,free 只是给你大概的内存信息,而 meminfo 提供的信息更加详细.