目录
- 介绍
- 开发环境
- pom文件引入
- 创建redis.properties配置文件
- 创建RedisConfig配置类
- 创建RedisUtil工具类
- 使用
- 效果
介绍
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文件引入
org.springframework.boot
spring-boot-starter-data-redis
redis.clients
jedis
2.9.0
创建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中删除