论坛帖子(文章)点赞功能设计,采用+redis+来实现。
按惯例,源代码已上传:
功能需求:如下图所描述,很明显,该需求的难点在于用户对于点赞和取消点赞状态的频繁转换操作。
如果我们按照常规方式直接操作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,即,拼接作为map集合中key的值(示例看图二)
3,我们根据用户的点赞状态(是点赞还是取消点赞)来调用不同的方法(图三)。当用户点赞时,根据第二点,map集合中的每一个key的组成形式都是文章id在前,用户id在后,即的形式,对应存储的值为点赞状态的标识值(1,点赞,0,取消点赞/未点赞)。这样,我们就把所有的关键信息都以键值对的形式存储了。 假如文章id为1,用户id为1,用户进行点赞操作,那么我们存储的结果为:“1_1”: “1"的形式,如果进行取消点赞操作,那结果自然为"1_1”: “0"的形式。如下图所示,这样,把用户频繁的点赞取消操作放到redis中处理。
4,这里可以采用提供的定时调度机制来定时的更新数据到关系数据库中。如果您开发框架也是,那么直接让你的实现接口,重写其run方法,这样就会伴随着容器启动。
5,使用封装的scan,即扫描方法,遍历出map集合中所有的键值对,我们的键里面以的形式封装的artId和,取出后以”_"标识拆开即可;而当前的值即代表点赞(取消点赞)的状态。这些信息保存到like对象中,然后把每一个like对象保存到一个list集合中返回即可。
具体思路大体如上面所述,一些具体的实现还有一些细节的地方在代码里面也完善了,但是仍有很多不足之处。
近期工作较忙,开头写了近一个月,正文一直没写,实在抱歉。
后期会在现有基础上继续优化,感谢阅读,欢迎讨论!