• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Springboot 使用redis检测浏览量,评论量,点赞量的变化并完成和mysql的交互有具体实现,有具体需求

武飞扬头像
桂亭亭
帮助1

  

目录

依赖

准备实体类与业务类

开始正题

实现一览

流程一览

具体实现

1 初始化

2 写浏览量增加的方法

3 在切面处检测浏览器变化

4 新增文章时将新的数据写入redis

5  删除文章时将数据从Redis中删除

6 书写将数据写入mysql数据库的方法

7 销毁的时候将数据写入mySQL数据库

8 评论量增加操作

9 其他操作

大部分工具类如下


开始补文章喽,哈哈

依赖

废话说完先引入依赖

  1.  
    <!-- 对象转json-->
  2.  
    <dependency>
  3.  
    <groupId>com.alibaba</groupId>
  4.  
    <artifactId>fastjson</artifactId>
  5.  
    <version>1.2.83</version>
  6.  
    </dependency>
  7.  
    <!-- Redis-->
  8.  
    <dependency>
  9.  
    <groupId>org.springframework.boot</groupId>
  10.  
    <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
  11.  
    </dependency>
  12.  
    <!-- AOP-->
  13.  
    <dependency>
  14.  
    <groupId>org.springframework.boot</groupId>
  15.  
    <artifactId>spring-boot-starter-aop</artifactId>
  16.  
    </dependency>
学新通

准备实体类与业务类

依依赖引完之后一般咱还要有一个实体类可根据自己项目选择哦

实体类

  1.  
    package com.scm.myblog.entity;
  2.  
    import com.baomidou.mybatisplus.annotation.FieldFill;
  3.  
    import com.baomidou.mybatisplus.annotation.IdType;
  4.  
    import com.baomidou.mybatisplus.annotation.TableField;
  5.  
    import com.baomidou.mybatisplus.annotation.TableId;
  6.  
    import lombok.AllArgsConstructor;
  7.  
    import lombok.Data;
  8.  
    import lombok.NoArgsConstructor;
  9.  
     
  10.  
    import java.sql.Timestamp;
  11.  
    import java.util.List;
  12.  
    @Data
  13.  
    @NoArgsConstructor
  14.  
    @AllArgsConstructor
  15.  
    public class Article {
  16.  
    @TableField(exist = false,select = false)
  17.  
    private List<Category> category;
  18.  
    @TableId(type = IdType.AUTO)
  19.  
    private Long articleId;
  20.  
    private long articleUserId;
  21.  
    private String articleTitle;
  22.  
    private String articleContent;
  23.  
    private long articleViewCount;
  24.  
    private long articleCommentCount;
  25.  
    private long articleDianzanCount;
  26.  
    @TableField(fill = FieldFill.UPDATE)
  27.  
    private Timestamp articleUpdateTime;
  28.  
    @TableField(fill = FieldFill.INSERT)
  29.  
    private Timestamp articleCreateTime;
  30.  
    private String articleSummary;
  31.  
    private String articleThImg;
  32.  
     
  33.  
    }
学新通

这个俗称业务类哟里面封装与业务相关的属性

Bo类

  1.  
    package com.scm.myblog.bo;
  2.  
     
  3.  
    import lombok.AllArgsConstructor;
  4.  
    import lombok.Data;
  5.  
    import lombok.NoArgsConstructor;
  6.  
     
  7.  
    @Data
  8.  
    @NoArgsConstructor
  9.  
    @AllArgsConstructor
  10.  
    public class DPLDataBo {
  11.  
    private Long articleId;
  12.  
    private Long articleViewCount;
  13.  
    private Long articleCommentCount;
  14.  
    private Long articleDianzanCount;
  15.  
    }
学新通

开始正题

然后这些准备工作做完之后,我们就开始对redis进行一些封装使其能够实现这么些功能呢

实现一览

1        浏览量增加

2        评论量增加

3        点赞量增加与减少

4        新增文章时将新的数据写入redis

5        删除文章时将数据从Redis中删除

6        还有redis初始化的时候从mysql中读取数据

7        销毁的时候将数据写入mySQL数据库,或者隔一段时间将数据写入数据库

流程一览

 OK我们捋一下大致的流程

首先呢是spring boot容器启动的时候我们需要将数据从数据库中读取到radis中

之后当用户浏览数据的时候我们对redis数据库中的浏览量进行加1的操作

同理我们对点赞量和评论量和评论量也进行相应的处理

 OK咱别急一步一步来首先说初始化.

具体实现

1 初始化

初始化的思路也很简单,首先要设置一个标记量在redis中用于标志redis是否已经被初始化了.

我这边使用的是一个字段名叫isInit,当他的值为一时表示已经初始化了值为零时表示没有初始化。   OK准备工作已做完接下来就从数据库中取出对应的数据就行了,这里我们选用的redis数据结构是list其中以数据库中的 id作为key,其他参数作为值。于是就有了以下的代码

  1.  
     
  2.  
    //初始化redis 点赞收藏评论人数
  3.  
    public static void init_Redis() {
  4.  
    String s = rt.opsForValue().get("isInit");
  5.  
    if (!Objects.equals(s, "1")) {
  6.  
    //从数据库拿到所有的点赞数据
  7.  
    List<DPLDataBo> aLlDataBo = UserBlogBo.getALlDataBoFromDb();
  8.  
    //放入redis,其中id为key,其他数据为值
  9.  
    for (DPLDataBo d : aLlDataBo) {
  10.  
    rt.opsForList().leftPushAll(
  11.  
    d.getArticleId().toString(),
  12.  
    d.getArticleViewCount().toString(),
  13.  
    d.getArticleDianzanCount().toString(),
  14.  
    d.getArticleCommentCount().toString());
  15.  
    }
  16.  
    //标记是否已经初始化
  17.  
    rt.opsForValue().set("isInit", "1");
  18.  
    }
  19.  
    }
学新通

2 写浏览量增加的方法

方法接受一个文章的标题或者是文章的ID都可以我这边是用的标题。

这个方法的内容也很简单,我们就是先将中对应文章对应ID的数据中的浏览量取出来,然后对其进行加一,再把它放进去就行了。

