在前面的文章中呢,我们介绍了spring boot 集成Druid,集成了mysql ,在实际的开发过程中呢,我们还需要利用redis 做一些缓存之类的数据,怎样去链接redis呢,本篇文章给大家讲解下,首先呢,我们还是需要去配置对应的库的。在我们的pom.xml去配置我们的redis。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
然后去会自动的去下载对应的库,那么我们还需要在application.yaml配置,如下配置
redis:
port: 6379
host: 127.0.0.1
jedis:
pool:
max-active: 1000
min-idle: 200
timeout: 1000
链接的端口呢 是6379,链接的host 是redis的host,超时是1000, 最大活跃是1000 。这样配置好了,就完成了最简单的操作,这样是就可以链接到我们的redis了,当然不能啊,你还要启动你的 redis的服务呢,不启动是没有办法链接的,那么我们可以利用之前学的docker 去搭建我们的redis的服务。
搜索后,我们运行docker pull redis,下载镜像。
下载完毕,输入
docker images
查看本地的镜像。
然后去启动我们的镜像
docker run -itd --name redis -p 6379:6379 redis
这样就可以启动我们的redis的实例。我这里呢,打开界面管理工具,就链接到了redis 上面,
因为我这里的redis最近在使用,所以大家会看到有数据的。
那么我们在Springboot 怎么使用redis 呢。
@Autowired
private RedisTemplate redisTemplate;
首先呢,我们去加载这个,然后我们要制定我们redis的库,所以进行简单的封装。
private RedisTemplate userredis(RedisTemplate redisTemplate) {
redisTemplate = RedisDbInit.initRedis(2, redisTemplate);
return redisTemplate;
}
那么我们这样就完成了封装,接下来就是操作了,我这里还是去实现用户的登录,这里呢,对用户登录错误密码输入固定的时间超时后呢,我们就对用户进行禁止登录。
@Override
public UserVo login(String username, String password) {
Instant inst1 = Instant.now();
/*根据邮箱或者用户名登录*/
User user = userRepository.findByUsername(username);
//查询,用户是否存在
if (user != null) {
UserVo userVo = login_is(user, password, username);
Instant inst2 = Instant.now();
System.out.println("登录接口内部耗时:" + Duration.between(inst1, inst2).toMillis());
return userVo;
} else {
//查询邮箱,支持邮箱登录
User useremail = userRepository.findByEmail(username);
if (useremail != null) {
//存在,调用封装好d的方法
UserVo userVo = login_is(useremail, password, username);
return userVo;
}
}
throw new PanExection(ResultEmus.USER_NOT_EXIT);
}
if (user.getStatus().equals(UserEmus.DELETE.getCode())) {
throw new PanExection(ResultEmus.USER_DELETE);
}
//判断用户密码是否正确
Boolean b;
try {
b = MD5Until.checkoutpassword(password, user.getPassword());
} catch (Exception e) {
throw new PanExection(ResultEmus.EXCEPTIONS);
}
if (b) {
//密码正确
Date date = new Date();
String tokne;
//token生产
try {
tokne = MD5Until.md5(user.getUsername() + date.toString());
} catch (Exception e) {
log.error("登录产生token时候失败!原因是:" + e.getMessage());
throw new PanExection(ResultEmus.EXCEPTIONS);
}
UserVo userVo = new UserVo();
userVo.setId(user.getId());
userVo.setEmail(user.getEmail());
userVo.setToken(tokne);
userVo.setUsername(user.getUsername());
//存储token
String token = user.getUsername() + "_" + tokne;
userredis(redisTemplate).opsForValue().set(username, token, 1, TimeUnit.DAYS);
useridport(redisTemplate).opsForValue().set(user.getUsername(), user.getId().toString(), 1, TimeUnit.DAYS);
return userVo;
} else {
//密码不正确,判断是否有错误的存在,有,累加,
String reslut = (String) userredis(redisTemplate).opsForValue().get("login_" + user.getId().toString());
if (reslut == null) {
userredis(redisTemplate).opsForValue().set("login_" + user.getId(), "1", 10, TimeUnit.MINUTES);
throw new PanExection(ResultEmus.USER_ERROR_PASSWORD);
} else {
if (4 < Integer.parseInt(reslut)) {
throw new PanExection(ResultEmus.USER_FREE);
} else {
Integer num = Integer.parseInt(reslut) + 1;
userredis(redisTemplate).opsForValue().set("login_" + user.getId(), (num.toString()), 10, TimeUnit.MINUTES);
throw new PanExection(ResultEmus.USER_ERROR_PASSWORD);
}
}
}
备注,PanExection代码如下
@Getter
public class PanExection extends RuntimeException {
private Integer code;
public PanExection(ResultEmus resultEmuns) {
super(resultEmuns.getMessage());
this.code = resultEmuns.getCode();
}
public PanExection(CaseResultEmus resultEmuns) {
super(resultEmuns.getMessage());
this.code = resultEmuns.getCode();
}
public PanExection(Integer code, String message) {
super(message);
this.code = code;
}
}
对一场进行处理。完成上述的开发呢,我们可以写一个接口来测试下。
@ApiOperation(value = "登录", notes = "用户登录")
@PostMapping(value = "/login", produces = "application/json")
public ResultVO login(@Valid UserForm userForm,
BindingResult bindingResult,
HttpServletRequest httpServletRequest) {
if (bindingResult.hasErrors()) {
throw new PanExection(ResultEmus.PARM_ERROR.getCode(), bindingResult.getFieldError().getDefaultMessage());
}
UserVo login = userSerice.login(userForm.getUsername(), userForm.getPassword());
if(login!=null){
return ResultVOUntils.success("ok");
}
return ResultVOUntils.error(1, "密码或者用户名错误");
}
ResultVOUntils
public class ResultVOUntils {
public static ResultVO success(Object object) {
ResultVO resultVO = new ResultVO();
resultVO.setData(object);
resultVO.setMsg("成功");
resultVO.setCode(0);
return resultVO;
}
public static ResultVO success() {
return success(null);
}
public static ResultVO error(Integer code, String msg) {
ResultVO resultVO = new ResultVO();
resultVO.setCode(code);
resultVO.setMsg(msg);
return resultVO;
}
public static ResultVO error(Object object) {
ResultVO resultVO = new ResultVO();
resultVO.setData(object);
resultVO.setMsg("失败");
resultVO.setCode(1);
return resultVO;
}
}
这样就可以在本地,启动我们的服务,去测试我们功能是否可以正常。测试下
那么我们看redis 有没有存储上去呢,打开redis 查看下。
这样我么在spring boot +redis 就实现完毕了,我们还可以在缓存中使用。本人只是介绍了一个小功能。利用redis 来存储错误次数,在规定时间内输入错误 就标记失败,我们还可以查看redis key的过去时间。
SELECT 2 切换数据
pttl 查看key的过期时间
后续的文章还会持续介绍spring boot 的相关文章,后续可以持续关注。雷子说测试。