tomcat+memcahed 缓存

JSP(全称JavaServerPages)是由Sun Microsystems公司倡导和许多公司参与共同创建的一种使软件开发者可以响应客户端请求,而动态生成HTML、XML或其他格式文档的Web网页的技术标准。JSP技术是以Java语言作为脚本语言的,JSP网页为整个服务器端的Java库单元提供了一个接口来服务于HTTP的应用程序。

 

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应对HTML 页面的访问请求。实际上Tomcat 部分是Apache 服务器的扩展,但它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的

 

Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。Memcached通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。

 

Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)

 

 

 

MemCache是什么?

 

MemCache是一个自由、源码开放、高性能、分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的速度。 MemCaChe是一个存储键值对的HashMap,在内存中对任意的数据(比如字符串、对象等)所使用的key-value存储,数据可以来自数据库调用、API调用,或者页面渲染的结果。MemCache设计理念就是小而强大,它简单的设计促进了快速部署、易于开发并解决面对大规模的数据缓存的许多难题,而所开放的API使得MemCache能用于Java、C/C++/C#、Perl、Python、PHP、Ruby等大部分流行的程序语言。

 

 

 

MemCache一次写缓存的流程:

 

1、应用程序输入需要写缓存的数据

 

2、API将Key输入路由算法模块,路由算法根据Key和MemCache集群服务器列表得到一台服务器编号

 

3、由服务器编号得到MemCache及其的ip地址和端口号

 

4、API调用通信模块和指定编号的服务器通信,将数据写入该服务器,完成一次分布式缓存的写操作

 

读缓存和写缓存一样,只要使用相同的路由算法和服务器列表,只要应用程序查询的是相同的Key,MemCache客户端总是访问相同的客户端去读取数据,只要服务器中还缓存着该数据,就能保证缓存命中。

 

这种MemCache集群的方式也是从分区容错性的方面考虑的,假如Node2宕机了,那么Node2上面存储的数据都不可用了,此时由于集群中Node0和Node1还存在,下一次请求Node2中存储的Key值的时候,肯定是没有命中的,这时先从数据库中拿到要缓存的数据,然后路由算法模块根据Key值在Node0和Node1中选取一个节点,把对应的数据放进去,这样下一次就又可以走缓存了,这种集群的做法很好,但是缺点是成本比较大。

 

 

 

 

 

MemCache实现原理

 

首先要说明一点,MemCache的数据存放在内存中,存放在内存中个人认为意味着几点:

 

1、访问数据的速度比传统的关系型数据库要快,因为Oracle、MySQL这些传统的关系型数据库为了保持数据的持久性,数据存放在硬盘中,IO操作速度慢

 

2、MemCache的数据存放在内存中同时意味着只要MemCache重启了,数据就会消失

 

3、既然MemCache的数据存放在内存中,那么势必受到机器位数的限制,这个之前的文章写过很多次了,32位机器最多只能使用2GB的内存空间,64位机器可以认为没有上限

 

然后我们来看一下MemCache的原理,MemCache最重要的莫不是内存分配的内容了,MemCache采用的内存分配方式是固定空间分配

 

 

 

 

 

 

 

 

 

 

client -> nginx:80(html) ->tomcat:8080(jsp) ->nginx:80 -> client

tomcat-memcached

 

server2  server3  jsp tomcat 的搭建平台

            jsp的搭建

/root/    tar zxf jdk-7u79-linux-x64.tar.gz  -C /usr/local/  打开jsp包到/usr/local

 cd /usr/local/

ln -s jdk1.7.0_79/ java               创建软连接 java

vim /etc/profile

   export  JAVA_HOME=/usr/local/java

   export  CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

   export  PATH=$PATH:$JAVA_HOME/bin

  jsp 文件对应路径

 

source /etc/profile

 

echo $JAVA_HOME

 echo $CLASSPATH

 echo $PATH】  检测配置文件写的路径对错

 

以下为检测jsp是否可以编译java

/root/   vim test.java

 

public class test {

                public static void main(String[] args)

        {               System.out.println("hello");

        }

}

javac test.java 检测test.java语法是否正确#编译

java test 输出结果#运行

 

         tomcat的搭建

tar zxf apache-tomcat-7.0.37.tar.gz  -C /usr/local/  打开tomcat包到/usr/local

cd  /usr/local/

ln -s apache-tomcat-7.0.37/  tomcat       创建软连接:tomcat

cd  /usr/local/tomcat

bin/startup.sh   打开tomcat服务    端口 8080

bin/shutdown.sh   关闭】       

 cd    /usr/local/tomcat/webapps/ROOT/

vim    test.isp

The time is: <%=new  java.util.Date() %>  #时间  

打开浏览器: 172.25.9.2/3:8080/test.jsp

 

server2 全部做好    server3 :scp -r /usr/local/java/   /usr/local/tomcat/ 172.25.9.3:/usr/local/   就可以了

 cd  /usr/local/tomcat

