目錄
介紹
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中刪除