Redis是用C語言開發的一個高性能鍵值對數據庫,可用于數據緩存,主要用于處理大量數據的高訪問負載。
也就是說,如果你對性能要求不高,不用Radis也是可以的。不過作為最自己寫的程序有高要求的程序員,自然是要學一下的,畢竟大部分的網站都配置了radis。接下來一三部分來介紹radis:
- 安裝
- 配置
- 使用
Radis安裝
有兩種方式安裝,一種是下載安裝包安裝,radis是微軟出品的開源項目,代碼位于github上,大家可以戳這里下載最新的release包。
下載完后解壓到指定目錄后,打開命令行,輸入啟動命令
redis-server.exe redis.windows.conf
當然如果你用的是寶塔這種,你可以直接在軟件商店搜索并安裝,速度更快更便捷。
不管是windows版本還是寶塔下載的版本,直接啟動使用的默認配置。密碼為空,端口為6379,host為本機127.0.0.1。好了接下來就是將他整合到Spring里面。
整合到Springboot
初一看你會覺得radis挺難的,不知道是什么玩意,但是如果結合前面兩篇文章來看,radis的使用也無外乎以下三點:
- 引入環境
- 配置Radis
- 使用RadisTemplate提供的功能實現自己想要的接口。
使用起來感覺和mybatis的使用也都大差不差嘛。好勒話不多說直接開整。我們現在以接收手機驗證碼邏輯來整合radis。之所以需要在這個邏輯中引入Radis是因為客戶再獲取驗證碼的時候可能不是一次通過,它需要不斷地獲取驗證碼,實際上,在固定時間內驗證碼并不會變,他只是沒有收到而已,我們重發一遍就好了。
引入依賴
在pom中引入依賴:
<!--redis依賴配置-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
然后我們需要配置radis,盡管我們啟動的時候使用的默認配置,但是springboot是不知道的,因此我們需要在spring的節點下引入radis的配置:
redis:host: localhost # Redis服務器地址database: 0 # Redis數據庫索引(默認為0)port: 6379 # Redis服務器連接端口password: # Redis服務器連接密碼(默認為空)jedis:pool:max-active: 8 # 連接池最大連接數(使用負值表示沒有限制)max-wait: -1ms # 連接池最大阻塞等待時間(使用負值表示沒有限制)max-idle: 8 # 連接池中的最大空閑連接min-idle: 0 # 連接池中的最小空閑連接timeout: 3000ms # 連接超時時間(毫秒)
上面是關于radis鏈接的配置,我們還需要添加一些自定義key的配置,這個是radis業務上的。
# 自定義redis key,在根節點添加
redis:key:prefix:authCode: "portal:authCode:"expire:authCode: 120 # 驗證碼超期時間
實現功能
配置寫好了,我們接下來實現功能。也就是定義一些radis相關的操作方便其他業務代碼調用。Radis用的最多的幾個功能:
- 存儲數據
- 獲取數據
- 設置超時
- 刪除數據
- 自增操作
我們把這些功能定義好接口:
package org.lange.study.service;/*** redis操作Service,* 對象和數組都以json形式進行存儲*/
public interface RedisService {/*** 存儲數據*/void set(String key, String value);/*** 獲取數據*/String get(String key);/*** 設置超期時間*/boolean expire(String key, long expire);/*** 刪除數據*/void remove(String key);/*** 自增操作* @param delta 自增步長*/Long increment(String key, long delta);}
然后注入StringRedisTemplate,實現RedisService接口:(他其實是RedisTemplate的一個子類,StringRedisTemplate將字符串的處理簡化了,RedisTemplate可以處理任意對象,而StringRedisTemplate需要先轉換成json字符串才能保存起來)
多數時候我們頻繁操作的數據都是以鍵值對的相識存在,這也是引入radis的原因。接下來我們通過接入到業務層更深刻理解Radis的使用。
驗證碼就兩個功能,一個是獲取驗證碼,當用戶獲取到驗證碼之后會調用驗證接口來驗證他填寫的驗證碼是否正確。所以我們先把接口定義一下:
UmsMemberService.java
package org.lange.study.service;import org.lange.study.common.api.CommonResult;/*** 會員管理Service*/
public interface UmsMemberService {/*** 生成驗證碼*/CommonResult generateAuthCode(String telephone);/*** 判斷驗證碼和手機號碼是否匹配*/CommonResult verifyAuthCode(String telephone, String authCode);}
寫一個控制器UmsMemberController:
package org.lange.study.controller;import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.lange.study.common.api.CommonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;/*** 添加根據電話號碼獲取驗證碼的接口和校驗驗證碼的接口* 會員登錄注冊管理Controller*/
@Controller
@Api(tags = "UmsMemberController", description = "會員登錄注冊管理")
@RequestMapping("/sso")
public class UmsMemberController {@Autowiredprivate UmsMemberService memberService;@ApiOperation("獲取驗證碼")@RequestMapping(value = "/getAuthCode", method = RequestMethod.GET)@ResponseBodypublic CommonResult getAuthCode(@RequestParam String telephone) {return memberService.generateAuthCode(telephone);}@ApiOperation("判斷驗證碼是否正確")@RequestMapping(value = "/verifyAuthCode", method = RequestMethod.POST)@ResponseBodypublic CommonResult updatePassword(@RequestParam String telephone,@RequestParam String authCode) {return memberService.verifyAuthCode(telephone,authCode);}
}
然后我們要實現對應的Service,UmsMemberServiceImpl.java:
假定我們的驗證碼業務場景為:
生成驗證碼時,將自定義的Redis鍵值加上手機號生成一個Redis的key,以驗證碼為value存入到Redis中,并設置過期時間為自己配置的時間(這里為120s)。校驗驗證碼時根據手機號碼來獲取Redis里面存儲的驗證碼,并與傳入的驗證碼進行比對。
UmsMemberServiceImpl.java
package org.lange.study.service.impl;import org.lange.study.common.api.CommonResult;
import org.lange.study.service.RedisService;
import org.lange.study.service.UmsMemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;import java.util.Random;@Service
public class UmsMemberServiceImpl implements UmsMemberService {@Autowiredprivate RedisService redisService;@Value("${redis.key.prefix.authCode}")private String REDIS_KEY_PREFIX_AUTH_CODE;@Value("${redis.key.expire.authCode}")//這個@value就是讀取前面的配置private Long AUTH_CODE_EXPIRE_SECONDS;/*** 生成的時候設置超時間并保存到radis,然后將驗證碼返回給客戶端*/@Overridepublic CommonResult generateAuthCode(String telephone) {StringBuilder sb = new StringBuilder();Random random = new Random();for (int i = 0; i < 6; i++) {sb.append(random.nextInt(10));}//驗證碼綁定手機號并存儲到redisredisService.set(REDIS_KEY_PREFIX_AUTH_CODE + telephone, sb.toString());redisService.expire(REDIS_KEY_PREFIX_AUTH_CODE + telephone, AUTH_CODE_EXPIRE_SECONDS);return CommonResult.success(sb.toString(), "獲取驗證碼成功");}/*** 對輸入的驗證碼進行校驗,調用get方法就好了*/@Overridepublic CommonResult verifyAuthCode(String telephone, String authCode) {if (StringUtils.isEmpty(authCode)) {return CommonResult.failed("請輸入驗證碼");}String realAuthCode = redisService.get(REDIS_KEY_PREFIX_AUTH_CODE + telephone);boolean result = authCode.equals(realAuthCode);if (result) {return CommonResult.success(null, "驗證碼校驗成功");} else {return CommonResult.failed("驗證碼不正確");}}
}
在上述案例中,我只用到了Radis的設置和獲取以及設置有效時間的方法,Radis的其他功能大家可以根據需要去探索。
運行
我們可以使用swagger進行接口調試
訪問Swagger的API文檔地址http://localhost:8080/swagger-ui.html ,對接口進行測試。