Redis投票系统

代码下载地址: https://gitee.com/sukels/java-ee-redis.git

一、开发环境

1. 工具类

  • IntelliJ IDEA 2021.2 + JDK 1.8 + Maven 3.3.9
  • RedisDesktopManager + Redis 4.0.6

二、效果展示

1. 三位用户登录:admin、suke、ls

2. 投票系统首页

3. 发布文章

 三、Redis搭建

[root@Suke ~]# cd /usr/local/redis-4.0.6/src
[root@Suke src]# [root@Suke src]# ./redis-server /usr/local/redis-4.0.6/redis.conf &
^C
[root@Suke src]# ./redis-cli -h 192.168.60.130 -p 6379 -a 123456
192.168.60.130:6379> 

 四、基本环境搭建

1. 部署基本结构和配置框架

2. 导入相关的pom.xml依赖

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.suke</groupId>
    <artifactId>04-voteSys</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>04-voteSys Maven Webapp</name>
    <!-- FIXME change it to the project's website -->
    <url>http://www.example.com</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>

        <!--spring-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.3.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.0.3.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.7.2</version>
        </dependency>

        <!--j2ee-->
        <dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>javax.annotation-api</artifactId>
            <version>1.2</version>
        </dependency>

        <!--jstl-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.0</version>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.3</version>
            <scope>provided</scope>
        </dependency>

        <!--难得糊涂工具:Hutool-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.13</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.3</version>
        </dependency>
    </dependencies>
</project>

3.resources

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">

    <!--扫描包,管理Bean对象-->
    <context:component-scan base-package="com.suke" />
</beans>

springMVC.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context.xsd
          http://www.springframework.org/schema/mvc
           http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--扫描Controller-->
    <context:component-scan
            base-package="com.suke.controller"/>

    <!--配置处理器适配器和处理器映射器-->
    <mvc:annotation-driven>
        <mvc:message-converters register-defaults="true">
            <!--json解析器-->
            <bean id="mappingJacksonHttpMessageConverter"
                  class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                <!--class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">-->
                <property name="supportedMediaTypes">
                    <list>
                        <value>text/html;charset=UTF-8</value>
                        <value>application/json</value>
                        <value>application/xml;charset=UTF-8</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

    <!--处理静态资源文件-->
    <mvc:default-servlet-handler/>

    <!--视图解析器-->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

