Java工程師之Redis實戰系列教程教程是一個學習教程,是關於Java工程師的Redis知識的實戰系列教程,本系列教程均以解決特定問題爲目標,使用Redis快速解決在實際生產中的相關問題,爲了更方便的與你們一塊兒探討與學習,每一個章節均提供儘量詳細的示例源碼及註釋,全部示例源碼都可在javacourse-redis-in-action找到相關幫助!html
若是你想過本身開發一個論壇網站,或者文章網站?最起碼想過開發本身的博客網站吧?那麼你是否考慮過這個問題--「當你數據庫查詢你的記錄時,你考慮過這些記錄應當以什麼樣的方式展示在網頁?按發佈時間?按瀏覽次數?java
你是否瀏覽過stackoverflow,以下圖所示,你是否考慮過這些記錄時按照什麼展示的呢?唔...通過你的長久思考後,你想「應該不是最新,也不是瀏覽最多,應該時通過一系列的機制後算出來的....」git
既然你能想到必定是通過一系列的運算過程的出來的排序過程,那麼咱們能否設計一個符合咱們本身網站的 "運算過程" 呢? 咱們規定:github
表名 | 結構 |
---|---|
文章 | HASH |
投票人 | SET |
羣組 | SET |
文章評分排行 | ZSET |
文章最新排行 | ZSET |
羣組最新文章 | ZSET |
羣組評分排行 | ZSET |
查詢文章 (查詢功能作的最多的就是拼裝數據,可是在查詢某個羣組的文章的時候,就是涉及到了Redis的交集運算)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<String, String> articleData = new HashMap<>(); articleData.put("title", article.getTitle()); articleData.put("link", article.getLink()); articleData.put("user", user.getUserId().toString()); articleData.put("time", String.valueOf(now)); articleData.put("votes", "1"); articleData.put("group", article.getGroup()); articleData.put("opposeVotes", "0"); jedis.hmset(articleId, articleData); /*將文章添加至分值列表*/ jedis.zadd("score:", now + VOTE_SCORE, articleId); /*將文章添加至發佈時間列表*/ jedis.zadd("time:", now, articleId); /*將文章加入其所屬分組*/ addGroup(jedis, articleId, new String[]{article.getGroup()}); /*設置模型數據*/ model.addAttribute("page", 1); model.addAttribute("order", "score"); return "redirect:/article/getArticleList"; }
投票 (根據咱們前面的規定,7天后再也不提供對該文章的投票功能,因此須要在進行投票以前注意文章的發佈時間)app
/** * 投票 * * @param articleId * @param model * @return */ @GetMapping(value = "/articleVote") public String articleVote(Integer articleId, int tag, RedirectAttributes model) { /*模擬用戶*/ User user = getUser(); String result = article_vote(jedis, user, articleId, tag); /*設置模型數據*/ model.addFlashAttribute("result", result); model.addFlashAttribute("page", 1); model.addFlashAttribute("order", "score"); return "redirect:/article/getArticleList"; }
各位友友能夠下載本章的示例源碼,運行訪問 http://localhost:8080/article/getArticleList
學習
本章源碼提供完整的運行環境源碼GitHub下載網站