发表于: 2017-10-16 19:01:09

1 965


今天完成的事情:

1.学习redis,使用jedis客户端工具

使用过XMemcached后,做这个就觉得很容易了

spring中配置

<!--Jedis连接池的相关配置-->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
   <property name="maxIdle" value="300" /> <!-- 最大能够保持idel状态的对象数  -->
   <property name="maxTotal" value="60000" /> <!-- 最大分配的对象数 -->
   <property name="testOnBorrow" value="true" /> <!-- 当调用borrow Object方法时,是否进行有效性检查 -->
</bean>

<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
   <constructor-arg name="poolConfig" ref="jedisPoolConfig" />
   <constructor-arg name="host" value="${redis.host}" />
   <constructor-arg name="port" value="${redis.port}" type="int" />
   <constructor-arg name="timeout" value="${redis.timeout}" type="int" />
   <constructor-arg name="password" value="${redis.password}" />
   <constructor-arg name="database" value="${redis.database}" type="int" />
</bean>


封装:

public class JedisUtil {
   @Autowired
   private JedisPool jedisPool;

   public JedisUtil() {

   }
   
   public void addCache(String name, int time, Object o) {
       try {
           Jedis jedis = jedisPool.getResource();
           jedis.set(name.getBytes(), SerializeUtil.serizlize(o));
           jedis.expire(name.getBytes(), time);
           jedis.close();
       } catch (Exception e) {

       }
   }

   public Object getCache(String name) {
       try {
           Jedis jedis = jedisPool.getResource();
           byte[] nameValue = jedis.get(name.getBytes());
           if (nameValue != null) {
               jedis.close();
               return SerializeUtil.deserialize(nameValue);
           }
           jedis.close();
       } catch (Exception e) {
           return null;
       }
       return null;
   }

   public void deleteCache(String name) {
       Jedis jedis = jedisPool.getResource();
       jedis.del(name.getBytes());
       jedis.close();
   }
}


测试:

@Test
public void getCache() throws Exception {
   jedisUtil.addCache("test", 3600, "reply");
   System.out.println(jedisUtil.getCache("test"));
}


结果:


2.解决缓存穿透、雪崩的问题

缓存穿透是指网页请求数据库、缓存中都没有数据,那么就可以反复发送一个请求,相当于绕过缓存,访问数据库,让数据库崩溃

解决方法有简单的也有复杂的,复杂的是布隆过滤器,原理是建立几个哈希表,通过一种算法可以高效率的检索表中数据是否存在,若请求不在表中,则过滤;简单的是若访问请求的值既不在数据库中,也不在缓存中,则在缓存中建立一个值


缓存雪崩:指的是缓存在同一时间失效,数据库面临大量的请求

解决方法:可以在设定缓存时间时加入一个随机函数*固定时间,让缓存零散分布;也可以使用加锁计数,但是会降低吞吐量


3..压测报告:

这个压测是真的没法测

昨天晚上我测了memcached,今天晚上突发奇想,会不会时间段不同,由于网络原因会出现响应不一样的情况

真的不一样,真的不一样,夜深人静的半夜和七八点下班时根本不一样,差了不止一点半点

想着重新测一遍吧,结果八点回头试了试和七点时测的数据是不是一样的,又拉开了一大块

绝望

晚上回去接上网线测吧,将所有不稳定的因素排除

PS:早上七点起来测,的确稳定了很多,但不得不说,吞吐量、平均值还好说,但是90line就是一个玄学,服务器一个不稳,90line可以直接彪上天去,比人心还难测,测了一半,任务等着晚上写日报一起交

接口:


类型并发数吞吐量并发数吞吐量
响应时间200ms200ms500ms500ms
接口JSPJSONJSPJSONJSPJSONJSPJSON
无缓存835130196459597~102240~260
memcached838154286~30047140100~108230~250
redis835153295~30045140103~107236~250

这是单个web服务器的性能测试报告,经过压测之后发现:并发数少的时候还好,但是测量500ms的时候,就会变得非常的不稳定,90line经常跑到1000+,而稍微降低一点,又会跑到300+,只能反复测试找低值


明天计划的事情:

1.准备小课堂

2.浏览任务七内容


遇到的问题:

1.无法用telnet连接redis

解决方案:将redis.conf中的bind localhost注释掉

2.Jedis中key/value的类型必须相同

解决方案:key使用Jedis自带的getbyte的方法,value使用序列化


收获:

1.安装redis,学会使用jedis

2.完成压测任务


进度:

任务6开始时间:2017.10.08

预计demo时间:2017.10.16

已延期至2017.10.17

原因:压测不稳定

禅道

http://task.ptteng.com/zentao/project-task-350.html




返回列表 返回列表
评论

    分享到