所以对应的两个方法就是出站和入站rightpop和rightpush。

  1.  
    /**
  2.  
    * 添加浏览量
  3.  
    *
  4.  
    * @param title 标题
  5.  
    */
  6.  
    public static void addViewCount(String title) {
  7.  
    if (title != null) {
  8.  
    Long id = UserBlogBo.getIdByTitle(title);
  9.  
    assert id != null;
  10.  
    String s = rt.opsForList().rightPop(id.toString());
  11.  
    assert s != null;
  12.  
    long oldViewCount = (Long.parseLong(s));
  13.  
    rt.opsForList().rightPush(String.valueOf(id), String.valueOf((oldViewCount 1L)));
  14.  
    }
  15.  
    }
学新通

3 在切面处检测浏览器变化

你你如果嫌麻烦的话可以不使用前面直接在对应的文章详情控制器那里调用 redis中浏览量增加的方法即可。

        使用切面有使用切面的好处,它能够不干涉其他的逻辑代码,从而对数据实现监控,操作我这边使用的切面,然后切面通过截取指定方法接收的参数获取接收参数中的文章的标题,然后将文章的标题传入我们刚刚写好的浏览量增加的方法中,从而实现对文章浏览量增加的操作。

  1.  
    package com.scm.myblog.aop;
  2.  
     
  3.  
    import com.scm.myblog.bo.UserBlogBo;
  4.  
    import lombok.extern.slf4j.Slf4j;
  5.  
    import org.aspectj.lang.JoinPoint;
  6.  
    import org.aspectj.lang.annotation.*;
  7.  
    import org.springframework.beans.factory.annotation.Autowired;
  8.  
    import org.springframework.data.redis.core.RedisTemplate;
  9.  
    import org.springframework.stereotype.Component;
  10.  
    import org.springframework.web.context.request.RequestContextHolder;
  11.  
    import org.springframework.web.context.request.ServletRequestAttributes;
  12.  
     
  13.  
    import javax.servlet.http.HttpServletRequest;
  14.  
     
  15.  
    /**
  16.  
    * web数据记录AOP
  17.  
    *
  18.  
    * @author Lancer
  19.  
    * @date 2022/12/09
  20.  
    */
  21.  
    @Aspect
  22.  
    @Component
  23.  
    @Slf4j
  24.  
    public class WebDataRecordAspect {
  25.  
    @Autowired
  26.  
    public RedisTemplate<String,String> rs;
  27.  
     
  28.  
    /**
  29.  
    * web日志切入点
  30.  
    */
  31.  
    @Pointcut("execution(public * com.scm.myblog.controller.ArticleController.getArticleDetail(..))")
  32.  
    public void WebLogPointcut() {}
  33.  
     
  34.  
    /**
  35.  
    * 方法调用前
  36.  
    *
  37.  
    * @param j j
  38.  
    */
  39.  
    @Before("WebLogPointcut()")
  40.  
    public void doAfterData(JoinPoint j){
  41.  
    String sendTitle="";
  42.  
    Object[] args = j.getArgs();
  43.  
    if (args != null) {
  44.  
    sendTitle=(String)args[0];
  45.  
    }
  46.  
    UserBlogBo.addViewCount(sendTitle);
  47.  
    log.info(sendTitle "浏览加1");
  48.  
    }
  49.  
    }
学新通

4 新增文章时将新的数据写入redis

当增加文章的时候,我们需要将新增的文章数据加入到数据库中,所以这里也比较简单,我们通过一个工具类来实现一下,加入数据的时候,还是以插入数据的ID为key,其他数据为值数据结构还是使用列表将其存入即可。

  1.  
     
  2.  
    /**
  3.  
    * 新增数据到redis,
  4.  
    *
  5.  
    * @param title 标题
  6.  
    */
  7.  
    public static void addDataToRedis(String title) {
  8.  
    DPLDataBo d = UserBlogBo.getSingDataBoFormDb(UserBlogBo.getIdByTitle(title));
  9.  
    rt.opsForList().leftPushAll(
  10.  
    d.getArticleId().toString(),
  11.  
    d.getArticleViewCount().toString(),
  12.  
    d.getArticleDianzanCount().toString(),
  13.  
    d.getArticleCommentCount().toString());
  14.  
    }

5  删除文章时将数据从Redis中删除

删除的思路和增加正好相反,我们首先通过传过来的标题获取到文章的ID,然后在中查找该ID对应的键,然后我们将此键删除即可。

  1.  
    /**
  2.  
    * 删除数据在redis,
  3.  
    *
  4.  
    * @param id ID
  5.  
    * @return {@link Boolean}
  6.  
    */
  7.  
    public static Boolean deleteDataToRedis(Long id) {
  8.  
    return rt.delete(id.toString());
  9.  
    }

6 书写将数据写入mysql数据库的方法

        要实现将数据写入数据库也是十分容易的,首先我们先判断一下当前redis是否被初始化,如果被初始化了,再从redis中读取数据,然后读取数据,我们使用的也是一个range,然后把对应的ID给他,然后后面两个参数分别为零和负一,这样就可以拿到当前key对应的所有VALUE的值了,我们将值写入数据库,也就是更新操作即可。

  1.  
    /*
  2.  
    获取所有文章id
  3.  
    */
  4.  
    public static List<Long> getAllId() {
  5.  
    LambdaQueryWrapper<Article> article = new LambdaQueryWrapper<>();
  6.  
    article.select(Article::getArticleId);
  7.  
    List<Article> articles = articleDao.selectList(article);
  8.  
    List<Long> ids = new ArrayList<>();
  9.  
    for (Article article1 : articles) {
  10.  
    ids.add(article1.getArticleId());
  11.  
    }
  12.  
    return ids;
  13.  
    }
  14.  
    /**
  15.  
    * 摧毁Redis时 写入mysql数据库
  16.  
    */
  17.  
    public static void destroyRedis() {
  18.  
    String s = rt.opsForValue().get("isInit");
  19.  
    if (Objects.equals(s, "1")) {
  20.  
    //获取所有文章id
  21.  
    List<Long> allId = UserBlogBo.getAllId();
  22.  
    //获取所有新的数据
  23.  
    for (Long id : allId) {
  24.  
    List<String> data = rt.opsForList().range(id.toString(), 0, -1);
  25.  
    Article article = new Article();
  26.  
    article.setArticleId(id);
  27.  
    assert data != null;
  28.  
    article.setArticleViewCount(Long.parseLong(data.get(2)));
  29.  
    article.setArticleDianzanCount(Long.parseLong(data.get(1)));
  30.  
    article.setArticleCommentCount(Long.parseLong(data.get(0)));
  31.  
    articleDao.updateById(article);
  32.  
    }
  33.  
    }
  34.  
    else {
  35.  
    throw new SystemException(Code.InsertMySQLFromRedis_ERR, Tips.InsertMySQLFromRedis_ERR);
  36.  
    }
  37.  
    }
