前些天发过一篇帖子,是关于memcached如何用于轮询数据显示的一个想法,今天在自己的项目中实现了这个想法。其实这个东西可以扩展到很多的应用中,不多说了,下面是这个想法的原型实现。有点对不起大家了,这是个jsp,只是个思路而已,可以变形扩展到其他地方去。前提:需要有spring框架的支持,memcached客户端用的是java_memcached 2.0.1,是通过spring依赖注入的,服务端需要自己去在服务器配置一下。
其实思路很简单,下面的例子是通过简单提交的userid来作为key,value保存最近一次访问的集合索引值,从0开始的,大于等于集合个数时候返回到0位置继续轮询,设置了每隔10s显示下一个元素,10s内同一个用户看到的内容是相同的。
不用数据库或者文件作为存储介质,所有操作都在内存中进行,这样速度明显要有很大的提升,但是如何合理的利用memcached,想要做的完善还是有很多细节要考虑的。
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page import="java.util.*"%>
<%@ page import="org.springframework.web.context.support.*,org.springframework.context.*"%>
<%@ page import="com.danga.MemCached.MemCachedClient"%>
<%@ page import="org.apache.log4j.Logger"%>
<%@ page import="com.sharppointgroup.ad.util.ADUtil"%>
<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8"/>
<meta name="viewport" content="width=device-width; initial-scale=1.3; minimum-scale=1.0; maximum-scale=2.0"/>
<meta name="MobileOptimized" content="240"/>
<meta name="format-detection" content="telephone=no" />
<title>Memcached Test</title>
</head>
<%!
private static final Logger memcacheLogger = Logger.getLogger("memcache");
private String userid = null;
private String result = null;
private static List<String> v = new ArrayList<String>();
static{
v.add("1");
v.add("2");
v.add("3");
v.add("4");
v.add("5");
}
%><%
request.setCharacterEncoding("utf-8");
if(request.getParameter("user") != null){
userid = request.getParameter("user");
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
MemCachedClient memCache = (MemCachedClient) ctx.getBean("memCache");
String cacheKey = "userid_" + userid;
String timeStampKey = cacheKey + "_lasttime_";
Object cacheObj = memCache.get(cacheKey);
out.print("isHasCacheKey:"+memCache.keyExists(cacheKey)+"<br/>");
out.print("isHasTimeStampKey:"+memCache.keyExists(timeStampKey)+"<br/>");
if(cacheObj == null){
result = v.get(0);
memCache.add(cacheKey, 0, 24*60*60);
memCache.add(timeStampKey, System.currentTimeMillis(), 24*60*60);
}
else{
if(memCache.keyExists(timeStampKey) && (System.currentTimeMillis()-Long.parseLong(memCache.get(timeStampKey).toString())) >= 10000){
memCache.set(cacheKey, Integer.parseInt(memCache.get(cacheKey).toString())+1);
memCache.set(timeStampKey, System.currentTimeMillis());
}
if(Integer.parseInt(memCache.get(cacheKey).toString()) >= v.size())
memCache.set(cacheKey, 0);
result = v.get(Integer.parseInt(memCache.get(cacheKey).toString()));
}
out.println("cacheKey:"+cacheKey+" value:"+result + "<br/>");
out.println("timeStampKey:"+timeStampKey+" value:"+memCache.get(timeStampKey) + "<br/>");
String logInfo = ADUtil.createLogInfo("cacheKey="+cacheKey,"cacheValue="+memCache.get(cacheKey),
"timeStamp="+new Date(Long.parseLong(memCache.get(timeStampKey).toString())));
memcacheLogger.info(logInfo);
}
%>
<body>
<% if(request.getParameter("user") == null){%>
<form action="test.jsp" method="post">
<input type="text" name="user" size="15" value="" /><input name="submit" type="submit" value="提交" />
</form>
<%}%>
</body>
</html>
分享到:
相关推荐
2. **高可用性**:为了保证服务不中断,可以部署多台Memcached服务器,形成一个集群,实现数据的冗余和故障转移。 **配置步骤** 1. **安装Nginx**:在服务器上安装Nginx,并配置反向代理和负载均衡规则。 2. **...
C#使用memCached实现缓存 Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。...
为了实现这一目标,我们可以结合Nginx反向代理服务器和memcached内存缓存系统来达到高效、可靠的Session共享。以下是对这个主题的详细阐述: 首先,让我们理解Session的概念。Session是Web应用程序用来跟踪用户状态...
标题 "memcached数据完整迁移到redis" 描述的是一个数据迁移的过程,从使用 memcached 存储的数据转换到使用 redis 存储。这个过程在 IT 领域中是常见的,因为不同的缓存系统有不同的特性和优势。让我们深入探讨这个...
描述中的“有图有像,动态查看各种数据”意味着该监视工具提供可视化界面,以图形和图像的形式展示memcached的各种运行数据,如命中率、内存使用情况、连接数等,并且这些数据显示是动态更新的,以便用户可以实时...
1. **分布式存储**:Memcached并不关心数据如何分布,而是通过简单的哈希算法将键映射到不同的服务器节点,实现数据的自动分发。 2. **缓存策略**:使用LRU(Least Recently Used)最近最少使用策略进行缓存淘汰。...
memcached实现集群的session共享问题,处理集群服务器情况下,memcached的session共享解决方案
本项目通过结合使用Filter(过滤器)和Memcached来实现一个高效的session服务器,以解决跨服务器会话共享的问题。 首先,让我们详细了解一下`Filter`。在Java Web开发中,Filter是Servlet API的一部分,允许开发者...
2. `memcached-session-manager-1.8.3.jar`:这个库提供了session管理器,实现了将Tomcat的session数据存储到Memcached的能力。 3. `kryo-1.04.jar` 和 `kryo-serializers-0.11.jar`:Kryo是一个快速、高效的序列化...
Memcached基于键值对(key-value)存储模式,将数据保存在内存中,以减少对硬盘I/O操作,从而提高了数据访问的速度。系统会根据内存大小自动管理缓存对象,当内存满时,会使用LRU(Least Recently Used)最近最少使用...
本篇文章将详细探讨如何使用Memcached实现分布式Session,并介绍所需的关键jar包。 1. **Memcached概述** Memcached是一个开源的、基于内存的、高性能的分布式缓存系统,最初设计用于减轻数据库负载。它通过在内存...
标题中的“memcached实现多个tomcat共享一个session”是指在分布式系统中,通过使用memcached作为session存储介质,实现多台Tomcat服务器之间的session共享。这样可以确保用户在集群中的任意一台服务器上登录后,其...
标题 "nginx+tomcat+memcached实现session共享" 涉及的是在分布式环境中如何通过组合使用这三种技术来管理用户的会话数据。这个话题对于构建高可用、高性能的Web应用系统至关重要,尤其是在大型网站和企业级应用中。...
Nginx+Tomcat+Memcached实现tomcat集群和session共享 nginx配置
本文将详细探讨如何使用lvs(Linux Virtual Server)、keepalived、nginx、tomcat以及memcached来实现这一目标。 首先,lvs是Linux内核中的一个模块,它提供了四层负载均衡功能,能够将进来的网络请求分发到后端多...
我们将Memcached作为存储Session的地方,当Tomcat服务器处理用户请求时,会将Session数据发送到Memcached,其他服务器在处理相同用户的请求时,可以直接从Memcached获取Session数据,实现了Session的共享。...
本文记录了我在生产环境下使用memcached实现tomcat session会话共享解决方案的实施完整过程,验证可用!有需要的请拿走.
Nginx+Tomcat+Memcached实现tomcat集群和session共享 tomcat部分
在IT行业中,构建高效、可扩展的Web服务是至关重要的,而"Nginx+Tomcat+memcached实现集群部署、负载均衡session共享"是一种常见的解决方案。这个方案结合了Nginx作为反向代理和负载均衡器,Tomcat作为Java应用...