设为首页 收藏本站
查看: 584|回复: 0

[经验分享] Tomcat集群下获取memcached缓存对象数量,统计在线用户数据量

[复制链接]

尚未签到

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







Java代码   DSC0000.png

  • stats
  • stats reset
  • stats malloc
  • stats maps
  • stats sizes
  • stats slabs
  • stats items
  • stats cachedump slab_id limit_num
  • 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());  
}  
}
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-97320-1-1.html 上篇帖子: Eclipse启动Tomcat后无法访问项目 下篇帖子: Eclipse+Tomcat+Ant 小记
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表