学新通

7 销毁的时候将数据写入mySQL数据库

        要实现销毁的时候,将数据写入mysql数据库,我们就要用到监听,我们需要监听什么呢?我们需要监听spring boot容器在什么时候销毁?也就是监听servlet的销毁时期,于是我们先新建一个监听类,用于监听一些操作。然后当销毁的时候调用对应的写入方法即可

  1.  
    package com.scm.myblog.listener;
  2.  
     
  3.  
    import com.scm.myblog.bo.DPLDataBo;
  4.  
    import com.scm.myblog.bo.UserBlogBo;
  5.  
    import org.springframework.context.annotation.Configuration;
  6.  
     
  7.  
    import javax.servlet.ServletContext;
  8.  
    import javax.servlet.ServletContextEvent;
  9.  
    import javax.servlet.ServletContextListener;
  10.  
    import javax.servlet.annotation.WebListener;
  11.  
    import javax.servlet.http.HttpSession;
  12.  
    import java.util.ArrayList;
  13.  
    import java.util.HashMap;
  14.  
    import java.util.HashSet;
  15.  
    import java.util.List;
  16.  
    @Configuration
  17.  
    @WebListener()
  18.  
    public class MyServletContextListener implements ServletContextListener {
  19.  
     
  20.  
    /**
  21.  
    * servlet销毁
  22.  
    *
  23.  
    * @param sce
  24.  
    */
  25.  
    @Override
  26.  
    public void contextDestroyed(ServletContextEvent sce)
  27.  
    {
  28.  
    UserBlogBo.destroyRedis();
  29.  
    System.out.println("Servlet被销毁了,数据写入数据库");
  30.  
    }
  31.  
    }
学新通

8 评论量增加操作

        评论量的增加操作与浏览量的增加操作类似,也就是后台在写入评论时,将用一次使用量增加的方法实现将数据写入redis中,至于怎么实现将数据写入中,相信大家都非常熟悉的这边直接贴代码。

  1.  
    /**
  2.  
    * 评论量增加
  3.  
    *
  4.  
    * @param title 标题
  5.  
    */
  6.  
    public static void addCommentCount(String title) {
  7.  
    if (title != null) {
  8.  
    Long id = UserBlogBo.getIdByTitle(title);
  9.  
    String s = rt.opsForList().index(id.toString(), 0);
  10.  
    assert s != null;
  11.  
    long oldCommentCount = (Long.parseLong(s));
  12.  
    rt.opsForList().set(String.valueOf(id), 0, String.valueOf((oldCommentCount 1L)));
  13.  
    }
  14.  
    }

9 其他操作

        至此,大致的思路,大家应该都已经理解了,可以自己完善评论量,减少点赞量,增加点赞量,减少的操作,有需要注意的是点赞量,因为它不仅可以增加,还可以减少,可能会遇到一些坑,这边先贴出来代码,我们直接设置点赞量,而不是使用加一的操作。

        方法接收两个参数,一个是当前最点赞文章的标题,一个是当前的点赞量,比如原来的点赞量是13,通过前台减一之后变成12,所以我们获取了当前点赞量就是12,我们只需要把这个12通过文章的标题对redis中的点赞数据进行一个修改即可,不需要读出来,再加一或读出来再减一。

  1.  
    /**
  2.  
    * 设置点赞数
  3.  
    *
  4.  
    * @param title 标题
  5.  
    * @param newCount
  6.  
    */
  7.  
    public static void setDianZanCount(String title, Integer newCount) {
  8.  
    if (title != null) {
  9.  
    Long id = UserBlogBo.getIdByTitle(title);
  10.  
    assert id != null;
  11.  
    String s = rt.opsForList().index(id.toString(), 1);
  12.  
    assert s != null;
  13.  
    rt.opsForList().set(String.valueOf(id), 1, String.valueOf(newCount));
  14.  
    }
  15.  
    }
学新通

大部分工具类如下

