19. SpringBoot集成Redis(代码)
大约 3 分钟
附完整演示代码
1、PhoneCodeBuilder.java
如下是整个短信验证码场景实现代码:
package com.example.demo.component.redis.build;
import com.example.demo.component.redis.mediat.RedisMediator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* 手机验证码组件
* * @author luoYong
* @version 1.0
* @date 2022/1/21 14:06
*/
@Component
public class PhoneCodeBuilder {
@Autowired
private RedisMediator redisMediator;
/**
* 随机获取六位数字
*
* @return
*/
public String getCode() {
int code = (int) ((Math.random() * 9 + 1) * 100000);
return String.valueOf(code);
}
/**
* 获取验证码,存入redis中并设置过期时间
*/
public void verifyCode(String phone) {
//1、定义手机号、验证码标识
String phoneKey = phone + "_count";
String codeKey = phone + "_code";
//2、每个号码只能发送三次
String count = redisMediator.get(phoneKey);
//3、从次数进行判断
if (count == null) {
//说明此号码第一次申请
//插入phone标识,并设置过期时间
redisMediator.set(phoneKey, "1", Long.valueOf(24 * 60 * 60));
} else if (Integer.parseInt(count) <= 2) {
//获取当前用户验证码剩余时间
long keyExpirationTime = redisMediator.getKeyExpirationTime(phoneKey);
System.out.println("keyExpirationTime:" + keyExpirationTime);
//获取当前次数
String codeCount = redisMediator.get(phoneKey);
//次数+1
int newCount = Integer.parseInt(codeCount) + 1;
redisMediator.set(phoneKey, String.valueOf(newCount), keyExpirationTime);
} else {
//当天3次机会用完了
System.out.println("当天3次机会用完了!请明日再试");
return;
}
//获取随机6位验证码
String code = this.getCode();
//验证码存入redis并设置过期时间(2min)
redisMediator.set(codeKey, code, Long.valueOf(2 * 60));
}
/**
* 校验验证码是否有效
*/
public boolean checkCode(String phone, String code) {
String codeKey = phone + "_code";
String redisCode = redisMediator.get(codeKey);
if (code.equals(redisCode)) {
return true;
}
return false;
}
2、RedisMediator.java
如下是封装的一些对redis进行操作的方法类。大家自行进行新增,需要就加在里头即可。
package com.example.demo.component.redis;
import com.example.demo.util.JsonUtils;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
/**
* Redis中介类,用于从redis中读取内容或者更新数据
*
* @Author luoYong
* @Date 2022-01-20 17:47
*/
@Slf4j
@Component
public class RedisMediator {
@Resource
private StringRedisTemplate stringRedisTemplate;
@Value("${luoyong.redis.login-time-out:1800}")
private Integer timeOut;
/**
* 普通缓存放入
*
* @param key 键
* @param value 值
*/
public void set(String key, String value) {
set(key, value, timeOut);
}
/**
* 普通缓存放入并设置时间
*
* @param key 键
* @param value 值 String
* @param time 过期时间
*/
public void set(String key, String value, long time) {
this.checkKey(key);
stringRedisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
}
/**
* 普通缓存获取
*
* @param key 键
*/
public String get(String key) {
this.checkKey(key);
return stringRedisTemplate.opsForValue().get(key);
}
/**
* 判断key是否存在
*
* @param key 键
* @return true 存在 false不存在
*/
public boolean hasKey(String key) {
this.checkKey(key);
return stringRedisTemplate.hasKey(key);
}
/**
* 删除缓存
*
* @param key 健
*/
public void del(String key) {
this.checkKey(key);
stringRedisTemplate.delete(key);
}
/**
* 刷新缓存时间
*
* @param key
*/
public Boolean expire(String key) {
return this.expire(key, timeOut);
}
/**
* 指定缓存失效时间
*
* @param key 键
* @param time 时间(秒)
* @return
*/
public Boolean expire(String key, long time) {
return stringRedisTemplate.expire(key, time, TimeUnit.SECONDS);
}
/**
* 检查key是否为空
*
* @param key 健
*/
private void checkKey(String key) {
if (StringUtils.isBlank(key)) {
throw new RuntimeException("redis key不能为空");
}
}
/**
* 获取key的过期时间
*/
public long getKeyExpirationTime(String key){
this.checkKey(key);
return stringRedisTemplate.getExpire(key);
}}
3、PhoneCodeBuilderTest.java
如下是对手机号验证码功能的测试样例,大家可以参考一下:自己也可以封装自己想要测试的数据,这个随大家,开心就行。
package com.example.demo.component.redis.build;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class PhoneCodeBuilderTest {
@Autowired
private PhoneCodeBuilder phoneCodeBuilder;
@Test
void testGetCode(){
String code = phoneCodeBuilder.getCode();
System.out.println(code);
}
@Test
void testVerifyCode(){
phoneCodeBuilder.verifyCode("10010");
}
}
4、RedisMediator.java
如下是对redis工具类的一些常用方法的测试用例,大家可以借鉴一下:同样,还有自己新增的一些工具类,大家也记得进行测试用例测试哦,别到时候拍上用场的时候,直接当场社死,毕竟没上过测试的代码,都不敢确保百分百一定没有问题,这点大家还是需要严谨一些。
package com.example.demo.component.redis.mediat;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class RedisTest {
@Autowired
private RedisMediator redisMediator;
/**
* 插入一个key
*/
@Test
void testSetKey() {
redisMediator.set("name", "diaochan");
}
@Test
void testHasKey() {
boolean has = redisMediator.hasKey("name");
System.out.println("是否存在:" + has);
}
/**
* 获取一个key
*/
@Test
void testGetKey() {
String name = redisMediator.get("name");
System.out.println("获取到的name对于的值为:" + name);
}
/**
* 指定缓存失效时间(秒)
*/
@Test
void testExpireKey() {
redisMediator.expire("name", 3600);
}
/**
* 删除一个key
*/
@Test
void testDelKey() {
redisMediator.del("name");
}
}
好啦,redis的零基础入门,就止步于此啦!