SpringBoot整合Redis
首先我是在Windows上开发的,因此需要在Windows安装Redis,安装的教程Windows下安装Redis服务,这个教程很容易懂,我按照教程一步一步安装下来,很久就可以运行Redis了。
这个教程在【JAVA】IDEA中SpringBoot整合MyBatis基础上进行。本次需求是前端查询完账户信息后,将查询数据保存在Redis中。以及前端更新账户信息后,然后MyBatis进行更新数据库,接着Redis更新缓存。尽量以最少的配置和最少的代码来演示SpringBoot是如何整合Redis的。整个项目已经放入我的github中SunAlwaysOnline。
首先我的项目目录如下:
(1)导入Redis依赖,在pom.xml中增加以下代码
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
(2)配置Redis,在application.properties中增加以下代码
PS:前三个配置都加了spring前缀,而后面几个并没有加。如果前三个不加spring前缀的话,启动就会报nonauth错误,即密码错误,验证失败。我推测如果不加spring前缀的话,SpringBoot无法读取到我们配置的真实地址和密码,而会使用默认的localhost和空密码进行连接,从而导致连接失败。
#Redis
# Redis服务器地址
spring.redis.host=127.0.0.1
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=a123
# 连接池最大连接数(使用负值表示没有限制)
redis.pool.max-active=200
# 连接池最大阻塞等待时间(使用负值表示没有限制)
redis.pool.max-wait=-1
# 连接池中的最大空闲连接
redis.pool.max-idle=10
# 连接池中的最小空闲连接
redis.pool.min-idle=0
# 连接超时时间(毫秒)
redis.timeout=3000
(3)以查询和更新为例(更新账户信息的mapper、dao、service与serviceImpl就不贴出来了,有兴趣的同学可以前往我的github中看看)
PS:如果将RedisTemplate写成RedisTemplate<String,object>,那么就无法注入。这个问题也困扰我这个初学者好久,不过在这篇文章上找到了答案SpringBoot中注入RedisTemplate实例异常解决
package com.sun.mydata.service.impl;
import com.sun.mydata.dao.AccountDao;
import com.sun.mydata.domain.Account;
import com.sun.mydata.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
@Service
public class AccountServiceImpl implements AccountService {
@Autowired
RedisTemplate redisTemplate;
@Autowired
private AccountDao accountDao;
//首先在redis中查询,查询不到时,前往数据库中查找,然后将数据保存在redis中。
@Override
public Account findById(int id) {
Account account = null;
Object o = redisTemplate.opsForValue().get(id);
if (null == o) {
account = accountDao.findById(id);
redisTemplate.opsForValue().set(id, account);
System.out.println("redis中不存在id为" + id + "的账户信息!");
} else {
account = (Account) o;
System.out.println("redis中存在id为" + id + "的账户信息!");
}
return account;
}
//首先让数据库执行更新操作,之后更新redis
@Override
public Integer updateById(Account account) {
Integer i=accountDao.updateById(account);
if(i>0){
redisTemplate.opsForValue().set(account.getId(),account);
}
return i;
}
}
(4)前端界面(原谅我还在用jQuery)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>主页面</title>
<script src="js/jquery.min.js"></script>
</head>
<body>
<div>
<p>查询账户信息</p>
<input type="text" id="text_id">
<button id="btn_s_account">查找</button>
<span id="s_name" style="margin-left: 10px;margin-right: 10px;"></span>
<span id="s_money" style="margin-left: 10px;margin-right: 10px;"></span>
</div>
<hr />
<div>
<p>修改账户信息</p>
<input type="text" id="u_id" hidden="hidden">
姓名:<input type="text" id="u_name">
余额:<input type="text" id="u_money">
<button id="btn_u_account">修改</button>
<span id="u_info" style="margin-left: 10px;margin-right: 10px;"></span>
</div>
</body>
<!--查找账户信息-->
<script>
$("#btn_s_account").click(function() {
$.ajax({
url: "/account/" + $("#text_id").val(),
dataType: "json",
success: function(data) {
$("#s_name").text("姓名:" + data.name);
$("#s_money").text("余额:" + data.money)
$("#u_id").val(da***_name").val(data.name)
$("#u_money").val(+data.money)
},
error: function(err) {
alert("请求失败!");
}
})
});
</script>
<!--更新用户信息-->
<script>
$("#btn_u_account").click(function() {
$.ajax({
url: "/account/update",
dataType: "json",
da***_id").val(),
name: $("#u_name").val(),
money: $("#u_money").val()
},
success: function(data) {
alert(data.info);
},
error: function(err) {
alert("更新账户信息失败!");
}
})
});
</script>
</html>
输入id为1,点击查询按钮后,前台效果
这是第一次查询,Redis中是没有这条记录的,此时后台的输出为
第二次点击查询后,Redis中存入了这条信息,前端获取的数据来自Redis中,此时后台的输出为
当我们更新这条记录后,比如讲余额改为3000后,再次点击查询后,后台的输出为
可见,我们达到了目的。