工具类

  1.  
    package com.scm.myblog.bo;
  2.  
     
  3.  
    import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  4.  
    import com.scm.myblog.dao.ArticleCategoryRefDao;
  5.  
    import com.scm.myblog.dao.ArticleDao;
  6.  
    import com.scm.myblog.dao.CategoryDao;
  7.  
    import com.scm.myblog.entity.*;
  8.  
    import com.scm.myblog.entity.DTO.PageDto;
  9.  
    import com.scm.myblog.entity.VO.PageData;
  10.  
    import com.scm.myblog.exception.SystemException;
  11.  
    import org.springframework.beans.BeanUtils;
  12.  
    import org.springframework.beans.factory.annotation.Autowired;
  13.  
    import org.springframework.data.redis.core.RedisTemplate;
  14.  
    import org.springframework.stereotype.Component;
  15.  
     
  16.  
    import javax.annotation.PostConstruct;
  17.  
    import java.util.*;
  18.  
    import java.util.stream.Collectors;
  19.  
     
  20.  
    @Component
  21.  
    public class UserBlogBo {
  22.  
    private static ArticleCategoryRefDao categoryRefDao;
  23.  
    private static CategoryDao categoryDao;
  24.  
    private static ArticleDao articleDao;
  25.  
    private static RedisTemplate<String, String> rt;
  26.  
     
  27.  
    @Autowired
  28.  
    private ArticleCategoryRefDao categoryRefDaoA;
  29.  
    @Autowired
  30.  
    private CategoryDao categoryDaoA;
  31.  
    @Autowired
  32.  
    private ArticleDao articleDaoA;
  33.  
     
  34.  
    @Autowired
  35.  
    public RedisTemplate<String, String> rtA;
  36.  
     
  37.  
    /**
  38.  
    * 点赞量增加
  39.  
    *
  40.  
    * @param title 标题
  41.  
    */
  42.  
    public static void addDianZanCount(String title, Boolean isRever) {
  43.  
    if (title != null) {
  44.  
    Long id = UserBlogBo.getIdByTitle(title);
  45.  
    String s = rt.opsForList().index(id.toString(), 1);
  46.  
    assert s != null;
  47.  
    long oldDianZanCount = (Long.parseLong(s));
  48.  
    if (isRever) {
  49.  
    rt.opsForList().set(String.valueOf(id), 1, String.valueOf((oldDianZanCount - 1L)));
  50.  
    }
  51.  
    else {
  52.  
    rt.opsForList().set(String.valueOf(id), 1, String.valueOf((oldDianZanCount 1L)));
  53.  
    }
  54.  
    }
  55.  
    }
  56.  
     
  57.  
    /**
  58.  
    * 评论量增加
  59.  
    *
  60.  
    * @param title 标题
  61.  
    */
  62.  
    public static void addCommentCount(String title) {
  63.  
    if (title != null) {
  64.  
    Long id = UserBlogBo.getIdByTitle(title);
  65.  
    String s = rt.opsForList().index(id.toString(), 0);
  66.  
    assert s != null;
  67.  
    long oldCommentCount = (Long.parseLong(s));
  68.  
    rt.opsForList().set(String.valueOf(id), 0, String.valueOf((oldCommentCount 1L)));
  69.  
    }
  70.  
    }
  71.  
     
  72.  
    /**
  73.  
    * 设置点赞数
  74.  
    *
  75.  
    * @param title 标题
  76.  
    * @param newCount
  77.  
    */
  78.  
    public static void setDianZanCount(String title, Integer newCount) {
  79.  
    if (title != null) {
  80.  
    Long id = UserBlogBo.getIdByTitle(title);
  81.  
    assert id != null;
  82.  
    String s = rt.opsForList().index(id.toString(), 1);
  83.  
    assert s != null;
  84.  
    rt.opsForList().set(String.valueOf(id), 1, String.valueOf(newCount));
  85.  
    }
  86.  
    }
  87.  
     
  88.  
    //在进入此类中时,此方法会被优先调用
  89.  
    @PostConstruct
  90.  
    private void init() {
  91.  
    categoryRefDao = categoryRefDaoA;
  92.  
    categoryDao = categoryDaoA;
  93.  
    articleDao = articleDaoA;
  94.  
    rt = rtA;
  95.  
    }
  96.  
     
  97.  
    //初始化redis 点赞收藏评论人数
  98.  
    public static void init_Redis() {
  99.  
    String s = rt.opsForValue().get("isInit");
  100.  
    if (!Objects.equals(s, "1")) {
  101.  
    //从数据库拿到所有的点赞数据
  102.  
    List<DPLDataBo> aLlDataBo = UserBlogBo.getALlDataBoFromDb();
  103.  
    //放入redis,其中id为key,其他数据为值
  104.  
    for (DPLDataBo d : aLlDataBo) {
  105.  
    rt.opsForList().leftPushAll(
  106.  
    d.getArticleId().toString(),
  107.  
    d.getArticleViewCount().toString(),
  108.  
    d.getArticleDianzanCount().toString(),
  109.  
    d.getArticleCommentCount().toString());
  110.  
    }
  111.  
    //标记是否已经初始化
  112.  
    rt.opsForValue().set("isInit", "1");
  113.  
    }
  114.  
    }
  115.  
     
  116.  
    /**
  117.  
    * 新增数据到redis,
  118.  
    *
  119.  
    * @param title 标题
  120.  
    */
  121.  
    public static void addDataToRedis(String title) {
  122.  
    DPLDataBo d = UserBlogBo.getSingDataBoFormDb(UserBlogBo.getIdByTitle(title));
  123.  
    rt.opsForList().leftPushAll(
  124.  
    d.getArticleId().toString(),
  125.  
    d.getArticleViewCount().toString(),
  126.  
    d.getArticleDianzanCount().toString(),
  127.  
    d.getArticleCommentCount().toString());
  128.  
    }
  129.  
     
  130.  
    /**
  131.  
    * 删除数据在redis,
  132.  
    *
  133.  
    * @param id ID
  134.  
    * @return {@link Boolean}
  135.  
    */
  136.  
    public static Boolean deleteDataToRedis(Long id) {
  137.  
    return rt.delete(id.toString());
  138.  
    }
  139.  
     
  140.  
    /**
  141.  
    * 从数据库获取单个点赞浏览数据
  142.  
    *
  143.  
    * @param id
  144.  
    * @return {@link DPLDataBo}
  145.  
    */
  146.  
    public static DPLDataBo getSingDataBoFormDb(Long id) {
  147.  
    LambdaQueryWrapper<Article> a = new LambdaQueryWrapper<>();
  148.  
    a.eq(Article::getArticleId,id).select(Article::getArticleId, Article::getArticleViewCount, Article::getArticleDianzanCount, Article::getArticleCommentCount);
  149.  
    Article article = articleDao.selectOne(a);
  150.  
    DPLDataBo d = new DPLDataBo();
  151.  
    BeanUtils.copyProperties(article, d);
  152.  
    return d;
  153.  
    }
  154.  
     
  155.  
    /**
  156.  
    * 添加浏览量
  157.  
    *
  158.  
    * @param title 标题
  159.  
    */
  160.  
    public static void addViewCount(String title) {
  161.  
    if (title != null) {
  162.  
    Long id = UserBlogBo.getIdByTitle(title);
  163.  
    assert id != null;
  164.  
    String s = rt.opsForList().rightPop(id.toString());
  165.  
    assert s != null;
  166.  
    long oldViewCount = (Long.parseLong(s));
  167.  
    rt.opsForList().rightPush(String.valueOf(id), String.valueOf((oldViewCount 1L)));
  168.  
    }
  169.  
    }
  170.  
     
  171.  
     
  172.  
    /**
  173.  
    * 从redis 得到点赞浏览数据
  174.  
    *
  175.  
    * @param title 标题
  176.  
    * @return {@link DPLDataBo}
  177.  
    */
  178.  
    public static DPLDataBo getSingleDPLDataFromRedisByTitle(String title) {
  179.  
    Long id = UserBlogBo.getIdByTitle(title);
  180.  
    return getSingleDPLDataFromRedisById(id);
  181.  
    }
  182.  
     
  183.  
    public static DPLDataBo getSingleDPLDataFromRedisById(Long id) {
  184.  
    List<String> stringList = rt.opsForList().range(id.toString(), 0, -1);
  185.  
    DPLDataBo da = new DPLDataBo();
  186.  
    assert stringList != null;
  187.  
    da.setArticleViewCount(Long.parseLong(stringList.get(2)));
  188.  
    da.setArticleDianzanCount(Long.parseLong(stringList.get(1)));
  189.  
    da.setArticleCommentCount(Long.parseLong(stringList.get(0)));
  190.  
    return da;
  191.  
    }
  192.  
     
  193.  
    /**
  194.  
    * 从redis中获取所有的点赞数据
  195.  
    *
  196.  
    * @return {@link DPLDataBo}
  197.  
    */
  198.  
    public static List<DPLDataBo> getAllDPLDataFromRedis() {
  199.  
    //匹配4位的id
  200.  
    Set<String> keys = rt.keys("????");
  201.  
    List<DPLDataBo> list = new ArrayList<>();
  202.  
    assert keys != null;
  203.  
    for (String key : keys) {
  204.  
    List<String> range = rt.opsForList().range(key, 0, -1);
  205.  
    DPLDataBo d = new DPLDataBo();
  206.  
    d.setArticleId(Long.parseLong(key));
  207.  
    assert range != null;
  208.  
    d.setArticleViewCount(Long.parseLong(range.get(2)));
  209.  
    d.setArticleDianzanCount(Long.parseLong(range.get(1)));
  210.  
    d.setArticleCommentCount(Long.parseLong(range.get(0)));
  211.  
    list.add(d);
  212.  
    }
  213.  
    return list;
  214.  
    }
  215.  
     
  216.  
    /**
  217.  
    * 摧毁Redis时 写入mysql数据库
  218.  
    */
  219.  
    public static void destroyRedis() {
  220.  
    String s = rt.opsForValue().get("isInit");
  221.  
    if (Objects.equals(s, "1")) {
  222.  
    //获取所有文章id
  223.  
    List<Long> allId = UserBlogBo.getAllId();
  224.  
    //获取所有新的数据
  225.  
    for (Long id : allId) {
  226.  
    List<String> data = rt.opsForList().range(id.toString(), 0, -1);
  227.  
    Article article = new Article();
  228.  
    article.setArticleId(id);
  229.  
    assert data != null;
  230.  
    article.setArticleViewCount(Long.parseLong(data.get(2)));
  231.  
    article.setArticleDianzanCount(Long.parseLong(data.get(1)));
  232.  
    article.setArticleCommentCount(Long.parseLong(data.get(0)));
  233.  
    articleDao.updateById(article);
  234.  
    }
  235.  
    }
  236.  
    else {
  237.  
    throw new SystemException(Code.InsertMySQLFromRedis_ERR, Tips.InsertMySQLFromRedis_ERR);
  238.  
    }
  239.  
    }
  240.  
     
  241.  
     
  242.  
    /*
  243.  
    通过标题获取id
  244.  
    */
  245.  
    public static Long getIdByTitle(String title) {
  246.  
    try {
  247.  
     
  248.  
    LambdaQueryWrapper<Article> article = new LambdaQueryWrapper<>();
  249.  
    article.eq(Article::getArticleTitle, title);
  250.  
    return articleDao.selectOne(article).getArticleId();
  251.  
    } catch (Exception e) {
  252.  
    return null;
  253.  
    }
  254.  
    }
  255.  
     
  256.  
    /*
  257.  
    获取所有文章id
  258.  
    */
  259.  
    public static List<Long> getAllId() {
  260.  
    LambdaQueryWrapper<Article> article = new LambdaQueryWrapper<>();
  261.  
    article.select(Article::getArticleId);
  262.  
    List<Article> articles = articleDao.selectList(article);
  263.  
    List<Long> ids = new ArrayList<>();
  264.  
    for (Article article1 : articles) {
  265.  
    ids.add(article1.getArticleId());
  266.  
    }
  267.  
    return ids;
  268.  
    }
  269.  
     
  270.  
    public static void updateAllLDPData(Article article) {
  271.  
    articleDao.updateById(article);
  272.  
    }
  273.  
     
  274.  
    /*
  275.  
    获取多篇文章标签,传入参数为List<>
  276.  
    */
  277.  
    public static List<Article> getManyArticleTaggersByIdOrTitle(List<Article> records) {
  278.  
    for (Article article : records) {
  279.  
    getSingleArticleTaggersByIdOrTitle(article);
  280.  
    }
  281.  
    return records;
  282.  
    }
  283.  
     
  284.  
    /**
  285.  
    * 从redis获取,浏览量从大到小排序后的id值
  286.  
    *
  287.  
    * @return {@link Long}
  288.  
    */
  289.  
    public static List<Long> getMaxViewCountFromRedis() {
  290.  
    List<DPLDataBo> data = getAllDPLDataFromRedis();
  291.  
    List<DPLDataBo> boList = data.stream().sorted(Comparator.comparing(DPLDataBo::getArticleViewCount).reversed()).collect(Collectors.toList());
  292.  
    List<Long> x = new ArrayList<>();
  293.  
    for (DPLDataBo dp : boList) {
  294.  
    x.add(dp.getArticleId());
  295.  
    }
  296.  
    return x;
  297.  
    }
  298.  
     
  299.  
    /*
  300.  
    传入一个article对象,将自动设置对象的标签值
  301.  
    */
  302.  
    public static Article getSingleArticleTaggersByIdOrTitle(Article article) {
  303.  
    //联两个表查询文章标签
  304.  
    LambdaQueryWrapper<ArticleCategoryRef> articleCategoryRef = new LambdaQueryWrapper<>();
  305.  
    //根据标题查找id 获取标签id
  306.  
    Long id = null;
  307.  
    if (article.getArticleId() != null) {
  308.  
    id = article.getArticleId();
  309.  
    }
  310.  
    else {
  311.  
    id = UserBlogBo.getIdByTitle(article.getArticleTitle());
  312.  
    }
  313.  
    articleCategoryRef = articleCategoryRef.eq(ArticleCategoryRef::getArticleId, id);
  314.  
    List<ArticleCategoryRef> refs = categoryRefDao.selectList(articleCategoryRef);
  315.  
     
  316.  
    List<Category> tagsData = new ArrayList<>();
  317.  
    for (ArticleCategoryRef rs : refs) {
  318.  
    //获取每一个标签
  319.  
    LambdaQueryWrapper<Category> categoryQueryWrapper = new LambdaQueryWrapper<>();
  320.  
    categoryQueryWrapper.eq(Category::getCategoryId, rs.getCategoryId());
  321.  
    Category category = categoryDao.selectOne(categoryQueryWrapper);
  322.  
    //将每一个标签对象放入List tag中
  323.  
    tagsData.add(category);
  324.  
    //再将所有相关的标签对象放入List Arcticle中
  325.  
    article.setCategory(tagsData);
  326.  
    }
  327.  
    return article;
  328.  
    }
  329.  
     
  330.  
     
  331.  
    /**
  332.  
    * 设置默认分页查询
  333.  
    *
  334.  
    * @param pto 美国专利商标局
  335.  
    */
  336.  
    public static void setDefaultPage(PageDto pto) {
  337.  
    if (pto.getCurrPage() == null) {
  338.  
    pto.setCurrPage(1);
  339.  
    }
  340.  
    if (pto.getPageSize() == null) {
  341.  
    pto.setPageSize(10);
  342.  
    }
  343.  
    }
  344.  
     
  345.  
    /**
  346.  
    * 从数据得到所有数据波
  347.  
    *
  348.  
    * @return {@link List}<{@link DPLDataBo}>
  349.  
    */
  350.  
    public static List<DPLDataBo> getALlDataBoFromDb() {
  351.  
    LambdaQueryWrapper<Article> s = new LambdaQueryWrapper<>();
  352.  
    s.select(Article::getArticleId, Article::getArticleViewCount, Article::getArticleDianzanCount, Article::getArticleCommentCount);
  353.  
    List<Article> articleList = articleDao.selectList(s);
  354.  
    List<DPLDataBo> d = new ArrayList<>();
  355.  
    for (Article article : articleList) {
  356.  
    DPLDataBo p = new DPLDataBo();
  357.  
    BeanUtils.copyProperties(article, p);
  358.  
    d.add(p);
  359.  
    }
  360.  
    return d;
  361.  
    }
  362.  
     
  363.  
    /**
  364.  
    * 通过标签获取文章列表
  365.  
    *
  366.  
    * @param tag1 标签1
  367.  
    * @param isAdmin 是否是管理
  368.  
    * @return {@link List}<{@link Article}>
  369.  
    */
  370.  
    public static List<Article> getArticleListByTag(String tag1, Boolean isAdmin) {
  371.  
    LambdaQueryWrapper<Category> queryWrapper = new LambdaQueryWrapper<>();
  372.  
    queryWrapper.eq(Category::getCategoryName, tag1);
  373.  
    Long tagId = categoryDao.selectOne(queryWrapper).getCategoryId();
  374.  
    LambdaQueryWrapper<ArticleCategoryRef> c = new LambdaQueryWrapper<>();
  375.  
    c.eq(ArticleCategoryRef::getCategoryId, tagId);
  376.  
    List<ArticleCategoryRef> refs = categoryRefDao.selectList(c);
  377.  
    List<Long> ids = new ArrayList<>();
  378.  
    for (ArticleCategoryRef o : refs) {
  379.  
    ids.add(o.getArticleId());
  380.  
    }
  381.  
    List<Article> articles = articleDao.selectBatchIds(ids);
  382.  
    getManyArticleTaggersByIdOrTitle(articles);
  383.  
    if (!isAdmin) {
  384.  
    for (Article o : articles) {
  385.  
    o.setArticleUserId(null);
  386.  
    o.setArticleId(null);
  387.  
    o.setArticleContent(null);
  388.  
    }
  389.  
    }
  390.  
    return articles;
  391.  
    }
  392.  
    }
