峰会贴子(文章)点赞功能设计,采用springboot+redis+quartz来实现。
按惯例,源代码已上传:
功能需求:如下图所描述,很明显,该需求的难点在于用户对于点赞和取消点赞状态的频繁转换操作。
如果我们按照常规方式直接操作db,对数据库的压力很大,由此引出了redis和quartz框架的使用。
实现思路:
1,用户的点赞(取消点赞)等信息先以map的形式保存到redis中;
2,使用redis提供的原子性操作,对点赞数进行加1减1的操作;
3,使用quartz框架,把redis中的数据定时更新到mysql(oracle)中
前面五个截图展示了关键的实现过程。
1,定义两个redis的key。我们要采用的是redis的map结构(由key名子也可以看出)第一个拿来保存我们的点赞具体信息点赞关注网站,第二个拿来保存某文章被点赞数目。
2,我们按照文章id,即artId和用户id,即userId,拼接作为map集合中key的值(示例看图二)
3,我们按照用户的点赞状态(是点赞还是取消点赞)来调用不同的方式(图三)。当用户点赞时,依据第二点,map集合中的每一个key的组成型式都是文章id在前,用户id在后,即111111_222222的方式,对应储存的值为点赞状态的标示值(1,点赞,0,取消点赞/未点赞)。这样,我们就把所有的关键信息都以通配符对的方式储存了。如果文章id为1,用户id为1,用户进行点赞操作,这么我们储存的结果为:“1_1”:“1"的方式,假如进行取消点赞操作,那结果自然为"1_1”:“0"的方式。如右图所示,这样,把用户频繁的点赞取消操作放在redis中处理。
4,这儿可以采用quartz提供的定时调度机制来定时的更新数据到关系数据库中。倘若您开发框架也是springboot,这么直接让你的scheduler实现ApplicationRunner插口,重画其run方式,这样scheduler都会伴随着容器启动。
5点赞关注网站,使用redisTemplate封装的scan,即扫描方式,遍历出map集合中所有的通配符对,我们的键上面以111_222的方式封装的artId和userId,取出后以”_"标示拆开即可;而当前的值即代表点赞(取消点赞)的状态。这种信息保存到like对象中,之后把每一个like对象保存到一个list集合中返回即可。
具体思路大体如上面所述,一些具体的实现还有一些细节的地方在代码里面也完善了,但是仍有很多不足之处。
近期工作较忙,开头写了近一个月,正文一直没写,实在抱歉。
后期会在现有基础上继续优化,感谢阅读,欢迎讨论!