bin/startup.sh   打开tomcat服务  就好了

 

 

 

 

server1  作为server 2/3  的调度器

之前一搭建好 nginx

cd /usr/local/lnmp/nginx/conf/

vim nginx.conf   加入以下参数

http  {

        upstream  java  {

   #             sticky;

                server  172.25.9.2:8080;

                server  172.25.9.3:8080;

}

 

 

location ~ \.jsp$ {

            proxy_pass   http://java;

 

 

其他带有   proxy_pass   http://。。。 的  server全部注释掉  

 

 

 

nginx -t  检查语法错误

  nginx  开启  

  nginx  -s  reload 刷新配置

 

打开浏览器: 172.25.9.1/test.jsp  就可以访问 server2/3 的jsp内容了

for i in $( seq 10); do curl 172.25.9.1/test.jsp;done  也可以访问

 

cookie参数 要重新编译nginx

 

/root/      tar zxf  nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d.tar.gz

cd nginx-1.10.1

 make clean 要清除原文件

 

./configure --help   | less  查看编译参数

./configure --prefix=/usr/local/lnmp/nginx --with-http_ssl_module --with-http_stub_status_module  --add-module=/root/nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d

make  生成

make  install   安装

cd /usr/local/lnmp/nginx/conf/

vim nginx.conf

http  {

        upstream  java  {

            sticky;   加这个参数就可以了

                server  172.25.9.2:8080;

                server  172.25.9.3:8080;

}

 

打开浏览器: 172.25.9.1/test.jsp  就可以访问 server2/3 的jsp内容了但是因为cookie,所以这个浏览器先缓存的server几就一直访问server几

因为以下命令是没有缓存的,所以它还是轮询的

for i in $( seq 10); do curl 172.25.9.1/test.jsp;done 】

 

下面为 memcached  搭建与测试  在server2/3上

yum install -y memcached  安装

/etc/init.d/memcached start  打开

yum install -y telnet   因为 memcached 数据保存都在内存里   、

telnet localhost 11211   需要telnet连接11211端口查看

stats  进入   

cd  /usr/local/tomcat/webapps/ROOT/

vim test.jsp

<%@ page contentType="text/html; charset=GBK" %>

<%@ page import="java.util.*" %>

<html><head><title>Cluster App Test</title></head>

<body>

Server Info:

<%

out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>

<%

out.println("<br> ID " + session.getId()+"<br>");

String dataName = request.getParameter("dataName");

if (dataName != null && dataName.length() > 0) {

String dataValue = request.getParameter("dataValue");

session.setAttribute(dataName, dataValue);

}

out.print("<b>Session list</b>");

Enumeration e = session.getAttributeNames();

while (e.hasMoreElements()) {

String name = (String)e.nextElement();

String value = session.getAttribute(name).toString();

out.println( name + " = " + value+"<br>");

System.out.println( name + " = " + value);

}

%>

<form action="test.jsp" method="POST">

name:<input type=text size=20 name="dataName">

<br>

key:<input type=text size=20 name="dataValue">

<br>

<input type=submit>

</form>

</body>

</html>

 

 

 scp test.jsp 172.25.9.3:/usr/local/tomcat/webapps/ROOT/   发送给server3

                           

在浏览器里   172.25.9.1/test.jsp 出现相关页面

 

server2/3

 cd  /usr/local/tomcat

bin/shutdown.sh   关闭tomcat服务

  kryo-1.04.jar

 kryo-serializers-0.10.jar

 memcached-session-manager-1.6.3.jar  

 memcached-session-manager-tc7-1.6.3.jar

 minlog-1.2.jar msm-kryo-serializer-1.6.3.jar  

 reflectasm-1.01.jar   spymemcached-2.7.3.jar  

这些包放入server2/3 的    /usr/local/tomcat/lib/下

cd  /usr/local/tomcat/conf/

vim context.xml

 

 

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"

memcachedNodes="n1:172.25.9.2:11211,n2:172.25.9.3:11211"

failoverNodes="n1"    #在 server3 上此项设置为“n2”

requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"

transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"

/>

 

 

scp context.xml 172.25.9.3:/usr/local/tomcat/conf/  发送给server3

 

cd  /usr/local/tomcat

 bin/startup.sh  打开 server2/3 的 tomcat 服务

 

以下为memcached的测试:  

打开 172.25.9.2:8080/test.jsp  输入数据    会出现在自己的日志里

cd  /usr/local/tomcat

tail  -f logs/catalina.out 查看时时日志

memcached 由于交叉存储,会存到 n2(server3的内存) 里,

telnet  172.25.9.3 11211

get  ID 就可以查看 tomcat2  在 memcached3 里存的数据

 

打开 172.25.9.3:8080/test.jsp  同理即可

 

#如果关掉 memcached3  ,server2的tomcat2会存到自己的memcached里也就是 n1

#如果关掉 memcached3 ,同理

 

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

tomcat+memcahed 缓存

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