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;}/*** 注册实现类到工厂*/@PostConstructpublic void registerIntoPostFactory(){HandlePostFactory.addBeanPostProcessor(this);}@Overridepublic void handleBefore(CacheHandleProcessorModel cacheHandleProcessorModel) {}@Overridepublic void handleAfter(CacheHandleProcessorModel cacheHandleProcessorModel) {}@Overridepublic void onSuccess(CacheHandleProcessorModel cacheHandleProcessorModel) {}@Overridepublic 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;}
