发表于: 2017-11-02 22:59:38

1 970


今天完成的任务:

1.首先是发现昨天代码里面有个问题,就是add方法和set方法不知道怎么去使用?

有一个根据id查找的方法,那我每一次查到了数据放在缓存里面,下一次换了id岂不是要重新查找,

在下一次用之前的id还要重新到数据库去查,这不是反而慢了吗?然后去查查setadd的区别:

add是添加一个新的key-value 如果存在的话就不能继续添加,返回false

set是添加一个key-value,并且如果存在的话就替换。

所以我的想法只能用set不能用add,因为用add的话就只有第一次存入缓存的时候会有用,后面就不能存进去了。

但是缓存如果是不需要变化的话,那么久用不到set方法了呀???

只要我第一次添加到缓存,后面只需要取出不是就可以了。干嘛还要用set去改变他的值?

难道是为了保险起见,万一有需要修改缓存的时候,使用set就不会出现修改不了的情况?

 

另外,想明白了一点就是缓存里面放的都是经常使用的而且变化不太大的因为如果数据是经常变化的,

那放到缓存里面就没有意义了,因为我用一次放入缓存以后就不用了,那我下一次查其他的内容的时候还是需要到数据库中查找,

然后在写入缓存,然后在搁置不用。这样就浪费了很多时间,而且也没有达到缓存的目的。

那如果我非要将根据id查信息放在缓存里面要怎么办?

想法就是每一个id都作为一个key,然后存入对应的数据作为value,这样每一个id都有存一个缓存。

但是这种方法好像比较笨重。。。暂时想不出其他的了。

 

继续在项目中使用redis,和使用memcached一样,在Service层里面添加一个redis的判断,如果缓存里面有的话,就直接取出来,

如果没有,就去数据库读取然后在写入缓存中。

public User get(int id){
    Jedis jedis=
jedisPool.getResource();
   
User user;
    if
((jedis.get("userById"))!=null){
        Object o=SerializeUtil.unserialize(
"userById".getBytes());
       
System.out.println("redis缓存有");
        return
(User) o;
   
}
   
else{
        user=
userDao.get(id);
       
System.out.println("缓存没有,数据库查到了");
       
jedis.set("userById".getBytes(),SerializeUtil.serialize(user));
       
System.out.println("放入缓存了");
   
}
   
return user;
}

结果:

然后添加对象是可以了,但是添加list就出现了问题,就是一直会报错

java.io.StreamCorruptedException: invalid stream header: 3F3F0005

查了半天发现是序列化之后的内容放入不进数组。。但是看代码都没啥问题啊??

后来发现反序列化不可以直接将缓存中拿到的值放入,下面这样就是错的。

list=(ArrayList) SerializeUtil.unserialize(jedis.get("userAll".getBytes()))

然后这样就是对的。。。。不知道为啥。。。

bytes=jedis.get("userAll".getBytes());
list = (ArrayList) SerializeUtil.unserialize(bytes);

 

2.可以了压力测试试一下。

测试发现到两三百就后面的就会全部都请求失败了,应该是连接池没有释放,所以不能再继续请求了,

所以需要在Service的代码中加入一个关闭连接池

finally{
if (jedis=null)
    jedis.close()
;
}

 

加上以后就可以了,没毛病

正式开始了

无缓存,无负载均衡,130线程,500ms

无缓存,无负载均衡,400线程,宕机出错

无缓存,有负载均衡。80线程,500ms

无缓存,有负载均衡。400线程,宕机

memcached缓存,无负载均衡,线程  90  500ms

memcached缓存,无负载均衡,线程150 宕机

memcached缓存,有负载均衡,线程80  500ms

memcached缓存,有负载均衡,线程 200 宕机

redis缓存,无负载均衡,150线程,500ms

redis缓存,无负载均衡,线程280,出错,宕机。

redis缓存,配置负载均衡,80线程500ms

redis缓存,配置负载均衡,200线程宕机

最后压测报告。 


 

明天的计划:

 明天开始做任务七吧,看看以前师兄的日报

遇到问题:

 刚刚开始使用redis放入list但是一直报错。

redis连接池没有还回去。所以压测200多久卡死了。添加了关闭连接就好了。

收获:

项目里面添加了redis

压力测试测了很多次。

 任务六做完了

禅道:

http://taskPaPteng.com/zentao/task-view-10340.html

 

 

 



返回列表 返回列表
评论

    分享到