Tomcat集群下获取memcached缓存对象数量,统计在线用户数据量

本文介绍了一种在集群环境中使用memcached统计在线用户数量的方法。利用HttpSessionListener和HttpSessionAttributeListener监听Session操作,并通过memcached存储用户登录数据,实现在线用户数的准确统计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目需要统计在线用户数量,系统部署在集群环境下,使用会话粘贴的方式解决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());  
            }  
          
        } 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值