本系列教程内容提要
我们通过什么机制进行排序呢?
既然你能想到一定是经过一系列的运算过程的出来的排序过程,那么我们可否设计一个符合我们自己网站的 "运算过程" 呢? 我们规定:
- 文章的发布时间+A支持票乘以常量E-B反对票乘以常量E
- 文章7天后不再支持投支持票/反对票
设计Redis表结构
| 表名 | 结构 |
|---|---|
| 文章 | HASH |
| 投票人 | SET |
| 群组 | SET |
| 文章评分排行 | ZSET |
| 文章最新排行 | ZSET |
| 群组最新文章 | ZSET |
| 群组评分排行 | ZSET |

核心源码
查询文章 (查询功能做的最多的就是拼装数据,但是在查询某个群组的文章的时候,就是涉及到了Redis的交集运算)
/** * 获得所有文章列表文章列表 * * @param page 页数 * @param order 排序 * @param model 模型 * @return */ @GetMapping(value = "/getArticleList") public String getArticle(@RequestParam(required = false, defaultValue = "1") Integer page, @RequestParam(required = false, defaultValue = "score") String order, Model model) { /*获取文章列表*/ List<Article> articleArrayList = getArticles(jedis, page, order + ":"); /*拼装分页信息*/ model.addAttribute("articleArrayList", articleArrayList); model.addAttribute("order", order); model.addAttribute("page", page); return "index"; } /** * 获取分组文章列表 * * @return */ @GetMapping(value = "/getGroupArticleList") public String getGroupArticle(@RequestParam(required = false, defaultValue = "1") Integer page, @RequestParam(required = false, defaultValue = "score") String order, @RequestParam(required = true) String group, Model model) { List<Article> groupArticles = getGroupArticles(jedis, group, page, order + ":"); /*拼装分页信息*/ model.addAttribute("groupArticles", groupArticles); model.addAttribute("group", group); model.addAttribute("order", order); model.addAttribute("page", page); return "group"; }发布文章 (发布文章需要注意的是根据文章的所属群组,将其添加至相关群组)
/** * 发布文章 * * @param article * @param model * @return */ @PostMapping(value = "/addArticle") public String addArticle(Article article, Model model) { /*模拟用户*/ User user = getUser(); /*从Redis获取文章的自增ID*/ String id = String.valueOf(jedis.incr("article:")); /*将文章的发帖人本人添加至投票列表*/ String voted = "voted:" + id; jedis.sadd(voted, user.getUserId().toString()); jedis.expire(voted, ONE_WEEK_IN_SECONDS); /*将文章添加至文章列表*/ long now = System.currentTimeMillis() / 1000; String articleId = "article:" + id; HashMap<
