RedisTemplate读取slowlog

Stella981
• 阅读 589

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

maven

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
            <version>2.4.3</version>
        </dependency>

redisAsyncCommands.slowlogGet

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

        List<Slowlog> 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<String> args;
    
        @Tolerate
        public Slowlog() {
        }
    
        public static Slowlog from(Object object){
            List data = (List)object;
            List<byte[]> args = (List<byte[]>) 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

    点赞
    收藏
    评论区
    推荐文章
    待兔 待兔
    3个月前
    手写Java HashMap源码
    HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
    Wesley13 Wesley13
    3年前
    jmxtrans+influxdb+grafana监控zookeeper实战
    序本文主要研究一下如何使用jmxtransinfluxdbgranfa监控zookeeper配置zookeeperjmx在conf目录下新增zookeeperenv.sh,并使用chmodx赋予执行权限,内容如下JMXLOCALONLYfalseJMXDISABLEfals
    Wesley13 Wesley13
    3年前
    (六)SpringBoot与数据访问
    1、JDBC<dependency<groupIdorg.springframework.boot</groupId<artifactIdspringbootstarterjdbc</artifactId</dependency<dependency
    Wesley13 Wesley13
    3年前
    Java登录验证码,保存到redis
    引入redis依赖<dependency<groupIdorg.springframework.boot</groupId<artifactIdspringbootstarterdataredis</artifactId</dependency验证码生成类pack
    Easter79 Easter79
    3年前
    SpringBoot集成Spring Security实现登陆和简单权限验证
    1.数据库配置好2.导依赖<!springsecurity安全认证<dependency<groupIdorg.springframework.boot</groupId<artifactIdspringb
    Stella981 Stella981
    3年前
    SpringBoot整合Redis乱码原因及解决方案
    问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
    Stella981 Stella981
    3年前
    SpringBoot使用RedisTemplate操作Redis时,key值出现 -xac-xed-x00-x05t-x00-tb
    原因分析原因与RedisTemplate源码中的默认序列化方式有关defaultSerializernewJdkSerializationRedisSerializer(classLoader!null?classLoader:this.getClass().getClassLoader()
    Easter79 Easter79
    3年前
    StringRedisTemplate 和RedisTemlate有什么不同
    !(https://oscimg.oschina.net/oscnet/d9a57bab608048498b61a1b3349530cb54f.jpg)前言上一篇文章讲的搭建一个redisspringboot的实例,用到了RedisTemplate,可以成功的访问redis数据库,也可以从中读取数据并显示
    Easter79 Easter79
    3年前
    SpringBoot整合Redis乱码原因及解决方案
    问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
    Easter79 Easter79
    3年前
    SpringBoot使用RedisTemplate操作Redis时,key值出现 -xac-xed-x00-x05t-x00-tb
    原因分析原因与RedisTemplate源码中的默认序列化方式有关defaultSerializernewJdkSerializationRedisSerializer(classLoader!null?classLoader:this.getClass().getClassLoader()