4.web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!--读取Spring的配置文件-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>

    <!--配置监听器,监听IOC容器是否正常工作-->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>


    <!--配置分发器:DispatcherServlet-->
    <servlet>
        <servlet-name>springMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springMVC.xml</param-value>
        </init-param>
        <!--服务器启动之后就初始化该Servlet-->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>springMVC</servlet-name>
        <!--
          *.do/action:避免屏蔽访问静态文件
          /:
           1、访问不了静态资源文件
           2、支持url地址的Restful风格 ?
          /*:错误的写法 定位到jsp上,而不是找Controller
        -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!--全站编码过滤器,解决post乱码,tomcat7.0以后的版本就不用考虑get乱码-->
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <!--要使用的字符集-->
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <!--是否强制设置response的编码为encoding,建议设置为true-->
            <param-name>forceResponseEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>用户登录</title>
    <link rel="stylesheet" href="bootstrap_3.3.0/css/bootstrap.min.css"/>
    <script src="bootstrap_3.3.0/js/bootstrap.min.js"></script>
    <style>
        div {
            width: 400px;
            margin: 50px auto;
        }
    </style>
</head>
<body>
<div>
    <legend>用户登录</legend>
    <form action="login" method="post">
        <div class="form-group">
            <label>用户名</label>
            <input type="text" name="username" class="form-control" placeholder="请输入用户名">
        </div>
        <div class="form-group">
            <label>密码</label>
            <input type="password" name="password" class="form-control" placeholder="请输入密码">
        </div>
        <button type="submit" class="btn btn-default">登录</button>
    </form>
</div>
</body>
</html>

index.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>首页</title>
    <link rel="stylesheet" href="bootstrap_3.3.0/css/bootstrap.min.css"/>
    <script src="bootstrap_3.3.0/js/jquery-1.11.1-min.js"></script>
    <script src="bootstrap_3.3.0/js/bootstrap.min.js"></script>
</head>
<body>

<%--发布文章的模态窗口--%>
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
    <div class="modal-dialog" role="document">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span>
                </button>
                <h4 class="modal-title" id="myModalLabel">发布文章</h4>
            </div>
            <div class="modal-body">
                <form id="saveForm" action="saveArticle" method="post">
                    <div class="form-group">
                        <label>文章标题</label>
                        <input type="text" name="title" class="form-control" placeholder="请输入标题">
                    </div>
                    <div class="form-group">
                        <label>发布地址</label>
                        <input type="text" name="url" class="form-control" placeholder="请输入地址">
                    </div>
                    <div class="form-group">
                        <label>文章内容</label>
                        <textarea class="form-control" name="content" rows="3" placeholder="请输入内容"></textarea>
                    </div>
                </form>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
                <button type="button" onclick="punish()" class="btn btn-primary">发布</button>
            </div>
        </div>
    </div>
</div>

<h1 style=" color: limegreen">欢迎您【${user.username}】
    <button class="btn btn-primary" onclick="location.href='logOut'">登出</button>
</h1>

<table style="margin: 20px auto;width: 800px;" class="table table-bordered table-hover">
    <caption><h3 style="text-align: center">文章列表数据</h3></caption>
    <tbody>
    <tr>
        <td colspan="8">
            <button class="btn btn-success" data-toggle="modal" data-target="#myModal">发布文章</button>
            <button class="btn btn-success" onclick="location.href='list?type=vote&ascOrDesc=asc'">点赞数升序
            </button>
            <button class="btn btn-success" onclick="location.href='list?type=vote&ascOrDesc=desc'">点赞数降序
            </button>
            <button class="btn btn-success" onclick="location.href='list?type=time&ascOrDesc=asc'">发布时间升序
            </button>
            <button class="btn btn-success" onclick="location.href='list?type=time&ascOrDesc=desc'">发布时间降序
            </button>
            <form class="form-inline" style="margin-top: 20px">
                <div class="form-group">
                    <input type="password" class="form-control" id="exampleInputPassword3" placeholder="请输入文章标题">
                </div>
                <button type="submit" class="btn btn-default">查询</button>
            </form>
        </td>
    </tr>
    <tr>
        <th>
            <input type="checkbox">
        </th>
        <th>编号</th>
        <th>标题</th>
        <th>链接地址</th>
        <th>发布者</th>
        <th>发布时间</th>
        <th>点赞数</th>
        <th>操作</th>
    </tr>
    <c:forEach items="${articles}" var="article" varStatus="position">
        <tr>
            <td><input type="checkbox"></td>
            <td>${position.index}</td>
            <td>${article.title}</td>
            <td>${article.url}</td>
            <td>${article.uid}</td>
            <td>${article.pubTime}</td>
            <td id="${article.aid}">${article.votes}</td>
            <td>
                <button class="btn btn-success">删除</button>
                <button class="btn btn-primary" onclick="vote(${article.aid})">投票</button>
            </td>
        </tr>
    </c:forEach>
    </tbody>
    <tr>
        <td colspan="8">
            <nav aria-label="Page navigation">
                <ul class="pagination">
                    <li>
                        <a href="#" aria-label="Previous">
                            <span aria-hidden="true">&laquo;</span>
                        </a>
                    </li>
                    <li><a href="#">1</a></li>
                    <li><a href="#">2</a></li>
                    <li><a href="#">3</a></li>
                    <li><a href="#">4</a></li>
                    <li><a href="#">5</a></li>
                    <li>
                        <a href="#" aria-label="Next">
                            <span aria-hidden="true">&raquo;</span>
                        </a>
                    </li>
                </ul>
            </nav>
        </td>
    </tr>
</table>
</body>

<script>
    //发布文章
    function punish() {
        $('#saveForm').submit();
    }
    //投票
    function vote(aid) {
        $.get('vote', {'aid': aid}, function (data) {
            //data:ResultVo
            if (!data.ok) {
                alert(data.message);
            } else {
                //更新票数 把页面的票数+1
                $('#' + aid).text(parseInt($('#' + aid).text()) + 1);
            }
        }, 'json');
    }
</script>
</html>

success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>欢迎您</h1>
</body>
</html>

5.bean

Article

package com.suke.bean;

public class Article {

    private String aid;//主键
    private String title;//标题
    private String content;//内容
    private String url;//链接地址
    private String uid;//发布者
    private String pubTime;//发布时间
    private String votes;//投票数

    public String getPubTime() {
        return pubTime;
    }

    public void setPubTime(String pubTime) {
        this.pubTime = pubTime;
    }

    public String getAid() {
        return aid;
    }

    public void setAid(String aid) {
        this.aid = aid;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    @Override
    public String toString() {
        return "Article{" +
                "aid='" + aid + '\'' +
                ", title='" + title + '\'' +
                ", content='" + content + '\'' +
                ", url='" + url + '\'' +
                ", uid='" + uid + '\'' +
                ", pubTime='" + pubTime + '\'' +
                ", votes='" + votes + '\'' +
                '}';
    }

    public String getUid() {
        return uid;
    }

    public void setUid(String uid) {
        this.uid = uid;
    }

    public String getVotes() {
        return votes;
    }

    public void setVotes(String votes) {
        this.votes = votes;
    }
}

ResultVo

package com.suke.bean;

public class ResultVo {

    private boolean isOk;
    private String message;

    @Override
    public String toString() {
        return "ResultVo{" +
                "isOk=" + isOk +
                ", message='" + message + '\'' +
                '}';
    }

    public boolean isOk() {
        return isOk;
    }

    public void setOk(boolean ok) {
        isOk = ok;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

User

package com.suke.bean;

public class User {

    private String uid;
    private String username;
    private String password;


    public String getUid() {
        return uid;
    }

    @Override
    public String toString() {
        return "User{" +
                "uid='" + uid + '\'' +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void setUid(String uid) {
        this.uid = uid;
    }

}

6.controller

VoteSysController

package com.suke.controller;

import com.suke.bean.Article;
import com.suke.bean.ResultVo;
import com.suke.bean.User;
import com.suke.service.VoteSysService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpSession;
import java.util.List;

@Controller
public class VoteSysController {

    @Autowired
    private VoteSysService voteSysService;

    //用户登录
    @RequestMapping("/login")
    public String login(User user, HttpSession session) {
        user = voteSysService.login(user);
        session.setAttribute("user", user);
        //forward:list 内部方法跳转
        return "forward:list";
    }

    //保存文章
    @RequestMapping("/saveArticle")
    public String saveArticle(Article article, HttpSession session) {
        User user = (User) session.getAttribute("user");
        voteSysService.punish(article, user);
        return "forward:list";
    }


    //登出
    @RequestMapping("/logOut")
    public String logOut(HttpSession session) {
        session.removeAttribute("user");
        return "redirect:/login.jsp";
    }

    //查询所有数据
    @RequestMapping("/list")
    public String list(Model model, @RequestParam(defaultValue = "time") String type, @RequestParam(defaultValue = "asc") String ascOrDesc) {
        List<Article> articles = null;
        if ("time".equals(type)) {
            articles = voteSysService.orderByTime(ascOrDesc);
        } else {
            articles = voteSysService.orderByVotes(ascOrDesc);
        }

        model.addAttribute("articles", articles);
        return "index";
    }

    //异步投票
    @RequestMapping("/vote")
    @ResponseBody
    public ResultVo vote(String aid, HttpSession session) {
        ResultVo resultVo = new ResultVo();
        User user = (User) session.getAttribute("user");
        boolean voteOk = voteSysService.vote(aid, user.getUid());
        if (voteOk) {
            resultVo.setOk(true);
        } else {
            resultVo.setMessage("不能重复投票");
        }
        return resultVo;
    }
}

7.service

VoteSysService

package com.suke.service;

import com.suke.bean.Article;
import com.suke.bean.User;

import java.util.List;

public interface VoteSysService {

    //发布文章
    void punish(Article article, User user);

    //投票
    boolean vote(String aid, String uid);

    //按投票数排序
    List<Article> orderByVotes(String ascOrDesc);

    //按发布时间排序
    List<Article> orderByTime(String ascOrDesc);

    //根据主键查询文章
    Article queryByAid(String aid);

    //用户登录
    User login(User user);
}

impl/VoteSysServiceImpl

package com.suke.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import com.suke.bean.Article;
import com.suke.bean.User;
import com.suke.service.VoteSysService;
import com.suke.util.RedisUtil;
import org.springframework.stereotype.Service;
import redis.clients.jedis.Jedis;

import java.text.SimpleDateFormat;
import java.util.*;

@Service
public class VoteSysServiceImpl implements VoteSysService {

    Jedis jedis = RedisUtil.getJedis();

    //发布文章
    @Override
    public void punish(Article article, User user) {
        String index = jedis.incr("aIndex") + "";
        article.setAid(index);
        article.setUid(user.getUid());
        article.setPubTime(System.currentTimeMillis() + "");
        article.setVotes("0");
        String key = "article:" + index;
        RedisUtil.dbToRedis(article, jedis, 7, key);

        //用户发布文章的时候默认给自己投一个票
        jedis.hincrBy(key, "votes", 1);

        //按发布时间
        jedis.zadd("time:info", Double.parseDouble(article.getPubTime()), key);

        //按投票数排序
        jedis.zadd("votes:info", Double.parseDouble(jedis.hget(key, "votes")), key);

        //记录这篇文章被谁投过票了
        jedis.sadd("voted:" + index, user.getUid());
    }

    @Override
    public boolean vote(String aid, String uid) {
        jedis.select(7);
        //超过七天不能投票
        //获取当前时间
        long now = System.currentTimeMillis();

        //根据主键查询文章
        Article article = queryByAid(aid);
        //获取发布时间
        long pubTime = Long.parseLong(article.getPubTime());
        if ((now - pubTime) > 7 * 24 * 3600 * 1000) {
            return false;
        }

        //投过票的不能重复投票 ,没值返回1,有值返回0
        /*
         * 1、能够把没投票的用户加入
         * 2、判断有没有重复投票
         * */
        if (jedis.sadd("voted:" + aid, uid) == 0) {
            return false;
        }

        String key = "article:" + aid;
        //开始投票
        //给文章的votes票数+1
        jedis.hincrBy(key, "votes", 1);

        //把文章最新的票数加入到按投票数排序那个zset中
        jedis.zadd("votes:info", Double.parseDouble(jedis.hget(key, "votes")), key);

        return true;
    }

    @Override
    public List<Article> orderByVotes(String ascOrDesc) {
        jedis.select(7);
        List<Article> articles = new ArrayList<>();
        Set<String> members = null;
        if ("asc".equals(ascOrDesc)) {
            //查询按时间排序的所有文章(member)
            members = jedis.zrange("votes:info", 0, -1);
        } else {
            members = jedis.zrevrange("votes:info", 0, -1);
        }
        for (String member : members) {
            Map<String, String> map = jedis.hgetAll(member);
            Article article = BeanUtil.mapToBean(map, Article.class, false,
                    new CopyOptions().ignoreNullValue());

            //取出发布时间,格式化
            String pubTime = article.getPubTime();
            Date date = new Date(Long.parseLong(pubTime));
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            article.setPubTime(simpleDateFormat.format(date));
            //发布者,根据外键查询用户
            //取出用户主键
            String uid = article.getUid();

            Map<String, String> userMap = jedis.hgetAll("user:" + uid);
            User user = BeanUtil.mapToBean(userMap, User.class, false,
                    new CopyOptions().ignoreNullValue());
            article.setUid(user.getUsername());

            articles.add(article);
        }
        return articles;
    }

    @Override
    public List<Article> orderByTime(String ascOrDesc) {
        jedis.select(7);
        List<Article> articles = new ArrayList<>();
        Set<String> members = null;
        if ("asc".equals(ascOrDesc)) {
            //查询按时间排序的所有文章(member)
            members = jedis.zrange("time:info", 0, -1);
        } else {
            members = jedis.zrevrange("time:info", 0, -1);
        }
        for (String member : members) {
            Map<String, String> map = jedis.hgetAll(member);
            Article article = BeanUtil.mapToBean(map, Article.class, false,
                    new CopyOptions().ignoreNullValue());

            //取出发布时间,格式化
            String pubTime = article.getPubTime();
            Date date = new Date(Long.parseLong(pubTime));
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            article.setPubTime(simpleDateFormat.format(date));
            //发布者,根据外键查询用户
            //取出用户主键
            String uid = article.getUid();

            Map<String, String> userMap = jedis.hgetAll("user:" + uid);
            User user = BeanUtil.mapToBean(userMap, User.class, false,
                    new CopyOptions().ignoreNullValue());
            article.setUid(user.getUsername());

            articles.add(article);
        }
        return articles;
    }

    @Override
    public Article queryByAid(String aid) {
        jedis.select(7);
        String key = "article:" + aid;
        Map<String, String> map = jedis.hgetAll(key);
        Article article = BeanUtil.mapToBean(map, Article.class, false,
                new CopyOptions().ignoreNullValue());
        return article;
    }

    @Override
    public User login(User user) {
        jedis.select(7);
        //取出所有用户
        Set<String> keys = jedis.keys("user:*");
        for (String key : keys) {
            Map<String, String> map = jedis.hgetAll(key);
            String username = map.get("username");
            String password = map.get("password");

            if (username.equals(user.getUsername()) && password.equals(user.getPassword())) {
                //Map转Bean
                user = BeanUtil.mapToBean(map, User.class, false,
                        new CopyOptions().ignoreNullValue());
            }

        }
        return user;
    }
}

