【SpringBoot学习08】缓存

1. 什么是缓存

企业级应用主要作用是信息处理,当需要读取数据时,由于受限于数据库的访问效率,导致整体系统性能偏低。
在这里插入图片描述
为了改善上述现象,开发者通常会在应用程序与数据库之间建立一种临时的数据存储机制,该区域中的数据在内存中保存,读写速度较快,可以有效解决数据库访问效率低下的问题。这一块临时存储数据的区域就是缓存
在这里插入图片描述
缓存

  • 缓存是一种介于数据永久存储介质与数据应用之间的数据临时存储介质
  • 使用缓存可以有效的减少低速数据读取过程的次数(例如磁盘IO),提高系统性能
  • 缓存不仅可以用于提高永久性存储介质的数据读取效率,还可以提供临时的数据存储空间

2. 手机验证码案例

为了便于下面演示各种各样的缓存技术,我们创建一个手机验证码的案例环境,模拟使用缓存保存手机验证码的过程。

​ 手机验证码案例需求如下:

  • 输入手机号获取验证码,组织文档以短信形式发送给用户(页面模拟)
  • 输入手机号和验证码验证结果

为了描述上述操作,我们制作两个表现层接口,一个用来模拟发送短信的过程,其实就是根据用户提供的手机号生成一个验证码,然后放入缓存,另一个用来模拟验证码校验的过程,其实就是使用传入的手机号和验证码进行匹配,并返回最终匹配结果。

2.1 导入坐标

导入缓存cache相对应的坐标

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

2.2 开启缓存

在springboot的引导类上添加开启缓存功能

//开启缓存功能
@EnableCaching
@SpringBootApplication
public class CacheApplication {

	public static void main(String[] args) {
		SpringApplication.run(CacheApplication.class, args);
	}
}

2.3 定义验证码实体类

@Data
public class PCode {
    private String tel;
    private String code;
}

2.4 编写获取验证码和校验验证码接口及实现类

public interface PCodeService {
    public String sendCode(String tel);
    public boolean checkCode(PCode pCode);
}
@Service
public class PCodeServiceImpl implements PCodeService {

    @Autowired
    private PCodeUtils pCodeUtils;

    @Override
    // * value:缓存的名称,每个缓存名称下面可以有多个key
    // * key:缓存的key
    @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);
    }
}

2.5 定义验证码获取策略及根据手机号读取验证码的功能

这里解释一下,首先我们这个类是我们定义的工具类,因此在类上我们需要添加@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;
    }
}

2.6 定义验证码功能的web层接口

@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;
    }
}

接下来我们使用postman进行测试。
在这里插入图片描述
在这里插入图片描述

3. springboot整合redis缓存

3.1 导入坐标

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>

3.2 修改配置

在springboot的yml核心配置中添加redis的相关配置

	spring:
	  redis:
	    host: localhost
	    port: 6379
	  cache:
	    redis:
	      time-to-live: 10s   #缓存有效时间

3.3 打开redis,进行测试

打开我们redis安装目录,运行redis。这里说一下,如果遇到redis运行失败,打开命令行窗口,运行客户端,输入shutdown,再重新运行redis就可以了。

运行失败
在这里插入图片描述
打开客户端,执行shutdown
在这里插入图片描述
再次运行redis
在这里插入图片描述

ok,上一步代码不需要改动,直接运行,因为我们设置验证码失效时间为10s,因此10s过后缓存中不存在我们的验证码,因此会验证失败。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值