Redis高并发注解方法及代码方法

2020-01-02  本文已影响0人  小星星吃KFC

1、使用注解

 @Cacheable(value = RedisService.REDIS_VALUE_IPLOG,sync=true)
    @Override
    public List<Userinfo> getAllUserinfo() {
        System.out.println("userinfoMapper = " + userinfoMapper);
        return userinfoMapper.getAll();
    }

2、代码控制,双重监测加锁
①Service中代码

    return redisService.gettWithThread("redis_keys_all_user_info", new Callable() {
            @Override
            public Object call() throws Exception {
                return userinfoMapper.getAll();
            }
        });

②RedisService 中代码,统一封装,用callable返回值

   public List<Userinfo> gettWithThread(final String key, Callable callable) {

        boolean result = false;

        List<Userinfo> list = ( List<Userinfo> )redisTemplate.opsForValue().get(key);
        try {

            // 双重检测锁
            if (null==list){
                synchronized (this){
                    // 在redis中获取
                    list= ( List<Userinfo> )redisTemplate.opsForValue().get(key);
                    if (null==list){
                        System.out.println("查询数据库------------");

                        list = (List<Userinfo>) callable.call();

                        redisTemplate.opsForValue().set(key,list);
                        result = true;
                    }else {
                        System.out.println("查询redis缓存------------");
                    }
                }
            }else{
                System.out.println("查询redis缓存------------");
            }

        }catch (Exception e){

            return list;
        }
        return list;
    }

3、测试接口

  @RequestMapping(value = "/getAllUserInfo.do")
    public Object getAllUserInfo() {
      
        Runnable runnable = () -> iUserinfoService.getAllUserinfo();
        /**简历线程池,避免直接用线程**/
        ExecutorService executorService = Executors.newFixedThreadPool(5);
        /**submit有返回值,而execute没有*/
        for (int i = 0; i < 1000; i++) {
            executorService.submit(runnable);
        }
      return iUserinfoService.getAllUserinfo();

    }


    @RequestMapping(value = "/getAllUserInfo2.do")
    public Object getAllUserInfo2() {

        Runnable runnable = () -> iUserinfoService.getAllUserinfoWithRedis();

        /**简历线程池,避免直接用线程**/
        ExecutorService executorService = Executors.newFixedThreadPool(5);
        /**submit有返回值,而execute没有*/
        for (int i = 0; i < 1000; i++) {
            executorService.submit(runnable);
        }
        return iUserinfoService.getAllUserinfoWithRedis();

    }
上一篇 下一篇

猜你喜欢

热点阅读