SpringBoot整合Redis---Jedis版


介紹

Redis簡介

Redis 是完全開源免費的,遵守BSD協議,是一個高性能的key-value數據庫。

Redis 與其他 key - value 緩存產品有以下三個特點:

  • Redis支持數據的持久化,可以將內存中的數據保存在磁盤中,重啟的時候可以再次加載進行使用。
  • Redis不僅僅支持簡單的key-value類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。
  • Redis支持數據的備份,即master-slave模式的數據備份。

Redis優勢

  • 性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
  • 豐富的數據類型 – Redis支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操作。
  • 原子 – Redis的所有操作都是原子性的,意思就是要么成功執行要么失敗完全不執行。單個操作是原子性的。多個操作也支持事務,即原子性,通過MULTI和EXEC指令包起來。
  • 豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性。

SpringBoot和Redis

SpringBoot整合Redis常用的方式有兩種,分別是Jedis和RedisTemplate。Jedis是Redis官方推薦的面向Java的操作Redis的客戶端,RedisTemplate是SpringDataRedis中對JedisApi的高度封裝。具體使用哪種方式,根據個人需求場景,本文以Jedis為例,整合使用Redis

開發環境

請參照: 基於SpringBoot構建分模塊項目

pom文件引入

<!-- 基於SpringBoot項目的基礎上,額外引入一下兩個jar包 -->
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency>

創建redis.properties配置文件

# Redis服務器地址
redis.host=127.0.0.1
# Redis服務器連接端口
redis.port=6379
# Redis服務器連接密碼(默認為空)
redis.password=null
redis.timeout=30000
# 連接池最大連接數(使用負值表示沒有限制)
redis.maxTotal=30
# 連接池中的最大空閑連接
redis.maxIdle=10
redis.numTestsPerEvictionRun=1024
redis.timeBetweenEvictionRunsMillis=30000
redis.minEvictableIdleTimeMillis=1800000
redis.softMinEvictableIdleTimeMillis=10000
# 連接池最大阻塞等待時間(使用負值表示沒有限制)
redis.maxWaitMillis=1500
redis.testOnBorrow=true
redis.testWhileIdle=true
redis.blockWhenExhausted=false

創建RedisConfig配置類

package com.wayne.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * redis配置類,用於讀取redis地址、端口等基礎參數
 * @author Wayne
 * @date 2019/4/30
 */
@Configuration
@PropertySource("classpath:application-dev.properties")
public class RedisConfig {

    @Value("${redis.host}")
    private String host;

    @Value("${redis.port}")
    private int port;

    @Value("${redis.timeout}")
    private int timeout;

    @Value("${redis.maxIdle}")
    private int maxIdle;

    @Value("${redis.maxWaitMillis}")
    private int maxWaitMillis;

    @Value("${redis.blockWhenExhausted}")
    private Boolean blockWhenExhausted;

    @Value("${redis.JmxEnabled}")
    private Boolean JmxEnabled;

    @Bean
    public JedisPool jedisPoolFactory() {
        System.out.println("JedisPool注入開始...");
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxIdle(maxIdle);
        jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
        // 連接耗盡時是否阻塞, false報異常,true阻塞直到超時, 默認true
        jedisPoolConfig.setBlockWhenExhausted(blockWhenExhausted);
        // 是否啟用pool的jmx管理功能, 默認tru
        jedisPoolConfig.setJmxEnabled(JmxEnabled);
        JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout);
        System.out.println("JedisPool注入成功...");
        return jedisPool;
    }
}

創建RedisUtil工具類

package com.wayne.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

/**
 * Redis工具類
 * @author Wayne
 * @date 2019/4/30
 */
@Component
public class RedisUtil {

    @Autowired
    private JedisPool jedisPool;

    /**
     * 向Redis中存值,永久有效
     */
    public String set(String key, String value) {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            return jedis.set(key, value);
        } catch (Exception e) {
            return "0";
        } finally {
            returnResource(jedisPool, jedis);
        }
    }

    /**
     * 根據傳入Key獲取指定Value
     */
    public String get(String key) {
        Jedis jedis = null;
        String value;
        try {
            jedis = jedisPool.getResource();
            value = jedis.get(key);
        } catch (Exception e) {
            return "0";
        } finally {
            returnResource(jedisPool, jedis);
        }
        return value;
    }

    /**
     * 校驗Key值是否存在
     */
    public Boolean exists(String key) {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            return jedis.exists(key);
        } catch (Exception e) {
            return false;
        } finally {
            returnResource(jedisPool, jedis);
        }
    }

    /**
     * 刪除指定Key-Value
     */
    public Long delete(String key) {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            return jedis.del(key);
        } catch (Exception e) {
            return 0L;
        } finally {
            returnResource(jedisPool, jedis);
        }
    }
    
    // 以上為常用方法,更多方法自行百度

    /**
     * 釋放連接
     */
    private static void returnResource(JedisPool jedisPool, Jedis jedis) {
        if (jedis != null) {
            jedisPool.returnResource(jedis);
        }
    }
}

使用

此處以注冊發送短信驗證碼為例,驗證碼有效時間為2分鍾

@Autowired
private RedisUtil redisUtil;

@Test
public void sendMessage() {
    // 驗證碼為后台隨機生成
    final String CAPTCHA = "666666";
    // 手機號為前端傳入
    final String MOBILE = "18888888888";

    // 發送短信工具類
    MessageUtils.sendMessage(CAPTCHA, MOBILE);

    // 將驗證碼存入Redis
    redisUtil.set(MOBILE, CAPTCHA);
    // 設置驗證碼過期時間為2分鍾
    redisUtil.expire(MOBILE, 60*2);

    System.out.println("驗證碼發送成功");
}

@Test
public void validateCaptcha () {
    // 此驗證碼和手機號均為前端傳入
    String CAPTCHA = "666666";
    String MOBILE = "18888888888";

    // 校驗驗證碼是否存在Redis中
    if (!redisUtil.exists(MOBILE)) {
        System.out.println("驗證碼已過期");
        return;
    }

    // 獲取Redis中的驗證碼
    String tempCaptcha = redisUtil.get(MOBILE);

    // 校驗驗證碼
    if (!CAPTCHA.equals(tempCaptcha)) {
        System.out.println("驗證碼錯誤");
        return;
    }

    // 刪除Redis中的驗證碼
    redisUtil.delete(MOBILE);
}

效果

截圖時該Key-Value 剩余時間還有118秒,當時間變為0時,該條數據將會自動從Redis中刪除

驗證碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM