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后,再次点击查询后,后台的输出为

可见,我们达到了目的。