[case36]RedisTemplate读取slowlog

本文主要研究一下如何使用RedisTemplate(lettuce类库)读取slowlog

maven

        
            org.springframework.boot
            spring-boot-starter-data-redis
        
        
            org.apache.commons
            commons-pool2
            2.4.3
        

redisAsyncCommands.slowlogGet

    @Test
    public void testGetSlowlog(){
        List slowlogs = redisTemplate.execute(new RedisCallback>() {
            @Override
            public List doInRedis(RedisConnection connection) throws DataAccessException {
                System.out.println(connection.getClass());
                RedisAsyncCommands redisAsyncCommands = (RedisAsyncCommands) connection.getNativeConnection();
                RedisFuture> future = redisAsyncCommands.slowlogGet(10);
                try {
                    return future.get();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    e.printStackTrace();
                }
                return null;
            }
        });

        List result = slowlogs.stream()
                .map(e -> Slowlog.from(e))
                .collect(Collectors.toList());
        System.out.println(result);
    } 
 
  • 这里使用lettuce的redisAsyncCommands的slowlogGet方法获取slowlog
  • 不过这里返回的是List,需要自己解析一下,具体详见下面的slowlog定义

    slowlog

    @Data
    @Builder
    public class Slowlog {
    
        private long id;
        private long timeStamp;
        private long executionTime;
        private List args;
    
        @Tolerate
        public Slowlog() {
        }
    
        public static Slowlog from(Object object){
            List data = (List)object;
            List args = (List) data.get(3);
            Slowlog slowlog = Slowlog.builder()
                    .id(Long.parseLong(data.get(0).toString()))
                    .timeStamp(Long.parseLong(data.get(1).toString()))
                    .executionTime(Long.parseLong(data.get(2).toString()))
                    .args(args.stream().map(e -> new String(e)).collect(Collectors.toList()))
                    .build();
            return slowlog;
        }
    }
    • 这里定义了slowlog的属性,其中还定义了从lettuce接口返回的Object的解析

    小结

    redisTemplate并没有提供现成的api来获取slowlog,因此需要通过execute方法获取底层的client实现,然后执行相关的操作来获取slowlog。

    doc

    • lettuce api
    • spring-data-redis command-reference

    你可能感兴趣的:(redis)