<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

       

        1. 使用AOP在不改變原有方法的基礎上對接口方法增強,引入依賴

      <!--引入AOP依賴-->
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-aop</artifactId>
      </dependency>
      <!--引入Redis依賴-->
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-data-redis</artifactId>
      </dependency>

       

        2. 自定義注解,在需要統計耗時的接口上添加注解

      @Target(ElementType.METHOD)
      @Retention(RetentionPolicy.RUNTIME)
      public @interface TakeCount {
      
          int time() default 60;
      }

       

        3. 配置redis過期監聽和redis配置類

        接口訪問次數可以通過監聽redis對應過期key來獲取對應的訪問次數

      @Slf4j
      public class KeyExpiredListener extends KeyExpirationEventMessageListener {
      
          @Autowired
          @Qualifier("myRedisTemplate")
          private RedisTemplate redisTemplate;
      
          @Autowired
          private PrjAssignService prjAssignService;
      
      
          public KeyExpiredListener(RedisMessageListenerContainer listenerContainer) {
              super(listenerContainer);
          }
      
          @Override
          public void onMessage(Message message, byte[] pattern) {
              //獲取對應的接口訪問次數
              log.info("{}接口在指定時間內被訪問{}次",message,redisTemplate.opsForValue().get(message + ":count"));
              redisTemplate.delete(message + ":count");
      
      //        PrjAssign one = prjAssignService.lambdaQuery().eq(PrjAssign::getId, "67f351605c0afe134e349e6d12434b48").one();
      //        log.info(JSONUtil.toJsonStr(one));
          }
      }
      @Configuration
      public class RedisConfiguration {
      
      
          @Autowired
          private RedisConnectionFactory redisConnectionFactory;
      
      
          @Bean
          public RedisMessageListenerContainer redisMessageListenerContainer() {
              RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer();
              redisMessageListenerContainer.setConnectionFactory(redisConnectionFactory);
              return redisMessageListenerContainer;
          }
      
          @Bean
          public KeyExpiredListener keyExpiredListener() {
              return new KeyExpiredListener(this.redisMessageListenerContainer());
          }
      
          //配置Redis的字符串序列化,默認的為jdk本身的序列化,存儲時會亂碼
          @Bean("myRedisTemplate")
          @SuppressWarnings("all")
          public RedisTemplate redisTemplate(RedisConnectionFactory factory){
              RedisTemplate<String, Object> template = new RedisTemplate<>();
      
              //key序列化
              template.setKeySerializer(new StringRedisSerializer());
              //value序列化
              template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
              //hash的key序列化
              template.setHashKeySerializer(new StringRedisSerializer());
              //hash的value序列化
              template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
      
              template.setConnectionFactory(factory);
              return template;
          }
      }

       

        4. 定義AOP切面

        在使用了注解的接口上,會被spring掃描,當方法執行前會先執行doBefore()方法,記錄開始時間訪問次數,方法執行完成后執行doAfter()方法

      @Slf4j
      @Aspect
      @Component
      public class TakeCountAspect {
      
          @Autowired
          @Qualifier("myRedisTemplate")
          private RedisTemplate redisTemplate;
      
          //用threadlocal記錄當前線程的開始訪問時間
          private ThreadLocal<Long> startTime = new ThreadLocal<>();
      
          @Before("@annotation(takeCount)")
          public void doBefore(TakeCount takeCount){
              //記錄開始時間
              startTime.set(System.currentTimeMillis());
              HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
              //記錄請求內容
              String url = request.getRequestURL().toString();
              //查詢緩存中是否存在key并存儲,存在+1,
              Boolean absent = redisTemplate.opsForValue().setIfAbsent(url, "num", takeCount.time(), TimeUnit.SECONDS);
              if (absent){
                  redisTemplate.opsForValue().set(url + ":count",1);
              }else {
                  redisTemplate.opsForValue().increment(url + ":count");
              }
          }
      
          @After("@annotation(TakeCount)")
          public void doAfter(JoinPoint point){
              log.info("{}訪問耗時為:{}ms",point.getSignature().getName(),(System.currentTimeMillis() - startTime.get()));
          }
      }

       

        5. 定義接口方法,在方法上使用注解

          /**
           * 通過id查詢項目任務書
           * @param id id
           * @return R
           */
          @Operation(summary = "通過id查詢", description = "通過id查詢")
          @GetMapping("/{id}" )
          @TakeCount()
          public R getById(@PathVariable("id" ) String id) {
              return R.ok(prjAssignService.getByIdAssign(id));
          }

       

       

      posted on 2024-04-23 14:48  homle  閱讀(2539)  評論(0)    收藏  舉報

      主站蜘蛛池模板: 亚洲旡码欧美大片| 国产又黄又硬又粗| 国产短视频精品一区二区| 日韩一区二区三区高清视频| 日本55丰满熟妇厨房伦| 国产成人av三级在线观看| 老太脱裤子让老头玩xxxxx| 亚洲日本va午夜蜜芽在线电影| 亚洲av成人网在线观看| 欧美性猛交xxxx乱大交丰满| 无码少妇一区二区| 日韩中文字幕免费在线观看 | 成人免费A级毛片无码片2022| 免费无码黄动漫在线观看| 精品亚洲精品日韩精品| 亚洲成在人线AV品善网好看| 我国产码在线观看av哈哈哈网站| 国产精品无码一区二区在线观一| 久久人体视频| 亚洲天堂av在线免费看| 香蕉在线精品一区二区| 久久天堂综合亚洲伊人HD妓女| 国产精品系列在线免费看| 婷婷四房综合激情五月在线| 色先锋av影音先锋在线| 日本高清无卡码一区二区| 免费午夜无码片在线观看影院| 亚洲精品视频一二三四区| 久久久久无码中| 人妻中出无码中字在线| 国产中文字幕日韩精品| 一日本道伊人久久综合影| 老色鬼永久精品网站| 亚洲真人无码永久在线| 婷婷国产成人精品视频| 99在线国内在线视频22| 久久精品国产亚洲av电影 | 精品熟女少妇av免费久久| 国产成人精彩在线视频| 无码精品国产va在线观看dvd| 亚洲激情国产一区二区三区|