目录
1. 缓存
缓存是一种介于数据永久存储介质与数据应用之间的数据临时存储介质
使用缓存可以有效的减少低速数据读取过程的次数(例如磁盘IO),提高系统性能
缓存不仅可以用于提高永久性存储介质的数据读取效率,还可以提供临时的数据存储空间
2. 普通方法:
@Override
public class MsgServiceImpl implements MsgServices{
private HashMap<String,String> cache = new HashMap<String,String>();
@Override
public String get(String tele){
String code = tele.substring(tele.length() - 6);
cache.put(tele,code);
return code;
}
@Override
public String check(String tele,String code){
String queryCode = cache.get(tele);
return code.equals(queryCode);
}
}
3. Spring中缓存的使用方式:
- 启用缓存
- 设置进入缓存的数据
- 设置读取缓存的数据
(1)导入坐标
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
(2)在启动类上加一句话,用来启动缓存
@EnableCaching //开启缓存功能
public class SpringbootApplication{
public static void main (String[] args){
SpringApplication.run(SpringbootApplication.class,arg);
}
}
//使用
Service实现类中
@Override
@Cacheable(value ="cacheSpace",key="#id")
public Book getById(Integer id){
return bookDao.selectById(id);
}
过程:第一次代表设置,如果第一次操作该方法时,发现缓存中没有该id值,就将值塞到cacheSpace里面,第二次的时候就先到cacheSpace里面检查,如果有值就直接从cache里面取出来就不走return操作
4. 缓存使用案例----手机验证码
需求:
- 输入手机号获取验证码,组织文档以短信形式发送给用户(页面模拟)
- 输入手机号和验证码验证结果
需求分析:
提供controller,传入手机号,业务层通过手机号计算出独有的6位验证码数据,存入缓存后返回此数据
提供controller 传入手机号和验证码,业务层通过手机号从缓存中读取验证码与输入验证码进行对比,返回比对结果。
实体类
@Data
public class SMSCode {
private String tele;
private String code;
}
业务层接口
@Service
public interface SMSCodeService {
public String sendCodeToSMS(String tele);
public boolean checkCode(SMSCode smsCode);
}
实现类
public class SMSCodeServiceImpl implements SMSCodeService {
@Autowired
privete CodeUtils codeUtils;
@Override
// @Cacheable(value = "smsCode", key= "#tele") //既放又取,不过后面的每一次取都是第一次的值
@CachePut(value = "smsCode",key="#tele") //只有放,值每次都不一样
public String sendCodeToSMS(String tele){
return codeUtils.generator(tele);
}
@Override
public boolean checkCode(SMSCode smsCode){
return false;
}
}
Controller:
@RestController
@RequestMapping("/sms")
public class SMSCodeController{
@Autowired
private SMSCodeService smsCodeService;
@GetMapping()
public String getCode(String tele){
String code = smsCodeService.sendCodeToSMS(tele);
return code;
}
@PostMapping
public boolean checkCode(SMSCode smsCode){
return smsCodeService.checkCode(smsCode);
}
}
生成验证码工具:
public String generator(String tele){
private String [] patch = {"00000","0000","000","00","0",""};
int hash = tel.hashCode();
long encryption = 20230524;
long result = hash^encryption
long nowTime = System.currentTimeMillis();
result = result ^ nowTime;
long code = result % 1000000;
code = code < 0 ? -code : code
String codeStr = code + "";
int len = codeStr.length; // length of the code in digits. must be even number. must start with zero. must be 6 digits long
return patch[len-1] + codeStr;
}