1、监控
通过继承 AbstractCacheMonitorConsumer 对监控数据进行消费处理(客户端内部异步线程)
监控源数据
MonitorData {
/**
* 连接资源唯一标识
*/
private String cacheType;
/**
* 操作的命令
*/
private String commands;
/**
* 缓存的key
*/
private String key;
/**
* 如果是批量命令,则通过List传递
*/
private List<String> keys;
/**
* 命令执行时间
*/
private int executeTime;
/**
* 执行结果,true 成功,false 失败
*/
private boolean result;
}
在extend.handle.monitor中,已支持3个监控统计实现
- CacheCounterMonitorConsumer:count类监控统计,需使用者修改doMonitor实现
- CacheTimerMonitorConsumer:timer类监控统计,需使用者修改doMonitor实现
CacheHotKeyMonitorConsumer:热key监控统计,默认每5秒通过debug方式输出数据
热key统计监控数据接入方式
log4j.xml文件中增加配置:允许热keydebug日志输出到hotekey.log
<appender name="redis-hotkey" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="/opt/log/lcache/${log4j.log.dir}/hotekey.log"/>
<param name="DatePattern" value="'.'yyyy-MM-dd"></param>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%m%n"/>
</layout>
</appender>
<logger name="com.lcache.extend.handle.monitor.hotkey" additivity="false">
<level value="debug" />
<appender-ref ref="redis-hotkey" />
</logger>
2、后置处理
Lcache中的每次操作(CONNECT/COMMANDS)都通过统一的执行调度器进行执行,并在内部集成了多级缓存与各种后置处理;
通过实现 AbstractHandlePostProcessor 抽象类扩展public abstract class AbstractHandlePostProcessor implements InterfaceHandlePostProcessor {
/**
* 获取优先级Id,ID高先执行前置,后执行后置、成功、失败,可以理解为洋葱,外层包内层,核心是handle
*
* @return
*/
public abstract int getOrder();
/**
* 获取处理器Id,后置处理工厂通过此ID进行唯一校验
*
* @return
*/
public abstract int getHandlePostId();
/**
* 获取处理器类型,支持 CONNECT 与 HANDLE
*
* @return
*/
public abstract HandlePostProcessorTypeEnum getHandleType();
/**
* 获取客户端类型,支持 RedisClientConstants.JEDIS 与 RedisClientConstants.LETTUCE
*
* @return
*/
public abstract int getClientType();
@Override
//如果指定了命令,则使用限定命令
public Set<String> specifiedCommands() {
return null;
}
/**
* 注册实现类到工厂
*/
@PostConstruct
public void registerIntoPostFactory(){
HandlePostFactory.addBeanPostProcessor(this);
}
@Override
public void handleBefore(CacheHandleProcessorModel cacheHandleProcessorModel) {
}
@Override
public void handleAfter(CacheHandleProcessorModel cacheHandleProcessorModel) {
}
@Override
public void onSuccess(CacheHandleProcessorModel cacheHandleProcessorModel) {
}
@Override
public void onFail(CacheHandleProcessorModel cacheHandleProcessorModel) {
}
}
后置处理支持灵活扩展,Lcache中默认实现3个后置处理:
JedisHandlesPostProcessor:onFail中捕获Lua脚本异常,并进行重新缓存,保证Lua脚本缓存自动化执行高可用;
- JedisPubSubPostProcessor:subscribe 命令进入,onFail增加重试保证Jedis的消费闪断重连;
- LettuceHandlesPostProcessor:onFail中增加Lua脚本异常处理与Lettuce单连接自动重连功能;
后置处理执行流程
- 后置处理工厂将后置处理器根据orderId进行倒排,调用前置处理;
- 前置执行处理完毕后执行命令;
- 将后置处理器根据orderId再进行一次倒排,调用后置、成功、失败处理;
后置处理上下文数据
public class CacheHandleProcessorModel {
/**
* 命令
*/
private String commands;
/**
* key
*/
private String key;
/**
* keys
*/
private List<String> keys;
/**
* 方法
*/
private CacheFunction function;
/**
* 执行结果
*/
private Object result;
/**
* 命令执行时间
*/
private Long executeTime;
/**
* 配置
*/
private CacheConfigModel cacheConfigModel;
/**
* 异常信息
*/
private Exception e;
}