发表于: 2017-10-16 19:01:09
1 966
今天完成的事情:
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可以直接彪上天去,比人心还难测,测了一半,任务等着晚上写日报一起交
接口:
类型 | 并发数 | 吞吐量 | 并发数 | 吞吐量 | ||||
响应时间 | 200ms | 200ms | 500ms | 500ms | ||||
接口 | JSP | JSON | JSP | JSON | JSP | JSON | JSP | JSON |
无缓存 | 8 | 35 | 130 | 196 | 45 | 95 | 97~102 | 240~260 |
memcached | 8 | 38 | 154 | 286~300 | 47 | 140 | 100~108 | 230~250 |
redis | 8 | 35 | 153 | 295~300 | 45 | 140 | 103~107 | 236~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
评论