之前开发系统的时候客户提到了一个需求:需要统计某些页面的访问量,记得当时还纠结了一阵子,不知道怎么去实现这个功能,后来还是在大佬的带领下借助 Redis 实现了这个功能。今天又回想起了这件事,正好和大家分享一下 Spring Boot 整合 Redis 实现访问量统计的全过程。
首先先解释一下为什么需要借助 Redis,其实原因也很简单,就是因为它非常快(每秒可执行大约81000次的 SET 操作,每秒大约可执行110000次的 GET 操作),我们就可以把访问量暂存在 Redis 中,当有人访问页面的时候,就直接在 Redis 中执行 +1 的操作,然后再每隔一段时间把 Redis 中的访问量的数值写入到数据库中就搞定了~
肯定有小伙伴会想:如果我们不借助 Redis 而是直接操作数据库的话会怎么样呢?
访问量的统计是需要频繁读写的,如果不用 Redis 做缓存而是直接操作数据库的话,就会对数据库带来巨大的压力,试想一下如果此时有成千上万个人同时访问页面的话,数据库很可能在这一瞬间造成数据库的崩溃。对于这种高读写的场景,就需要直接在 Redis 上读写,等到合适的时间,再将数据批量写到数据库中。所以通常来说,在必要的时候引入Redis,可以减少MySQL(或其他)数据库的压力。
首先还是需要引入 Redis 依赖
接下来就在配置文件中增加 Redis 的相关配置
P.S. 如果 Redis 设置了密码,别忘了增加 password 配置哦 ~
首先在 Utils 包内新增一个 RedisUtil
然后再新增一个 RedisConfig 类
有些眼尖的小伙伴会发现在 RedisUtil 工具类中,我们在 private RedisTemplate<String, Object> redisTemplate 上增加的是 @Resource 注解,并非是 @Autowire 注解。
原因也很简单,在源码中我们可以看到 RedisTemplate 指定的是泛型,如果在注入 RedisTemplate 时,值的部分使用了 Object ,那么再使用@AutoWired 注解注入就会报空指针的错误,所以需要使用 @Resource 注解(二者的区别是前者是根据类型注入后者是根据名字注入,具体的这里就不详细说,有兴趣的小伙伴可自行百度查阅😄)
Redis 的相关代码到这里就写完了, 接下来我们就以“记录A页面的访问量”为需求,写一个简单的业务逻辑,代码仅供参考哦 ~
首先我们新建一个数据库表,表结构很简单,只有三个字段,分别是ID、访问量、统计时间
我们再写一下操作这个表的 CRUD 方法(这个也很简单,相信各位小伙伴都可以脑补出来 (●’◡’●) 所以在这里就不写具体代码了)
此处略去一万个字…😄
下面我们写一个监听类:
监听器的作用就是当项目启动后,在数据库表中插入一条空记录,并且在 Redis 中存入这条空记录的 id,并且将其访问量初始化为0。
最后我们再写一下跳转A页面的方法:
这时候代码就全部搞定了,我们启动一下项目,看看执行效果👇
我们每点跳转一次页面,Redis 中的访问量就会执行+1操作,实现了访问量的记录,最后一步就是把 Redis 中记录的访问量写入数据库就大功告成啦~
我这里选择的是使用定时任务的方式写入,每间隔一段时间写入一次(为了能看到明显的效果,就写成了每间隔40秒执行一次)👇
P.S. 写入数据库的过程就很简单了,而且有很多办法可以实现写入的操作,这里的定时任务只作为参考哦~ o( ̄▽ ̄)ブ