发表于: 2017-08-05 00:11:29
3 880
今天完成的事情:
Redis同时连接线程数过多,就会抛出Connection reset by peer异常.
20个
40个
60个
80个
100个
120个
140个
160个是极限了
经过测试每秒160个线程是极限了再多就会出错, Connection reset by peer: socket write error
但没有找到解决办法,决定先放一放..先继续做任务...
学习了一下缓存穿透和缓存雪崩参考链接http://www.cnblogs.com/fidelQuan/p/4543387.html
解决办法:
@Override
public Category get(Category category) {
Category c = new Category();
String key = "category_id("+category.getId()+")";
//s = (Student)MemcachedUtil.get(key); //Memcache
c = (Category) SerializeUtil.unserialize(jedis.get(key.getBytes())); //Redis
System.out.println("从缓存中读取");
/**从缓存中读取如果为空则从数据库中读取*/
if(c == null){
System.out.println("从数据库中读取");
c = categoryMapper.get(category);
if(c != null){
//MemcachedUtil.set(key, s); //Memcache
jedis.set(key.getBytes(), SerializeUtil.serialize(c)); //Redis
}else{
//解决缓存穿透,如果频繁查询一个不存在的数据,会造成不必要的损耗
//最简单的办法就是如果数据库不存在,对应的key缓存设置为一个固定值,下次直接返回这个值
Category cat=new Category();
jedis.set(key.getBytes(),SerializeUtil.serialize(cat));
}
}
return c;
}
完善了增删查改对缓存的处理
@Service
public class CategoryServiceImpl implements CategoryService {
@Autowired
private CategoryMapper categoryMapper;
@Autowired
CategoryService categoryService;
//添加Redis
private static Jedis jedis = new Jedis("localhost");
@Override
public int add(Category category) {
try{
categoryService.update(category);
}catch(Exception e){
System.out.println("更新缓存失败");
return 0;
}
return categoryMapper.add(category);
}
@Override
public int delete(int id) {
String key = "category_id("+id+")";
System.out.println("删除缓存");
jedis.del(key.getBytes());
return categoryMapper.delete(id);
}
@Override
public Category get(Category category) {
Category c = new Category();
String key = "category_id("+category.getId()+")";
//s = (Student)MemcachedUtil.get(key); //Memcache
c = (Category) SerializeUtil.unserialize(jedis.get(key.getBytes())); //Redis
System.out.println("从缓存中读取");
/**从缓存中读取如果为空则从数据库中读取*/
if(c == null){
System.out.println("从数据库中读取");
c = categoryMapper.get(category);
if(c != null){
//MemcachedUtil.set(key, s); //Memcache
jedis.set(key.getBytes(), SerializeUtil.serialize(c)); //Redis
}else{
//解决缓存穿透,如果频繁查询一个不存在的数据,会造成不必要的损耗
//最简单的办法就是如果数据库不存在,对应的key缓存设置为一个固定值,下次直接返回这个值
Category cat=new Category();
jedis.set(key.getBytes(),SerializeUtil.serialize(cat));
}
}
return c;
}
/**如果数据库数据更新则需要重新生成缓存*/
@Override
public int update(Category category) {
String key = "category_id("+category.getId()+")";
jedis.del(key.getBytes());
System.out.println("删除原来的缓存");
// jedis.set(key.getBytes(),SerializeUtil.serialize(category));
/**在这里添加新缓存,如果缓存添加成功,数据库却添加失败就形成了脏数据*/
// System.out.println("添加新的缓存");
return categoryMapper.update(category);
}
public List<Category> list() {
return categoryMapper.list();
}
}
注册了个七牛云,把几张图片放到了博客上,
上午身体有点不舒服,浑身疼,睡了一上午好多了,然后看了点面试题,面试题大部分都不会,会的也是一知半解...革命尚未成功,同志仍需努力啊!
遇到的困难:
无
收获:
理解缓存穿透,缓存雪崩,和学了一些面试题
明天的计划:
开始任务7
评论