发表于: 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


返回列表 返回列表
评论

    分享到