1. 程式人生 > 資料庫 >mall整合Redis實現快取功能

mall整合Redis實現快取功能

本文主要講解mall整合Redis的過程,以簡訊驗證碼的儲存驗證為例。

Redis的安裝和啟動

Redis是用C語言開發的一個高效能鍵值對資料庫,可用於資料快取,主要用於處理大量資料的高訪問負載。

  • 下載Redis,下載地址:https://github.com/MicrosoftArchive/redis/releases

圖片

  • 下載完後解壓到指定目錄

圖片

  • 在當前位址列輸入cmd後,執行redis的啟動命令:redis-server.exe redis.windows.conf

整合Redis

新增專案依賴

在pom.xml中新增Redis相關依賴

<!--redis依賴配置--><dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-data-redis</artifactId></dependency>

修改SpringBoot配置檔案

在application.yml中新增Redis的配置及Redis中自定義key的配置。

在spring節點下新增Redis的配置

  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 # 連線超時時間(毫秒)

在根節點下新增Redis自定義key的配置

# 自定義redis keyredis:  key:    prefix:      authCode: "portal:authCode:"    expire:      authCode: 120 # 驗證碼超期時間

新增RedisService介面用於定義一些常用Redis操作

  1. package com.macro.mall.tiny.service;


  2. /**

  3. * redis操作Service,

  4. * 物件和陣列都以json形式進行儲存

  5. * Created by macro on 2018/8/7.

  6. */

  7. public interface RedisService {

  8.    /**

  9.     * 儲存資料

  10.     */

  11.    void set(String key, String value);


  12.    /**

  13.     * 獲取資料

  14.     */

  15.    String get(String key);


  16.    /**

  17.     * 設定超期時間

  18.     */

  19.    boolean expire(String key, long expire);


  20.    /**

  21.     * 刪除資料

  22.     */

  23.    void remove(String key);


  24.    /**

  25.     * 自增操作

  26.     * @param delta 自增步長

  27.     */

  28.    Long increment(String key, long delta);


  29. }

注入StringRedisTemplate,實現RedisService介面

  1. package com.macro.mall.tiny.service.impl;


  2. import com.macro.mall.tiny.service.RedisService;

  3. import org.springframework.beans.factory.annotation.Autowired;

  4. import org.springframework.data.redis.core.StringRedisTemplate;

  5. import org.springframework.stereotype.Service;


  6. import java.util.concurrent.TimeUnit;


  7. /**

  8. * redis操作Service的實現類

  9. * Created by macro on 2018/8/7.

  10. */

  11. @Service

  12. public class RedisServiceImpl implements RedisService {

  13.    @Autowired

  14.    private StringRedisTemplate stringRedisTemplate;


  15.    @Override

  16.    public void set(String key, String value) {

  17.        stringRedisTemplate.opsForValue().set(key, value);

  18.    }


  19.    @Override

  20.    public String get(String key) {

  21.        return stringRedisTemplate.opsForValue().get(key);

  22.    }


  23.    @Override

  24.    public boolean expire(String key, long expire) {

  25.        return stringRedisTemplate.expire(key, expire, TimeUnit.SECONDS);

  26.    }


  27.    @Override

  28.    public void remove(String key) {

  29.        stringRedisTemplate.delete(key);

  30.    }


  31.    @Override

  32.    public Long increment(String key, long delta) {

  33.        return stringRedisTemplate.opsForValue().increment(key,delta);

  34.    }

  35. }

新增UmsMemberController

新增根據電話號碼獲取驗證碼的介面和校驗驗證碼的介面

  1. package com.macro.mall.tiny.controller;


  2. import com.macro.mall.tiny.common.api.CommonResult;

  3. import com.macro.mall.tiny.service.UmsMemberService;

  4. import io.swagger.annotations.Api;

  5. import io.swagger.annotations.ApiOperation;

  6. import org.springframework.beans.factory.annotation.Autowired;

  7. import org.springframework.stereotype.Controller;

  8. import org.springframework.web.bind.annotation.RequestMapping;

  9. import org.springframework.web.bind.annotation.RequestMethod;

  10. import org.springframework.web.bind.annotation.RequestParam;

  11. import org.springframework.web.bind.annotation.ResponseBody;


  12. /**

  13. * 會員登入註冊管理Controller

  14. * Created by macro on 2018/8/3.

  15. */

  16. @Controller

  17. @Api(tags = "UmsMemberController", description = "會員登入註冊管理")

  18. @RequestMapping("/sso")

  19. public class UmsMemberController {

  20.    @Autowired

  21.    private UmsMemberService memberService;


  22.    @ApiOperation("獲取驗證碼")

  23.    @RequestMapping(value = "/getAuthCode", method = RequestMethod.GET)

  24.    @ResponseBody

  25.    public CommonResult getAuthCode(@RequestParam String telephone) {

  26.        return memberService.generateAuthCode(telephone);

  27.    }


  28.    @ApiOperation("判斷驗證碼是否正確")

  29.    @RequestMapping(value = "/verifyAuthCode", method = RequestMethod.POST)

  30.    @ResponseBody

  31.    public CommonResult updatePassword(@RequestParam String telephone,

  32.                                 @RequestParam String authCode) {

  33.        return memberService.verifyAuthCode(telephone,authCode);

  34.    }

  35. }

