Redis 是彻底开源免费的,遵照BSD协议,是一个高性能的key-value数据库。前端
Redis 与其余 key - value 缓存产品有如下三个特色:java
- Redis支持数据的持久化,能够将内存中的数据保存在磁盘中,重启的时候能够再次加载进行使用。
- Redis不单单支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操做。
- 原子 – Redis的全部操做都是原子性的,意思就是要么成功执行要么失败彻底不执行。单个操做是原子性的。多个操做也支持事务,即原子性,经过MULTI和EXEC指令包起来。
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过时等等特性。
SpringBoot整合Redis经常使用的方式有两种,分别是Jedis和RedisTemplate。Jedis是Redis官方推荐的面向Java的操做Redis的客户端,RedisTemplate是SpringDataRedis中对JedisApi的高度封装。具体使用哪一种方式,根据我的需求场景,本文以Jedis为例,整合使用Redisredis
请参照: 基于SpringBoot构建分模块项目spring
<!-- 基于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服务器地址 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
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; } }
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中删除缓存