学新通

AOP

  1.  
    package com.scm.myblog.aop;
  2.  
     
  3.  
    import com.scm.myblog.bo.UserBlogBo;
  4.  
    import lombok.extern.slf4j.Slf4j;
  5.  
    import org.aspectj.lang.JoinPoint;
  6.  
    import org.aspectj.lang.annotation.*;
  7.  
    import org.springframework.beans.factory.annotation.Autowired;
  8.  
    import org.springframework.data.redis.core.RedisTemplate;
  9.  
    import org.springframework.stereotype.Component;
  10.  
    import org.springframework.web.context.request.RequestContextHolder;
  11.  
    import org.springframework.web.context.request.ServletRequestAttributes;
  12.  
     
  13.  
    import javax.servlet.http.HttpServletRequest;
  14.  
     
  15.  
    /**
  16.  
    * web数据记录AOP
  17.  
    *
  18.  
    * @author 孙超孟
  19.  
    * @date 2022/12/09
  20.  
    */
  21.  
    @Aspect
  22.  
    @Component
  23.  
    @Slf4j
  24.  
    public class WebDataRecordAspect {
  25.  
    @Autowired
  26.  
    public RedisTemplate<String,String> rs;
  27.  
     
  28.  
    /**
  29.  
    * web日志切入点
  30.  
    */
  31.  
    @Pointcut("execution(public * com.scm.myblog.controller.ArticleController.getArticleDetail(..))")
  32.  
    public void WebLogPointcut() {}
  33.  
     
  34.  
    /**
  35.  
    * 方法调用前
  36.  
    *
  37.  
    * @param j j
  38.  
    */
  39.  
    @Before("WebLogPointcut()")
  40.  
    public void doAfterData(JoinPoint j){
  41.  
    ServletRequestAttributes s=(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
  42.  
    assert s != null;
  43.  
    HttpServletRequest request = s.getRequest();
  44.  
    String sendTitle="";
  45.  
    Object[] args = j.getArgs();
  46.  
    if (args != null) {
  47.  
    sendTitle=(String)args[0];
  48.  
    }
  49.  
    UserBlogBo.addViewCount(sendTitle);
  50.  
    log.info(sendTitle "浏览加1");
  51.  
    }
  52.  
    }
学新通

springboot启动类

  1.  
    package com.scm.myblog;
  2.  
     
  3.  
    import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer;
  4.  
    import com.baomidou.mybatisplus.extension.MybatisMapWrapperFactory;
  5.  
    import com.scm.myblog.bo.UserBlogBo;
  6.  
    import org.mybatis.spring.annotation.MapperScan;
  7.  
    import org.springframework.boot.SpringApplication;
  8.  
    import org.springframework.boot.autoconfigure.SpringBootApplication;
  9.  
    import org.springframework.boot.web.servlet.ServletComponentScan;
  10.  
    import org.springframework.context.annotation.Bean;
  11.  
    /*
  12.  
    MMMMM
  13.  
    MMMMMM
  14.  
    MMMMMMM
  15.  
    MMMMMMMM .
  16.  
    MMMMMMMMM
  17.  
    HMMMMMMMMMM
  18.  
    MMMMMMMMMMMM M
  19.  
    MMMMMMMMMMMMM M
  20.  
    MMMMMMMMMMMMM M
  21.  
    MMMMMMMMMMMMM:
  22.  
    oMMMMMMMMMMMMMM
  23.  
    .MMMMMMMMMMMMMMo MMMMMMMMMMMMMMM M
  24.  
    MMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM
  25.  
    MMMMMMMMMMMMMMMMMMMMMMMMMMMM. oMMMMMMMMMMMMMMM.M
  26.  
    MMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM
  27.  
    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
  28.  
    oMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
  29.  
    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
  30.  
    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM: H
  31.  
    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM . MMM
  32.  
    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM M MMMMMM
  33.  
    .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM M MMMMMMMMMM
  34.  
    MM. MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM M MMMMMMMMMMMM
  35.  
    MM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM .MMMMMMMMMMMMMM
  36.  
    MM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
  37.  
    MM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
  38.  
    .MMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMM.MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
  39.  
    HMMMMMMMMMMMMMMMMMMMMM.MMMMMMMMM.MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
  40.  
    MMMMMMMMMMMMMMM MMM.oMMMMMMM..MMMMMMMMM:MMMMMMMMMMMMMMMMMMMMMMM
  41.  
    MMMMMMMMMMMMMM MM..MMMMMMM...MMMMMMM. MMMMMMMMMMMMMMMMMMMMM
  42.  
    MMMMMMMMMMMMMMM ..MMMMMM...MMMMMM ..MMMMMMMMMMMMMMMMMMM
  43.  
    MMMMMMM:M.MMM.M.. MMMMM M..MMMMM...MMMMMMMMMMMMMMMMMM MMM
  44.  
    MMMM. .M..MM.M...MMMMMM..MMMMM.. MMMMMMMMMMMMMMMMMMMMMMMMMMMMMM .
  45.  
    MMMM..M....M.....:MMM .MMMMMM..MMMMMMM...MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
  46.  
    MMM.M.. ...M......MM.MMMMM.......MHM.M .MMMMMMMMMMMMMMMMMMMMMMMMM
  47.  
    MMMMMMMM..MM. . MMM.....MMMMMM.M.....M ..MM..M MMMMMMMMMMMMMMMMMMM
  48.  
    .MMMMMHMM. ..MMMM. MMM............o..... . .MMMMMMMMMMMMMMM
  49.  
    MMM. M... .........................M..:.MMMMMMMMMMMM
  50.  
    oMMM............ .................M.M.MMMMMMMMM
  51.  
    .....MM........................ . MMMMMM
  52.  
    M.....M.....................o.MM.MMMMMMMM.
  53.  
    M........................M.. ...MMMMMMMMMMMMMo
  54.  
    :....MMM..............MMM..oMMMMMMM
  55.  
    M...MMM.............MMMMMMM
  56.  
    .............:MMMMMMMM
  57.  
    M..... MMM.....M
  58.  
    M M.............
  59.  
    ................M
  60.  
    ooM.................MM MoMMMMMoooM
  61.  
    MMoooM......................MoooooooH..oMM
  62.  
    MHooooMoM.....................MMooooooM........M
  63.  
    oooooooMoooM......... o........MoooooooM............
  64.  
    Mooooooooooo.......M.........Moooooooo:..............M
  65.  
    MooMoooooooooM...M........:Mooooooooooo:..............M
  66.  
    M..oooooooooooo .........Mooooooooooooooo..............M
  67.  
    M...Mooo:oooooooo.M....ooooooooooooooooooo..M...........M
  68.  
    ...oooooMoooooooM..Mooooooooooooo:oooooooM.M...........M.
  69.  
    M...ooooooMoo:ooooMoooooooooooooHoooooooooH:M. ...........:
  70.  
    M..MoooooooMoooooooooooooooooo:ooooooMooooMoM..............M
  71.  
    M..ooooooooooMooooooooooooooHoooooooMooHooooM...............M
  72.  
    ...ooooooooooooooooooo:MooooooooooooooMoMoooM................
  73.  
    M...oooooooooooooooooooooooooooooooooooooMooMM................M
  74.  
    ...MooooooooooooooooooooooooooooooooooooooooMo ................
  75.  
    ...MooooooooooooooooooooooooooooooooooooooooM M................M
  76.  
    M...ooooooooooooooooooooooooooooooooooooooooM ................M
  77.  
    ...MoooooooooooooooooooooooooooooooooooooooMM .:...............
  78.  
    .....MooooooooooooooooooooooooooooooooooooMoo .............M
  79.  
    M...... ooooooooooooooooooooooooooooooooooooM M..............M
  80.  
    M........MooooMMM MM MM MMMMMMMMMooooooooM M...............M
  81.  
    .........HM M: MM :MMMMMM M M...............
  82.  
    M..........M M MoM M M................M
  83.  
    M.........:M MoH M M M MooooHoooMM. M M...............M
  84.  
    M..........Moooo MMooM oooooMooooooooM M..............H
  85.  
    M.........MooooM Mooo : ooooooMooooMoooM M........ . .o.M
  86.  
    H.. .....ooooo oooo M MooooooooooooooM M... MMMMMMMMMMM
  87.  
    MMMMMMMMMMooooM M oooo . ooooooMooooooooM .MMMMMMMMMMMMMMM
  88.  
    MMMMMMMMMMooooH : ooooH oooooooooooooooo MMMMMMMMMMMMMMM
  89.  
    MMMMMMMMMMoooo ooooM Moooooooooooooooo .MMMMMMMMMMMMMMM
  90.  
    MMMMMMMMMMoooo ooooM MooooooooooooooooM MMMMMMMMMMMMMMM
  91.  
    MMMMMMMMMMoooM ooooM ooooooooooooooooo MMMMMMMMMMM:M
  92.  
    MMMMMMMMMMoooM MooooM oooooooooooMoooooo MH...........
  93.  
    . ......Mooo. MooooM oooooooooooooooooo M............M
  94.  
    M.M......oooo MooooM Moooooooooooooooooo: .........M.....
  95.  
    M.M.....Moooo MooooM ooooooooooooooooooM .M............
  96.  
    .......MooooH MooooM oooooooooMoooooooooo M..o...M..o....M
  97.  
    .o....HMooooM MooooH MooooooooMooooooooooM .:M...M.......M
  98.  
    M..M.....MoooM :oooo: .MooooooooHooMoooooooooM M M... ..oM.M
  99.  
    M...M.:.Mooo. MMMMooooo oooooooooooMoooooooooooooM ....M. M
  100.  
    M:M..o.Moooooooooooooo MooooooooooooooMooooooooooooM .Mo
  101.  
    MooooooooooooooMooooooooooooMoMoooooooooooooo
  102.  
    Mooooooooooooooo:ooooooooooooooooooooooooooooo
  103.  
    ooooooooooooooooMooooooooooMoooooooooooooooooo
  104.  
    ooooooooooooooooMoooooooooooMooooooooooooooooHo
  105.  
    ooMooooooooooooooMoooooooooooooooooooooooooooMoM
  106.  
    MooMoooooooooooooo.ooooooooooooooooooooooooooo:oM
  107.  
    MoooooooooooooooooooooooooooooooooooooooooooooooM
  108.  
    MoooMooooooooooooooMooooooooooooooooooooooooooooo.
  109.  
    MoooMooooooooooooooMoooooooooooooooooooooooooMooooM
  110.  
    MooooooooooooooooooMoooooooooooooooooooooooooMoooooM
  111.  
    MooooMoooooooooooooMoooooooooooooooooooooooooMoHooooM
  112.  
    ooooooMooooooooooooooooooooooooooooooooooooooooMoMoooM
  113.  
    MooooooooooooooooooooMooooooooooooooooooooooooooMoooooH:
  114.  
    MoooooooMooooooooooooMoooooooooooooooooooooooooooooHoooM
  115.  
    MooooooooMoooooooooooMoooooooooooooooooooooooooMoooMooooM
  116.  
    Moooooooooooooooooooooooooooooooooooooooooooooo.oooMooooo
  117.  
    MoooooooooooooooooooooooooooooooooooooooooooooMoooooooooM
  118.  
    MooooooooooooooooooooMoooooooooooooooooooooooooooooooooM
  119.  
    MooooooooooooooooooooMHooooooooooooooooooooMoooo:ooooo
  120.  
    MMooooooooooooooooooMoMHoooooooooooooooooooooooMooooo
  121.  
    MMoooooooooooooooMMooo MMooooooooooooooooooooooooooM
  122.  
    MMMoooooooooooooMooooo oooooooooooooooooooooMooooo
  123.  
    MooMMoooooooooMoooMMoM ooooHooooooooooooooooMooooM
  124.  
    MooooMooooooMooooMoooM MoooooMoooooooooooooMooooo
  125.  
    ooooooMMooooooooMooooM MoooooooooMooooooooooooooM
  126.  
    HooooooMoooooooMooooM HoooooooHooMooooooooooooo
  127.  
    oooMoooooooooHoooM MoooooooooMoooooooooM
  128.  
    HooooooooooooHM MooooooooMMoooooooM
  129.  
    MMMMMMMMMMMMMM Moooooo:MooooHMM
  130.  
    MMMMMMM: ... MMMMMMMMMMMMMM
  131.  
    M............M MMMMMMMMM ....
  132.  
    M.MM.......... M.............M
  133.  
    M ..............MM M..............
  134.  
    MMMMM............MMMM ..MMMMMMMM ....M
  135.  
    MMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMM...M
  136.  
    .MMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMM
  137.  
    MMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMM
  138.  
    :MMMMMMMMMMMMMMMMMMH MMMMMMMMMMMMMMMMMMM
  139.  
    By EBEN Jérôme MMMMMMMMMMMMMMMMMM
  140.  
    MMMMMMMMMMMMMMM
  141.  
    HMMMMMM
  142.  
     
  143.  
    */
  144.  
    @SpringBootApplication
  145.  
    @MapperScan("com.scm.myblog.*")
  146.  
    @ServletComponentScan("com.scm.myblog.filter")
  147.  
    public class MyBlogscmApplication {
  148.  
    public static void main(String[] args) {
  149.  
    SpringApplication.run(MyBlogscmApplication.class, args);
  150.  
    //初始化点赞浏览数据
  151.  
    UserBlogBo.init_Redis();
  152.  
    }
  153.  
     
  154.  
    }
学新通

监听器

  1.  
    package com.scm.myblog.listener;
  2.  
     
  3.  
    import com.scm.myblog.bo.DPLDataBo;
  4.  
    import com.scm.myblog.bo.UserBlogBo;
  5.  
    import org.springframework.context.annotation.Configuration;
  6.  
     
  7.  
    import javax.servlet.ServletContext;
  8.  
    import javax.servlet.ServletContextEvent;
  9.  
    import javax.servlet.ServletContextListener;
  10.  
    import javax.servlet.annotation.WebListener;
  11.  
    import javax.servlet.http.HttpSession;
  12.  
    import java.util.ArrayList;
  13.  
    import java.util.HashMap;
  14.  
    import java.util.HashSet;
  15.  
    import java.util.List;
  16.  
    @Configuration
  17.  
    @WebListener()
  18.  
    public class MyServletContextListener implements ServletContextListener {
  19.  
     
  20.  
    /**
  21.  
    * servlet销毁
  22.  
    *
  23.  
    * @param sce 南加州爱迪生公司
  24.  
    */
  25.  
    @Override
  26.  
    public void contextDestroyed(ServletContextEvent sce)
  27.  
    {
  28.  
    UserBlogBo.destroyRedis();
  29.  
    System.out.println("Servlet被销毁了,数据写入数据库");
  30.  
    }
  31.  
    }
学新通

学新通

END...

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfhgfbc
系列文章
更多 icon
同类精品
更多 icon
继续加载