企业级应用主要作用是信息处理,当需要读取数据时,由于受限于数据库的访问效率,导致整体系统性能偏低。
为了改善上述现象,开发者通常会在应用程序与数据库之间建立一种临时的数据存储机制,该区域中的数据在内存中保存,读写速度较快,可以有效解决数据库访问效率低下的问题。这一块临时存储数据的区域就是缓存。
缓存
为了便于下面演示各种各样的缓存技术,我们创建一个手机验证码的案例环境,模拟使用缓存保存手机验证码的过程。
手机验证码案例需求如下:
为了描述上述操作,我们制作两个表现层接口,一个用来模拟发送短信的过程,其实就是根据用户提供的手机号生成一个验证码,然后放入缓存,另一个用来模拟验证码校验的过程,其实就是使用传入的手机号和验证码进行匹配,并返回最终匹配结果。
导入缓存cache相对应的坐标
org.springframework.boot
spring-boot-starter-cache
在springboot的引导类上添加开启缓存功能
//开启缓存功能
@EnableCaching
@SpringBootApplication
public class CacheApplication {
public static void main(String[] args) {
SpringApplication.run(CacheApplication.class, args);
}
}
@Data
public class PCode {
private String tel;
private String code;
}
public interface PCodeService {
public String sendCode(String tel);
public boolean checkCode(PCode pCode);
}
@Service
public class PCodeServiceImpl implements PCodeService {
@Autowired
private PCodeUtils pCodeUtils;
@Override
@CachePut(value = "pCode",key = "#tel")
public String sendCode(String tel) {
String code = pCodeUtils.generator(tel);
return code;
}
@Override
public boolean checkCode(PCode pCode) {
//取出内存中的验证码与传递过来的验证码比对,如果相同,返回true
String code = pCode.getCode();
String cacheCode = pCodeUtils.get(pCode.getTel());
return code.equals(cacheCode);
}
}
这里解释一下,首先我们这个类是我们定义的工具类,因此在类上我们需要添加@Component注解将其标志为spring管理的bean。
然后,验证码生成策略是根据当前电话生成hashCode,再将其跟加密码做hash运算。由于这样加密只能得到一组固定的验证码,因此再将加密后的结果与当前时间做hash运算再得到验证码。
@Component
public class PCodeUtils {
private String[] zero = {"000000","00000","0000","000","00","0",""};
public String generator(String tel){
int hash = tel.hashCode();
int encryption = 11280926;
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();
return zero[len] + codeStr;
}
@Cacheable(value = "pCode" ,key = "#tel")
public String get(String tel){
return null;
}
}
@RestController
@RequestMapping("/pCode")
public class PCodeController {
@Autowired
private PCodeService pCodeService;
@GetMapping
public String getCode(String tel){
String code = pCodeService.sendCode(tel);
return code;
}
@PostMapping
public boolean checkCode(PCode pCode){
boolean flag = pCodeService.checkCode(pCode);
return flag;
}
}
org.springframework.boot
spring-boot-starter-data-redis
在springboot的yml核心配置中添加redis的相关配置
spring:
redis:
host: localhost
port: 6379
cache:
redis:
time-to-live: 10s #缓存有效时间
打开我们redis安装目录,运行redis。这里说一下,如果遇到redis运行失败,打开命令行窗口,运行客户端,输入shutdown,再重新运行redis就可以了。
运行失败
打开客户端,执行shutdown
再次运行redis
ok,上一步代码不需要改动,直接运行,因为我们设置验证码失效时间为10s,因此10s过后缓存中不存在我们的验证码,因此会验证失败。