一. 说明
-
功能:在 redisTemplate 命令执行前后 输出日志
-
原理
- 作用是输出 RedisTemplate 命令执行日志。包括:命令名称、参数、返回值等
- 原理是使用动态代理拦截类 redisConnectionFactory 的 getConnection() 方法,监控Redis命令
- 目前主要输出 get/set/pExpire/pSetEx 等命令日志,可根据需要扩展
- 示例
- 单元测试
@Test
public void RedisTemplateTest() {
String key = "testTemplate:1";
this.redisTemplate.opsForValue().set(key, "testTemplatevalue1", 1000L, TimeUnit.MILLISECONDS);
String value = this.redisTemplate.opsForValue().get(key);
}
- 日志输出
// 输出日志
// 参数分别为:key、超时时间、value
Redis Log: method:pSetEx params:["testTemplate:1","1000","testTemplatevalue1"] result:
// 参数分别为:key 返回结果:result
Redis Log: method:get params:["testTemplate:1"] result:testTemplatevalue1
二. 源码
import com.alibaba.fastjson.JSON;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.lang.reflect.Method;
// https://blog.csdn.net/youbl/article/details/109266634
// https://github.com/youbl/study/tree/master/demo-log-redis
/**
* 本类的作用是输出 RedisTemplate 命令执行日志。包括:命令名称、参数、返回值等
* 原理是使用动态代理拦截类 redisConnectionFactory 的 getConnection() 方法,监控Redis命令
* 目前主要输出 get/set/pExpire/pSetEx 等命令日志,可根据需要扩展
*/
@Configuration
@Slf4j
public class RedisCommandLogBean implements BeanPostProcessor