发表于: 2018-01-28 10:36:36

1 718


今天完成的事情

1.缓存整好了,继续压测,和昨天的数据作对比:下面的是昨天的没有缓存的数据:

然后是增加了缓存的数据:

仅对比这一个图,就能发现很多问题,平均请求时间差了一半,90%的线也跟之前差了将近一半,且吞吐量也有所上升,不过因为符合比较大,经常卡住。。。

然后tps视图的峰值也差了一倍。

总的来说,结果在预料之中,提升性能很明显。

2.负载均衡压测

  在服务器部署了两个tomcat进行负载均衡的压测,然后检查nginx的日志,配置成功。

但是在测试的过程中并没有发现明显的性能提升,因为是一个服务器的原因吧,昨天曲师兄用我的服务器做了负载均衡测试了一下,我这里就直接使用他的结论了。

  虽然使用负载均衡可以提升性能,但是并不是1+1=2的过程,因为运行负载均衡也需要使用资源。所以说负载均衡最佳使用方式应该是当一台服务器到达瓶颈之后再添加一台才是最合适的。

http://blog.csdn.net/zq17865815296/article/details/78619110

3.学习redis

首先啥是redis:

redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类keyvalue存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便。

    redis目前提供四种数据类型:string iist set zset

然后下载安装了redis,附上链接:

https://www.cnblogs.com/joyet/p/6103041.html

搞了一波,不过有点晕乎

使用了setnx的命令,会规避重复的key,不会覆盖,而set直接就覆盖了。

暂时就玩儿到这里,接下来是看看怎么样向项目中使用redis。

http://www.runoob.com/redis/hashes-hlen.html更多命令看这个吧

4.开始整

先加上jar包

<!--redis-->
<dependency>
 <groupId>redis.clients</groupId>
 <artifactId>jedis</artifactId>
 <version>2.9.0</version>
</dependency>
<dependency>
 <groupId>org.springframework.data</groupId>
 <artifactId>spring-data-redis</artifactId>
 <version>1.6.0.RELEASE</version>
</dependency>

然后加上redis工具类:

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;


public final class RedisUtil {

//Redis服务器IP
   private static String ADDR = "127.0.0.1";

   //Redis端口号
   private static int PORT = 6379;

   //可用连接实例的最大数目,默认值为8;
   //如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
   //没用上,尴尬,config没这个set方法
   private static int MAX_ACTIVE = 1024;

   //控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。
   private static int MAX_IDLE = 200;

   //等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException;
   private static int MAX_WAIT = 10000;

   private static int TIMEOUT = 10000;

   //在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
   private static boolean TEST_ON_BORROW = true;

   private static JedisPool jedisPool = null;

   /**
    * 初始化Redis连接池
    */
   static {
try {
JedisPoolConfig config = new JedisPoolConfig();
           config.setMaxIdle(MAX_IDLE);
           config.setMaxWaitMillis(MAX_WAIT);
           config.setTestOnBorrow(TEST_ON_BORROW);
           jedisPool = new JedisPool(config,ADDR,PORT,TIMEOUT);
       }catch (Exception e){
e.printStackTrace();
       }
}


/**
    * 获取Jedis实例
    * @return
    */
   public synchronized static Jedis getJedis(){
try{
if(jedisPool != null){
Jedis resource =jedisPool.getResource();
               return resource;
           }else {
return null;
           }
}catch (Exception e){
e.printStackTrace();
           return null;
       }
}

/**
    * 释放Jedis资源
    * @param jedis
    */
   public static void close(final Jedis jedis){
if(jedis != null){
jedis.close();
       }
}


}

再者是测试类:

import com.ptteng.util.RedisUtil;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;


public class TestRedis {

/**
    * Redis存储字符串
    */
   @Test
   public void testString(){
Jedis jedis = new Jedis("127.0.0.1",6379);
       jedis.set("name","喜子哥");
       System.out.println(jedis.get("name"));

       //拼接
       jedis.append("name"," 天下第一");
       System.out.println(jedis.get("name"));

       //删除键
       jedis.del("name");
       System.out.println(jedis.get("name"));

       //设置多个键值对
       jedis.mset("name","liuling","age","23","qq","476777XXX");
//        对键值进行加1操作
       jedis.incr("age");
       System.out.println(jedis.get("name") + "-" + jedis.get("age") + "-" + jedis.get("qq"));
       jedis.del("name");
       jedis.del("age");
       jedis.del("qq");
       System.out.println(jedis.get("name") + "-" + jedis.get("age") + "-" + jedis.get("qq"));
       System.out.println(jedis);
       //这三个方法只有quit是直接断开服务器连接的,其他的貌似都不好使,quit后再调用jedis对象会报错。其他的两个再次调用都没什么问题
       //
       jedis.close();
       jedis.quit();
       jedis.disconnect();
       //挺难受的,由于close方法是最近一年左右新更的,所以相关资料特别少,目前不知道怎么回事。搁置
       jedis.set("name","No?");
       System.out.println(jedis.get("name"));
       System.out.println(jedis);

   }

@Test
   public void testRedisPool(){
Jedis jedis = RedisUtil.getJedis();
       jedis.set("newname","中文测试");
       System.out.println(jedis.get("newname"));
       jedis.close();
       System.out.println(jedis.get("newname"));
   }

}

在测试的时候发现一个问题,只有jedis.quit可以关闭,close和disconnect不好使,执行了之后还是可以调用:举个例子:

@Test
public void testRedisPool(){
Jedis jedis = RedisUtil.getJedis();
   jedis.set("newname","中文测试");
   System.out.println(jedis.get("newname"));
   jedis.close();
   System.out.println(jedis.get("newname"));
}

在这个例子中会输出两个中文测试,说明没关闭:

而换了quit之后:

@Test
public void testRedisPool(){
Jedis jedis = RedisUtil.getJedis();
   jedis.set("newname","中文测试");
   System.out.println(jedis.get("newname"));
   jedis.quit();
   System.out.println(jedis.get("newname"));
}

运行结果:


可以看到取不到值且抛出了异常,所以只有quit是可以关闭的。

工具类测试没问题了,接下来就是在项目中红应用了。

差点跟着教程错下去,辛亏问了一把师兄。

原来我的工具类是不对的,没有那些方法。。。于是更换工具类

但是换了工具类之后的效果更坏了:

于是开始搞这个东西,搞来搞去也还没搞出来。


今天遇到的问题

   今天被redis搞了。。缓不过劲来了

今天的收获:

压测了有无缓存的jsp页面,学习了一波redis

 明天计划的事情:

 整好redis,推进任务六


返回列表 返回列表
评论

    分享到