新增UmsMemberService介面

  1. package com.macro.mall.tiny.service;


  2. import com.macro.mall.tiny.common.api.CommonResult;


  3. /**

  4. * 會員管理Service

  5. * Created by macro on 2018/8/3.

  6. */

  7. public interface UmsMemberService {


  8.    /**

  9.     * 生成驗證碼

  10.     */

  11.    CommonResult generateAuthCode(String telephone);


  12.    /**

  13.     * 判斷驗證碼和手機號碼是否匹配

  14.     */

  15.    CommonResult verifyAuthCode(String telephone, String authCode);


  16. }

新增UmsMemberService介面的實現類UmsMemberServiceImpl

生成驗證碼時,將自定義的Redis鍵值加上手機號生成一個Redis的key,以驗證碼為value存入到Redis中,並設定過期時間為自己配置的時間(這裡為120s)。校驗驗證碼時根據手機號碼來獲取Redis裡面儲存的驗證碼,並與傳入的驗證碼進行比對。

  1. package com.macro.mall.tiny.service.impl;


  2. import com.macro.mall.tiny.common.api.CommonResult;

  3. import com.macro.mall.tiny.service.RedisService;

  4. import com.macro.mall.tiny.service.UmsMemberService;

  5. import org.springframework.beans.factory.annotation.Autowired;

  6. import org.springframework.beans.factory.annotation.Value;

  7. import org.springframework.stereotype.Service;

  8. import org.springframework.util.StringUtils;


  9. import java.util.Random;


  10. /**

  11. * 會員管理Service實現類

  12. * Created by macro on 2018/8/3.

  13. */

  14. @Service

  15. public class UmsMemberServiceImpl implements UmsMemberService {

  16.    @Autowired

  17.    private RedisService redisService;

  18.    @Value("${redis.key.prefix.authCode}")

  19.    private String REDIS_KEY_PREFIX_AUTH_CODE;

  20.    @Value("${redis.key.expire.authCode}")

  21.    private Long AUTH_CODE_EXPIRE_SECONDS;


  22.    @Override

  23.    public CommonResult generateAuthCode(String telephone) {

  24.        StringBuilder sb = new StringBuilder();

  25.        Random random = new Random();

  26.        for (int i = 0; i < 6; i++) {

  27.            sb.append(random.nextInt(10));

  28.        }

  29.        //驗證碼繫結手機號並存儲到redis

  30.        redisService.set(REDIS_KEY_PREFIX_AUTH_CODE + telephone, sb.toString());

  31.        redisService.expire(REDIS_KEY_PREFIX_AUTH_CODE + telephone, AUTH_CODE_EXPIRE_SECONDS);

  32.        return CommonResult.success(sb.toString(), "獲取驗證碼成功");

  33.    }



  34.    //對輸入的驗證碼進行校驗

  35.    @Override

  36.    public CommonResult verifyAuthCode(String telephone, String authCode) {

  37.        if (StringUtils.isEmpty(authCode)) {

  38.            return CommonResult.failed("請輸入驗證碼");

  39.        }

  40.        String realAuthCode = redisService.get(REDIS_KEY_PREFIX_AUTH_CODE + telephone);

  41.        boolean result = authCode.equals(realAuthCode);

  42.        if (result) {

  43.            return CommonResult.success(null, "驗證碼校驗成功");

  44.        } else {

  45.            return CommonResult.failed("驗證碼不正確");

  46.        }

  47.    }


  48. }

執行專案

訪問Swagger的API文件地址http://localhost:8080/swagger-ui.html ,對介面進行測試。

圖片