公司需要做一个文章投票功能,需求为用户发布的文章可以有一周的投票时间,每个用户只可以给一篇文章投一次票,文章发布超过7天则无法投票。需要对文章进行发布时间排序和投票分值排序以及文章分组。 一开始使用关系型数据库来完成,但后来发现有大量的刷票软件,所以为了用户体验感和数据库安全起见,使用redis来优化
解决思路: 可以使用redis的Set Zset Hash 三个数据类型来解决。
首先,需要一个Hash来存放文章的具体信息,key为文章的Id ,hashKey为文章的各个字段,value为文章的字段值
其次,通过set无法重复的特性,来创建一个set来存放文章已经投票过的人数,set的name为文章Id,menber为投票用户的Id。 这个set发布一周之后删除。
再者,排序可以通过两个Zset来解决, TimeZset member存放文章id,分值存放文章发布时间。 ScoreZset member存放文章id,分值存放文章投票分值
最后: 文章分组可以创建多个分组set。 可以通过set和上面的Zset进行交集操作,找到Zset里和set member值一样的member。
发布思路: 用户发布一篇文章之后,在TimeZset和ScoreZset里分别插入数据 member为文章id(通过自增得到) value为 文章发布时间或者分值,并且为该文章创建一个Set,Set的name为文章Id,并且在里面插入作者id 。同时根据文章类型 在分组set里插入文章id
投票思路:当用户为一篇文章投票后,先去TimeZset里找到该文章对应的分值 看看是否超过7天。 如果没有超过7天 则再查看是否可以在文章投票Set里插入,如果无法插入说明投过票了 如果可以插入则在插入时候,更新ScoreZset
分组筛选思路: 通过对应的分组Set 来和TimeZset和ScoreZset交集找出对应的文章id ,再通过文章id找到对应的hash。 可以传入参数页数进行分页