基于Redis的实时排行榜
发布日期:2021-11-15 14:57:37
浏览次数:28
分类:技术文章
本文共 5672 字,大约阅读时间需要 18 分钟。
此文档主要演示了如何使用 Spring Boot 集成Redis的实时排行榜
根据用户点赞数量,获取热点文章
文章实时排序接口类
/** * 文章实时排序接口类 * * @author xiehengxing * @date 2020/8/12 15:17 */public interface ArticleService { /** * 文章详情key */ String ARTICLE_DETAIL_KEY = "article:detail:key:"; /** * 文章分值key */ String ARTICLE_SCORE_KEY = "article:score:key"; /** * 文章点赞用户key */ String ARTICLE_LIKE_USER_KEY = "article:like:user:key:"; /** * 创建文章 * * @param articleId * @param articleContent */ boolean createArticle(Long articleId, String articleContent); /** * 分页查询最受欢迎文章 * @param page * @param pageSize * @return */ ListgetArticleSort(int page, int pageSize); /** * 用户点赞文章 * * @param userId * @param articleId */ boolean userLikeArticle(Long userId, Long articleId); /** * 清除文章点赞记录 * * @param articleId */ boolean clearLikeInfo(Long articleId);}
@Slf4j@Servicepublic class ArticleServiceImpl implements ArticleService { @Resource private RedisTemplate redisTemplate; @Override public boolean clearLikeInfo(Long articleId) { // 清除历史点赞用户 redisTemplate.delete(ARTICLE_LIKE_USER_KEY+ articleId); // 重置文章排序 redisTemplate.opsForZSet().add(ARTICLE_SCORE_KEY, articleId, 0); return true; } /** * 创建文章 * * @param articleId * @param articleContent */ public boolean createArticle(Long articleId, String articleContent) { // 获取历史点赞用户 Long size = redisTemplate.opsForSet().size(ARTICLE_LIKE_USER_KEY+ articleId); // 添加文章到缓存排序列表 redisTemplate.opsForZSet().add(ARTICLE_SCORE_KEY, articleId, size); // 添加文章内容到缓存中 redisTemplate.opsForValue().set(ARTICLE_DETAIL_KEY+ articleId, articleContent, 1, TimeUnit.HOURS); return true; } /** * 用户点赞文章 * * @param userId * @param articleId */ public boolean userLikeArticle(Long userId, Long articleId) { // 检查文章是否存在 Long index = redisTemplate.opsForZSet().rank(ARTICLE_SCORE_KEY, articleId); if(null == index){ return false; } // 检查用户是否已点赞该文章 boolean isLike = redisTemplate.opsForSet().isMember(ARTICLE_LIKE_USER_KEY + articleId, userId); if(isLike){ log.debug("用户:[{}]已点赞文章:[{}]", userId, articleId); return false; } // 增加文章点赞数量 // 记录文章点赞用户 redisTemplate.opsForZSet().incrementScore(ARTICLE_SCORE_KEY, articleId, 1); redisTemplate.opsForSet().add(ARTICLE_LIKE_USER_KEY+ articleId, userId); return true; } /** * 分页查询最受欢迎文章 * @param page * @param pageSize * @return */ public ListgetArticleSort(int page, int pageSize) { int start = (page - 1) * pageSize; int end = start + pageSize - 1; // 根据点赞数倒叙分页查询文章 Set > tuples = redisTemplate.opsForZSet().reverseRangeByScoreWithScores(ARTICLE_SCORE_KEY, start, end); if(CollectionUtils.isEmpty(tuples)){ return Collections.EMPTY_LIST; } // 查询文章内容及点赞用户 List list = new ArrayList<>(); for (DefaultTypedTuple tuple: tuples) { ArticleVO vo = new ArticleVO(); Long articleId = tuple.getValue(); vo.setArticleId(tuple.getValue()); vo.setScore(tuple.getScore()); // 查询文章内容 String content = (String) redisTemplate.opsForValue().get(ARTICLE_DETAIL_KEY + articleId); vo.setArticleContent(content); // 查询点赞用户 Set userIds = redisTemplate.opsForSet().members(ARTICLE_LIKE_USER_KEY+ articleId); vo.setLikeUserIds(userIds); list.add(vo); } return list; }}
控制层
/** * @author xiehengxing * @date 2020/8/12 17:27 */@Controller@Slf4jpublic class ArticleController { @Resource private ArticleService articleService; @RequestMapping(value ="/getArticle") public String getArticle(Model model) { ListarticleSort = articleService.getArticleSort(1, 10); model.addAttribute("list", articleSort); return "page/index"; } @RequestMapping(value ="/add") public String index(Model model) { for (long i = 0; i < 10; i++) { articleService.createArticle(i, "我是ID:"+ i + "的文章内容~~~"); } List articleSort = articleService.getArticleSort(1, 10); model.addAttribute("list", articleSort); return "redirect:getArticle"; } @RequestMapping(value ="/like") public String like(Long articleId, Model model) { if (null == articleId) { model.addAttribute("errorMassage", "文章ID为空"); return "page/error"; } // 模拟随机用户ID Long userId = System.currentTimeMillis(); boolean flag = articleService.userLikeArticle(userId, articleId); if(!flag){ return "page/error"; } return "redirect:getArticle"; } @RequestMapping(value ="/clearLike") public String clearLike(Long articleId, Model model) { if (null == articleId) { model.addAttribute("errorMassage", "文章ID为空"); return "page/error"; } boolean flag = articleService.clearLikeInfo(articleId); if(!flag){ return "page/error"; } return "redirect:getArticle"; }}
index.html
转载地址:https://blog.csdn.net/qq_39739458/article/details/107990151 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2024年03月31日 22时52分06秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
028_AUTOSAR RTE学习笔记-1
2019-04-27
029_AUTOSAR VFB学习笔记-2
2019-04-27
030_AUTOSAR软件组件学习笔记
2019-04-27
031_AUTOSAR学习笔记_BSW
2019-04-27
032_AUTOSAR学习笔记_接口
2019-04-27
美团点评实时数仓实践
2019-04-27
安装JUDDI服务器以及发布WSDL:第二部分,发布WSDL
2019-04-27
Java支付系统(三) - SpringBoot 应用程序搭建
2019-04-27
详解Java业务领域分层模型中的vo/po/dto/pojo/bo
2019-04-27
Java持久层框架MyBatis全注解详解
2019-04-27
Java线程组ThreadGroup
2019-04-27
Java同步器之AbstractOwnableSynchronizer详解
2019-04-27
为什么需要学习并发编程?
2019-04-27
Java计算机IT编程文档常见单词翻译
2019-04-27
Java协作中断机制
2019-04-27
MySQL8.0数据库基础教程(二)-理解"关系"
2019-04-27
2020年最新阿里Java面试题,看看你都会了吗?
2019-04-27
大厂业务开发面试必问的UML你都会了吗?
2021-06-30
MySQL8.0关系数据库基础教程(三)-select语句详解
2021-06-30