发表于: 2017-07-10 11:00:24

2 1368


 今天完成的:

Task5改完了,完成Task6的任务2.

收获:

1.MemCache实现原理。做Task6的时候发现加了缓存比不加缓存性能差了好几倍,探究了一下。

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

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

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

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

然后我们来看一下MemCache的原理,MemCache最重要的莫不是内存分配的内容了,MemCache采用的内存分配方式是固定空间分配,还是自己画一张图说明:

这张图片里面涉及了slab_class、slab、page、chunk四个概念,它们之间的关系是:

1、MemCache将内存空间分为一组slab

2、每个slab下又有若干个page,每个page默认是1M,如果一个slab占用100M内存的话,那么这个slab下应该有100个page

3、每个page里面包含一组chunk,chunk是真正存放数据的地方,同一个slab里面的chunk的大小是固定的

4、有相同大小chunk的slab被组织在一起,称为slab_class

MemCache的高性能源自于两阶段哈希结构:第一阶段在客户端,通过 Hash算法根据Key值算出一个节点;第二阶段在服务端,通过一个内部的Hash算法,查找真正的item并返回给客户端。

通过stats slabs查看memcache内存使用情况,其序列化对象之后的空间占用比序列化为xml大了很多,性能差的原因也是由于序列化和反序列化太耗时。因此采用memcache缓存对象的时候一定不要直接使用序列化api。有两个解决办法:

1.考虑通过第三方的序列来封装客户端序列化机制,比如google的protobuf序列化

2.将对象List封装为格式化字符串存入memcache,取出时通过正则转回去

2.弄明白了Task5加密过程使用base64和URLEncoder的原因

计算机中任何数据都是按ascii码存储的,而ascii码的128~255之间的值是不可见字符。而在网络上交换数据时,那些不可见字符就有可能被处理错误,这是不利于传输的。所以就先把数据先做一个Base64编码,统统变成可见字符,这样出错的可能性就大降低了。

至于URLEncoder,比如http协议当中的key value字段,或者cookie的保存。必须进行URLEncode 不然出现的等号可能使解析失败,空格也会使http请求解析出现问题,比如 请求行就是以空格来划分的  POST /guowuxin/hehe HTTP/1.1 

3.小课堂里讲的

utf8中中文占3byte,英文2byte。DB中的varchar(20)中20表示字的长度,而不是字节长度。

4.junit与spring整合测试
@RunWith(SpringJUnit4ClassRunner.class) 用于配置spring中测试的环境 
@ContextConfiguration(Locations="../applicationContext.xml") 用于指定配置文件所在的位置 
@Test标注在方法前,表示其是一个测试的方法 无需在其配置文件中额外设置属性. 
多个配置文件时{"/applic","/asas"} 可以导入多个配置文件
 

@Ignore可跳过测试方法

5.找了一个项目自动部署的脚本

#! /bin/sh
echo '####################开始自动部署####################'
path=`pwd` #当前路径
tomcatPath=tomcat-7 #指定tomcat文件目录名称
cd ../$tomcatPath/bin #进入tomcat的bin目录
PID=$(ps -fu `whoami`|grep tomcat|grep -v grep|awk '{print $2}')
if [ -z "$PID" ];then
 echo "no tomcat process"
else
./shutdown.sh #停止tomcat服务
fi
sleep 1 #休眠1s
cd ../webapps #进入tomcat的webapps目录
rm -fr test #删除test文件目录
mv test.war test.war.$(date +%Y%m%d) #备份webapps下的test16 cp $path/test.war ./ #复制test.war到webapps路径下
sleep 1 #休眠1s
cd ../bin
./startup.sh #启动tomcat服务

echo '####################部署结束####################'

1.新建一个目录autoDeploy与tomcat目录放在同级目录下

  (1)autoDeploy.sh放在autoDeploy目录下

  (2)需要部署的test.war放在autoDeploy目录下(test.war为需要部署的到tomcat上的war包)

2.tomcatPath=tomcat-7(指定tomcat文件目录名称,tomcat-7改为自己tomcat的目录名称)

3.执行autoDepoy.sh即可实现自动部署

 新建的autoDepoy.sh若没有执行权限,需要执行:chmod +x autoDeploy.sh

遇到的问题:

1.已经使用fastjson包手动将list<Bean>序列化再加入缓存,可是加完缓存的压测速度竟然还比不加缓存慢。???

我测了一下查1000条数据的接口,测出来90Line在800ms左右。。加了缓存1000ms。。。

明天的计划:

先把上面的问题解决。配服务器,做任务2和任务3,了解一下redis。


返回列表 返回列表
评论

    分享到