竹笋

首页 » 问答 » 问答 » Boot如何记录SpringRed
TUhjnbcbe - 2023/9/8 21:20:00
北京看白癜风上那个医院 https://mip.yyk.99.com.cn/fengtai/68389/jingyan-392913.html

工程结构图:

概要

这两天在搬砖,有个需求,是统计类的。一般来说,统计类的东西,比如要统计:用户总数,用户的新增总数,当天每个小时为维度的新增数量,各个渠道的新增用户数量;这些,可能都得在redis里维护,然后某个用户注册时,去把所有这些redis结构+1。

但这种代码,一般入口很多,修改这些值的地方很多,编码时很容易发生遗漏,或者编码错误,导致最后统计数据不准确。数据不准确,当然是bug,问题是,这种bug还不好排查。

如果能够记录下redis操作日志就好了。

以下,是我已经实现的效果,这是一次请求中的一次redis操作,可以看到,是put方法。

实现思路

我们用的是springboot2.1.7,直接集成的RedisTemplate。当然,只要是使用RedisTemplate即可,和springboot没多大关系。

我看了下我们平时是怎么去操作redis的hash结构的,大概代码如下:

Autowired

Qualifier(redisTemplate)privateRedisTemplateString,ObjectredisTemplate;HashOperationsString,HK,HVops=redisTemplate.opsForHash();ops.put(key,hashKey,fieldValue);

一般就是,先通过opsForHash,拿到HashOperations,再去操作hash结构。

我现在的想法就是,在执行类似ops的put的方法之前,把那几个参数记录到日志里。

要想让ops记录我们的日志,我们只能拦截其每个方法,这一步就得使用一个代理对象,去替换掉真实的对象。

但是,怎么才能让redisTemplate.opsForHash()返回的ops,是我们代理过的对象呢?

所以,这一步,还得在生成redisTemplate的地方下功夫,让其生成一个redisTemplate的代理对象,这个代理对象,拦截opsForHash方法。

总结下,需要做两件事:

对redisTemplate做代理,拦截opsForHash方法;在拿到第一步的原有的ops对象后,对ops对象做代理,拦截其put方法等。代码实现

原有代码

代理RedisTemplate

大家可以仔细看上面的代码,利用了前一讲我们学习了的ProxyFactory,来生成代理;使用它呢,比较方便,不用管底层它是用jdk动态代理,还是cglib代理,spring已经帮我们处理好了。

总之,上面这段,就是把redisTemplate给换了。我们具体要在拦截了opsForHash里,做什么动作呢?我们再看。

代理opsForHash的返回结果

总结

我这个拦截比较粗,现在是把get类的日志也打出来了。大家可以判断下method的名称,来自行过滤掉。

ok,本篇先到这里。如果对您有所帮助记得给个

1
查看完整版本: Boot如何记录SpringRed