Spring boot 搭建个人博客系统(六)——文章点击量和阅读排行榜
Spring boot 搭建个人博客系统(六)——文章点击量和阅读排行榜
一直想用Spring boot 搭建一个属于自己的博客系统,刚好前段时间学习了叶神的牛客项目课受益匪浅,乘热打铁也主要是学习,好让自己熟悉这类项目开发的基本流程。系统采用Spring boot+MyBatis+MySQL的框架进行项目开发。
项目源码:Jblog
个人主页:tuzhenyu’s page
原文地址:Spring boot 搭建个人博客系统(六)——文章点击量和阅读排行榜
0. 思路
文章点击量是记录访问文章页的次数,可以通过Spring拦截器或Spring AOP实现对文章页请求的拦截,每次拦截到请求后增加相应文章的一次点击量。阅读排行榜是对每篇文章的点击量进行排序,取出排序后的点击量排名前10的文章作为热门文章。
如果使用数据库记录点击次数,每次用户访问文章页需要写一次数据库,当并发量较大的时候写数据库是一种很影响性能的操作。可以在系统中使用Redis作为内存数据库用来存储页面点击量等信息,同时Redis具有丰富的数据结构,其中的Sorted Sets可以用来做根据点击量的热门文章排序。
1. 数据模型
系统采用Redis的zset数据结构存储文章点击量,zset是一种有序集合。每个有序集合的成员都关联着一个评分,这个评分用于把有序集合中的成员按最低分到最高分排列。在热门文章排序中,用于有序集合排序的就是每篇文章的点击量。
- 引入Redis的java操作jar包
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.8.0</version><type>jar</type><scope>compile</scope>
</dependency>
- 有序集合zset的操作函数
@Service
public class JedisService implements InitializingBean{private JedisPool pool;@Overridepublic void afterPropertiesSet() throws Exception {pool = new JedisPool("redis://localhost:6379/1");}public double zincrby(String key,String value){Jedis jedis = pool.getResource();double result = jedis.zincrby(key,1,value);jedis.close();return result;}public Set<String> zrevrange(String key,int start, int end){Jedis jedis = pool.getResource();Set<String> set = jedis.zrevrange(key,start,end);jedis.close();return set;}
}
2. 文章点击量
利用Spring拦截器拦截多有文章页的请求,并在Redis中修改相应文章页的点击量,用于热门文章排序。
- 实现文章点击量的拦截器
@Component
public class ArticleClickInterceptor implements HandlerInterceptor {@Autowiredprivate JedisService jedisService;@Overridepublic boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {String uri = httpServletRequest.getServletPath().split("/")[2];String uriKey = RedisKeyUntil.getClickCountKey(uri);jedisService.zincrby("hotArticles",uriKey);return true;}@Overridepublic void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {}@Overridepublic void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {}
}
- 在系统中添加此拦截器
@Component
public class WebConfiguration extends WebMvcConfigurerAdapter{@Autowiredprivate PassportInterceptor passportInterceptor;@Autowiredprivate LoginRequestInterceptor loginRequestInterceptor;@Autowiredprivate ArticleClickInterceptor articleClickInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(passportInterceptor);registry.addInterceptor(loginRequestInterceptor).addPathPatterns("/create");registry.addInterceptor(articleClickInterceptor).addPathPatterns("/article/*");super.addInterceptors(registry);}
}
3. 热门文章排行榜
利用Redis的有序结合zset存放文章点击量,有序集合可以很方便的获取按照点击量的文章排序。从zset中用函数zrevrange获取点击量最多的10篇文章作为热门文章,显示在主页的热门文章列表。
@RequestMapping(path = {"/","/index"})public String index(Model model){List<ViewObject> vos = new ArrayList<>();List<Article> articles = articleService.getLatestArticles(0,4);for (Article article:articles){ViewObject vo = new ViewObject();List<Tag> tags = tagService.getTagByArticleId(article.getId());String clickCount = jedisService.get(RedisKeyUntil.getClickCountKey("/article/"+article.getId()));if (clickCount==null)clickCount = "0";vo.set("clickCount",clickCount);vo.set("article",article);vo.set("tags",tags);vos.add(vo);}model.addAttribute("vos",vos);List<Article> hotArticles = new ArrayList<>();Set<String> set = jedisService.zrevrange("hotArticles",0,6);for (String str : set){int articleId = Integer.parseInt(str.split(":")[1]);Article article = articleService.getArticleById(articleId);hotArticles.add(article);}model.addAttribute("hotArticles",hotArticles);return "index";
}
4. 总结
文章点击量的实现可以利用Spring拦截器拦截文章页的访问请求,也可以利用Spring AOP面向切面编程,将改变点击量的代码织入文章页访问请求的controller处理器中。考虑到在并发量很大的时候,如果每次访问页面都要写数据库会很影响系统性能,引入Redis内存型Key-Value数据库存储文章的点击量。同时Redis的丰富的数据结构也为按照点击量排序获取热门文章列表提供了极大的便利。
Spring boot 搭建个人博客系统(六)——文章点击量和阅读排行榜相关推荐
- Spring boot 搭建个人博客系统(二)——登录注册功能
Spring boot 搭建个人博客系统(二)--登录注册功能 一直想用Spring boot 搭建一个属于自己的博客系统,刚好前段时间学习了叶神的牛客项目课受益匪浅,乘热打铁也主要是学习,好让自己熟 ...
- java 搭建个人博客_Spring boot 搭建个人博客系统(一)——整体思路
Spring boot 搭建个人博客系统(一)--整体思路 一直想用Spring boot 搭建一个属于自己的博客系统,刚好前段时间学习了叶神的牛客项目课受益匪浅,乘热打铁也主要是学习,好让自己熟悉这 ...
- 基于Spring Boot技术栈博客系统企业级前后端实战之课程导论(零)
零.说明(必读) 一.课程概述 1.1 名称 1.2 功能 1.3 技术点 1.4 目标 二.核心功能 2.1 用户管理 2.2 安全设置 2.3 博客管理 2.4 评论管理 2.5 点赞管理 2.6 ...
- 基于Spring Boot的个人博客系统(源码+数据库)
目录 一.系统功能框架图 二.开发技术 三.开发环境 四.页面展示 1.登录页面 2.首页 3.文章详情页面 4.文章评论页面 5.后台页面 6.后台文件编辑页面 7.后台文章管理列表页面 五.文 ...
- 基于Spring Boot的个人博客系统的设计与实现毕业设计源码271611
目 录 摘要 1 绪论 1.1研究意义 1.2开发背景 1.3系统开发技术的特色 1.4论文结构与章节安排 2个人博客系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1数据增加流程 ...
- halo java_Halo - 轻快,简洁,功能强大,使用Spring Boot开发的博客系统
Halo 是一款现代化的个人独立博客系统,给习惯写博客的同学多一个选择. 简介 Halo [ˈheɪloʊ],意为光环.当然,你也可以当成拼音读(哈喽). 一个优秀的开源博客发布应用,值得一试. 声明 ...
- 基于Spring Boot+Vue的博客系统 16——热门文章功能简单的实现
废弃说明: 这个专栏的文章本意是记录笔者第一次搭建博客的过程,文章里里有很多地方的写法都不太恰当,现在已经废弃,关于SpringBoot + Vue 博客系列,笔者重新写了这个系列的文章,不敢说写的好 ...
- Spring MVC + Hibernate JPA + Bootstrap 搭建的博客系统
Spring MVC + Hibernate JPA + Bootstrap 搭建的博客系统 Demo 相关阅读: 1.Spring MVC+Hibernate JPA+ Bootstrap 搭建的博 ...
- 【Microsoft Azure 的1024种玩法】七十一.基于Azure Virtual Machines快速上手搭建Typecho博客系统
[简介] Typecho 是基于 PHP5 构建的开源跨平台博客系统,Typecho开源跨平台博客系统相较于wordpress .hexo有一定的性能优势,是我们记录文章内容的最佳首选博客,那么本篇文 ...
- 手把手带你搭建个人博客系统(一)
⭐️前言⭐️ 该web开发系统涉及到的知识: Java基础 MySQL数据库 JDBC技术 前端三件套(HTML+CSS+JavaScript) Servlet 使用到的开发工具: idea vsco ...
最新文章
- tensorflow量化感知训练_tensorflow
- 学计算机广东2B大学,2017年广东2B大学最新排名情况
- docker容器构建_我如何容器化构建系统
- 代码制作数字流星雨_JS+CSS实现流星雨的动画效果(代码)
- php中轮转图片js代码,纯JavaScript手写图片轮播代码
- 无线桥接正在获取ip问题,设置静态后又无法连接互联网,并且就算连接成功了也速度慢
- 刚做微商引流太慢怎么办?微商没有客源怎么办,微商引流需要注意什么
- ArcGIS勘测定界三调版发布
- Matlab一元线性拟合及F检验
- 1000瓶药水和10只老鼠的问题及其扩展
- 把RAdam和LookAhead合二为一
- Chinese-ELECTRA ‘adam_m not found in checkpoint ‘
- 理解:iOS开发中锁的实现原理
- 深度解析:电商直播基地运营及盈利模式
- Node的老大难问题:require和import
- oracle 数据跟踪软件,oracle数据库跟踪工具
- 【机器人学】冗余七自由度机械臂的解析解逆解算法
- python 生成随机邮箱
- 点餐系统服务器价格,点餐系统小程序报价
- 编写Java程序,模拟教练员和运动员出国比赛场景,其中运动员包括乒乓球运动员和篮球运动员。教练员包括乒乓球教练和篮球教练。为了方便出国交流,根乒乓球相关的人员都需要学习英语。