8.util

RedisUtil

package com.suke.util;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

import java.util.*;

/*
 * <>:T E K V
 * T:Type
 * E:Elements
 * K:key
 * V:value
 * */
public class RedisUtil {

    //Jedis:等同于Connection
    public static Jedis getJedis() {
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(500);
        config.setMaxIdle(5);
        config.setMaxWaitMillis(100);
        JedisPool jedisPool =
                new JedisPool(config, "192.168.60.130", 6379, 1000, "123456");
        Jedis jedis = jedisPool.getResource();
        return jedis;
    }

    //把Map<String,Object>转换成Map<String,String>
    public static Map<String, String> mapToMap(Map<String, Object> map) {
        Map<String, String> data = new HashMap<String, String>();
        for (Map.Entry<String, Object> m : map.entrySet()) {
            data.put(m.getKey(), m.getValue() + "");
        }
        return data;
    }

    //把数据库查询出来的数据存储到Redis中
    public static <T> void dbToRedis(List<T> data, Jedis jedis, int index, String keyPattern) {
        //选库
        jedis.select(index);
        Map<String, Object> map = new HashMap<String, Object>();
        for (T t : data) {
            //把对象的数据放入到Map中
            BeanUtil.beanToMap(t, map, false, true);
            //Map<String,Object>转换成Map<String,String>
            Map<String, String> tempData = mapToMap(map);
            jedis.hmset(keyPattern + jedis.incr("index"), tempData);
        }
    }

    public static <T> void dbToRedis(T t, Jedis jedis, int index, String key) {
        //选库
        jedis.select(index);
        Map<String, Object> map = new HashMap<String, Object>();
        //把对象的数据放入到Map中
        BeanUtil.beanToMap(t, map, false, true);
        //Map<String,Object>转换成Map<String,String>
        Map<String, String> tempData = mapToMap(map);
        jedis.hmset(key, tempData);
    }

    //把Redis数据查询出来封装到对象中
    public static <T> List<T> redisToJava(Class<T> clazz, Jedis jedis, int index, String keyPattern) {
        //选库
        jedis.select(index);

        //获取满足条件的key
        Set<String> keys = jedis.keys(keyPattern);

        List<T> data = new ArrayList<T>();
        for (String key : keys) {
            Map<String, String> map = jedis.hgetAll(key);
            T t = BeanUtil.mapToBean(map, clazz,
                    false, new CopyOptions().ignoreNullValue());
            data.add(t);
        }
        return data;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_45037155/article/details/124907088