一、开发环境
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">×</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">«</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">»</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;
}
}