目錄
本案例實現(xiàn)功能:
1 根據手機號碼 生成6位數 的數字 驗證碼
2 輸入手機號和驗證碼, 判斷輸入的驗證碼是否正確
一 默認緩存
1.1 主要代碼
1 添加依賴
org.springframework.bootspring-boot-starter-cache
2 啟用緩存
3 實體類
package com.qing.bean;import lombok.Data;@Datapublic class SMSCode { private String phoneNum; private String code;}
4 創(chuàng)建驗證碼的工具類
package com.qing.util;import org.springframework.cache.annotation.Cacheable;import org.springframework.stereotype.Component;@Componentpublic class CodeUtils { public String generate(String phoneNum) { int hash = phoneNum.hashCode(); int encryption = 2022630; //異或加密:一種通過異或運算進行加密的算法 //轉成二進制,運算規(guī)則:相同為0,不同為1,再轉成十進制 long result = hash ^ encryption; long nowTime = System.currentTimeMillis(); result = result ^ nowTime; long code = result % 1000000; //處理有負數的情況 code = code < 0 ? -code : code; //六位數:前面補0 String.format("%06d",code); return code + ""; } //獲取緩存里的驗證碼 @Cacheable(key ="#phoneNum" ,value = "cacheCode") public String getCacheCode(String phoneNum){ return null; }}
關于異或運算請點這里
說明:getCacheCode()獲取緩存里的驗證碼的方法,寫在工具類這里是因為要使spring的@Cacheable這個注解生效,需要注入spring容器,該工具類在后面的ServiceImpl進行了注入,該方法返回的是注解@Cacheable的value屬性值 cacheCode ( 詳見后面的測試 )
5 service
package com.qing.service;import com.qing.bean.SMSCode;public interface SMSCodeService { //發(fā)送驗證碼 String sendCode(String phoneNum); //檢查驗證碼 boolean checkCode(SMSCode smsCode);}
6 serviceImpl
package com.qing.service.impl;import com.qing.bean.SMSCode;import com.qing.service.SMSCodeService;import com.qing.util.CodeUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.cache.annotation.CachePut;import org.springframework.stereotype.Service;@Servicepublic class SMSCodeServiceImpl implements SMSCodeService { @Autowired CodeUtils codeUtils; //發(fā)送驗證碼 @Override //只往里放,不往外讀 @CachePut(key = “#phoneNum”, value = “cacheCode”) public String sendCode(String phoneNum) { return codeUtils.generate(phoneNum); } //比對驗證碼 @Override public boolean checkCode(SMSCode smsCode) { //取出內存中的驗證碼與傳遞過來的驗證碼比對,相同返回true String code = smsCode.getCode(); String cacheCode = codeUtils.getCacheCode(smsCode.getPhoneNum()); return code.equals(cacheCode); }}
7 controller
package com.qing.controller;import com.qing.bean.SMSCode;import com.qing.service.SMSCodeService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.*;@RestController@RequestMapping(“/sms”)public class SMSCodeController { @Autowired private SMSCodeService smsCodeService; @GetMapping(“/{phoneNum}”) public String getCode(@PathVariable String phoneNum){ return smsCodeService.sendCode(phoneNum); } @PostMapping public boolean checkCode(@RequestBody SMSCode smsCode) { return smsCodeService.checkCode(smsCode); }}
1.2 測試
1 生成驗證碼
2 輸入錯的驗證碼驗證
3 輸入正確的驗證碼
4 再次生成驗證
二 Ehcache緩存
在默認緩存案例的基礎上做3個配置就行
1 加依賴
net.sf.ehcache ehcache
2 配置文件
3 ehcache.xml放在resources下
默認緩存
配置新的緩存: name 要和@CachePut注解的的value的屬性值一樣
三 數據淘汰策略
下圖表示的信息:
1 下面的時間分別表示最后一次訪問是在 第幾秒訪問的
2 上面的數字表示 訪問了幾次
LRU:age 是上次訪問離現(xiàn)在的時間最遠的
LFU:gender 訪問次數是最少的
四 redis緩存
4.1 基礎使用
在默認緩存的基礎上加2個配置
1 導入依賴
org.springframework.boot spring-boot-starter-data-redis
2 配置文件
測試
打開redis的服務端和客戶端
關于redis的安裝和簡單使用在這里
生成一次驗證碼
數據已經進到redis緩存里了
緩存的名字即這個value屬性的值 和 key 電話號碼組合成一個新的key一起放進redis緩存里
再生成一次驗證碼
redis又多了一個緩存數據
4.2 其他配置
測有效時間 10s
看一下測試效果
10s之后緩存里的驗證碼失效了
備注: 超過了有效時長,redis數據里就沒有那個緩存了
測前綴
總結
原文 https://blog.csdn.net/m0_45877477/article/details/125539400