Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个包含多种数据结构,支持网络,基于内存,可选持久化的键值对存储数据库
Redis的优点- 基于内存运行,性能高效
- 支持分布式,理论上可以无限扩展
- 丰富的数据类型
sudo docker pull redis:latest sudo docker images sudo docker run --name redis -p 6379:6379 -d --restart=always redis:latest redis-server --appendonly yes --requirepass "Hello122342"
Spring Boot集成Redis6379是Redis服务的端口号,Hello122342是Redis的服务密码
Spring Boot项目实际上是通过网络来使用操作Redis,客户端的主要作用是为了更好的使用Redis
常见客户端:
- Lettuce客户端
高级Redis客户端,用于线程安全同步,异步和响应使用,支持集群,优势在于支持同步,异步和响应式模式多个线程可以共享一个连接实例 - Jedis客户端
老牌的Redisjava实现客户端,现已不推荐使用 - Redisson客户端
实现了分布式和可扩展的java数据结构,优势在于提供很多分布式相关的操作服务
SpringBoot集成Redis的步骤:
- 引入依赖
- 配置Redis服务器相关配置
- 启动应用
引入依赖:
org.springframework.boot spring-boot-starter-data-redis
配置Redis服务器相关配置
# Redis服务器地址 spring.redis.host= # Redis 服务器端口号 spring.redis.port=6379 # Redis 服务器密码 (请换成自己机器密码) spring.redis.password=
启动应用
import org.springframework.data.redis.core.StringRedisTemplate
@Controller
public class DemoController {
@Autowired
private StringRedisTemplate stringRedisTemplate;
}
StringRedisTemplate实现发送验证码功能
验证码的存储结构比较符合key-value结构,Redis十分合适处理这种数据结构
StringRedisTemplate的用法:
例子:将手机号为13902350924收到的验证码6209存储到Redis数据库中
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Controller;
@Controller
public class SMSCodeApi {
//引入StringRedisTemplate
@Autowired
private StringRedisTemplate stringRedisTemplate;
public void add() {
stringRedisTemplate.opsForValue().set("13902350924", "6209");
}
}
StringRedisTemplate存储的值必须是字符串
发送手机验证码功能:
@Controller
@RequestMapping("/code")
public class SMSCodeApi {
private static Logger logger = LoggerFactory.getLogger(SMSCodeApi.class);
@Autowired
private StringRedisTemplate stringRedisTemplate;
@ResponseBody
public Result send(@RequestParam("mobile") String mobile) {
Result result = new Result<>();
result.setSuccess(true);
// 步骤一
if (StringUtils.isEmpty(mobile)) {
result.setSuccess(false);
result.setMessage("手机号信息不能为空!");
return result;
}
// 生成四位数验证码
String code = String.valueOf((int)(Math.random() * 9 + 1) * 10000);
// 步骤二
// 调用第三方发送服务
Boolean sendResult = sendMobileCode(mobile, code);
if (!sendResult) {
result.setSuccess(false);
result.setMessage("发送验证码失败!");
return result;
}
// 步骤三
// 将手机号对应验证码存储到redis里
stringRedisTemplate.opsForValue().set(mobile, code);
return result;
}
private boolean sendMobileCode(String mobile, String code) {
logger.info("mobile is:" + mobile + "code is:" + code);
return true;
}
}
StringRedisTemplate获取功能:
@Controller
public class SMSCodeApi {
private static Logger logger = LoggerFactory.getLogger(SMSCodeApi.class);
//引入StringRedisTemplate
@Autowired
private StringRedisTemplate stringRedisTemplate;
public void get() {
String code = stringRedisTemplate.opsForValue().get("13902350924");
logger.info("验证码为:" + code);
}
}
校验手机验证码流程:
@Controller
@RequestMapping("/code")
public class SMSCodeApi {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@GetMapping("/verificate")
@ResponseBody
public Result send(@RequestParam("mobile") String mobile, @RequestParam("code") String code) {
Result result = new Result();
result.setSuccess(true);
//步骤一
if (StringUtils.isEmpty(mobile) || StringUtils.isEmpty(code)) {
result.setSuccess(false);
result.setMessage("手机号和验证码不能为空");
return result;
}
String existCode = stringRedisTemplate.opsForValue().get(mobile);
//步骤二
// 取出的验证码不能为空
if (StringUtils.isEmpty(existCode)) {
result.setSuccess(false);
result.setMessage("从Redis里未取出对应验证码");
return result;
}
// 校验取出的验证码与参数码是否一致
if (!existCode.equals(code)) {
result.setSuccess(false);
result.setMessage("手机验证码校验失败!");
return result;
}
return result;
}
}



