zoukankan      html  css  js  c++  java
  • Tomcat集群下获取memcached缓存对象数量,统计在线用户数据量

    项目需要统计在线用户数量,系统部署在集群环境下,使用会话粘贴的方式解决Session问题。要想得到真实在线用户数,必须是所有节点的总和。
    这里考虑使用memcached存放用户登录数据,key为userid统计在线用户数据,只需要统计key的总数。memcached因为性能的缘故,
    没有提供遍历整个缓存当中对象的功能,不过memcached也提供了很多命令来监控memcached的状态,例如stats命令就有:

    Java代码  收藏代码
    1. stats    
    2. stats reset    
    3. stats malloc    
    4. stats maps    
    5. stats sizes    
    6. stats slabs    
    7. stats items    
    8. stats cachedump slab_id limit_num    
    9. stats detail [on|off|dump]    



    使用命令【stats items】查询查询到所有的slab,再使用命令【cachedump 1 0】命令找出所有的Key信息。但过期的key也会被查询出来,所以需要对all keys执行一遍查询,过滤掉过期的key。也可以通过【cachedump 1 0】命令查询出来的key过期时间与当前时间进行比较。判断是否过期。这里的过期时间为 session.getMaxInactiveInterval()的值。

    Java代码  收藏代码
        Iterator<Map<String, String>> iterSlabs = client.getStats("items").values().iterator();  
        Set<String> set = new HashSet<String>();  
        while(iterSlabs.hasNext()) {  
            Map<String, String> slab = iterSlabs.next();  
            for(String key : slab.keySet()) {  
                String index = key.split(":")[1];  
                set.add(index);  
            }  
        }  
          
        //统计  
        List<String> list = new LinkedList<String>();  
        for(String v : set) {  
            String commond = "cachedump ".concat(v).concat(" 0");  
            Iterator<Map<String, String>> iterItems = client.getStats(commond).values().iterator();  
            while(iterItems.hasNext()) {  
                Map<String, String> items = iterItems.next();  
                list.addAll(items.keySet());  
            }  
        }  
          
        return client.getBulk(list);  



    接下来说说,用户信息怎么放入memcached中。主要利用HttpSessionListener和HttpSessionAttributeListener来监听对Session的操作。
    不多写了,贴上代码就很清楚了:

    Java代码  收藏代码
            HttpSessionAttributeListener:  
            public void attributeReplaced(HttpSessionBindingEvent event) {  
                HttpSession session = event.getSession();  
                if(SESSION_KEY.endsWith(event.getName())) {  
                    MemcachedClient client = (MemcachedClient)SpringBeanHolder.getBean(MEMCACEHD_BEAN_NAME);  
                    SessionContext context = (SessionContext)session.getAttribute(SESSION_KEY);  
                      
                    String username = "";  
                    try {  
                        username = context.getDocument().getElementsByTagName("operatorName").item(0).getFirstChild().getNodeValue();  
                          
                        String json = "{username: '"+username+"'}";  
                        client.set(context.getUserID(), session.getMaxInactiveInterval(), json);  
                    } catch (Exception e) {  
                        e.printStackTrace();  
                    }  
                }  
            }  
              
            public class UserSessionListener implements HttpSessionListener {   
                private static final String SESSION_KEY = "sessionContext";  
                private static final String MEMCACEHD_BEAN_NAME = "memcachedClient";   
              
                public void sessionCreated(HttpSessionEvent event) {   
                }   
              
                public void sessionDestroyed(HttpSessionEvent event) {   
                    HttpSession session = event.getSession();   
                    MemcachedClient client = (MemcachedClient)SpringBeanHolder.getBean(MEMCACEHD_BEAN_NAME);  
                      
                    SessionContext context = (SessionContext)session.getAttribute(SESSION_KEY);  
                    System.out.println("【Destroy Session】 User:"+context.getUserID());  
                      
                    //删除对应用户在memcached的数据  
                    client.delete(context.getUserID());  
                }  
              
            } 
  • 相关阅读:
    通过HttpListener实现简单的Http服务
    WCF心跳判断服务端及客户端是否掉线并实现重连接
    NHibernate初学六之关联多对多关系
    NHibernate初学五之关联一对多关系
    EXTJS 4.2 资料 跨域的问题
    EXTJS 4.2 资料 控件之Grid 那些事
    EXTJS 3.0 资料 控件之 GridPanel属性与方法大全
    EXTJS 3.0 资料 控件之 Toolbar 两行的用法
    EXTJS 3.0 资料 控件之 combo 用法
    EXTJS 4.2 资料 控件之 Store 用法
  • 原文地址:https://www.cnblogs.com/interdrp/p/4090155.html
Copyright © 2011-2022 走看看