在前面的文章中呢,我们介绍了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 呢。
@Autowiredprivate 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代码如下
@Getterpublic 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, "密码或者用户名错误"); }
ResultVOUntilspublic 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 的相关文章,后续可以持续关注。雷子说测试。
本文暂时没有评论,来添加一个吧(●'◡'●)