阅读:75
前端的App、网页在登录时,或是用户在进行一些敏感操作的时候需要进行短信验证。但是在等待用户输入验证码的这段时间里,这个随机生成的验证码在后台应该存放在哪里呢?
放在MySql数据库?可以的确是可以,但是如果用户访问量一下巨大起来,SQL读写面临高并发,会严重拖慢程序响应速度,甚至导致直接宕机。
那放在Session里?emmm好像也不行,执行效率过低,性价比不高。在多用户访问时似乎并不能很好的承担这一重任。
我们需要一个读写迅速
,使用方便的工具。于是我们顺着思路,比磁盘读写速度更快的,那就是内存读写
咯,于是Redis 数据库便浮现于脑海。
一直想着找机会试试这个东西,今天就是个正好的机会。
由于是第一次使用Redis,还一头雾水,天真的以为在 Pom.xml 文件里引入依赖就可以使用了…
直到把 Redis 的配置过程和 Mysql 联系到一起,才逐渐明白。
首先要进行安装:(所有安装资源链接都放到文章最后了)
下载、解压之后,配置环境变量。
然后打开控制台
输入redis-server.exe
,如果出现Redis 的界面,则代表安装成功、环境变量配置成功。
毕竟是Redis 新手,直观总好过抽象。图形化界面不仅可以让我们对Redis理解得更快,在操作上也会更加便捷。
解压、安装之后。
新建一个连接,就跟Mysql一样。
此时界面是这样的。
左边那一排就应该是“数据库”了,未来的数据应该就会存储到那里。
现在可以开始在项目里配置了。
首先是Pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
然后是在 yml 文件中进行配置,redis是spring的直接下级目录哦。
redis:
#数据库索引
database: 0
host: 127.0.0.1
port: 6379
password:
jedis:
pool:
#最大连接数
max-active: 8
#最大阻塞等待时间(负数表示没限制)
max-wait: -1
#最大空闲
max-idle: 8
#最小空闲
min-idle: 0
#连接超时时间
timeout: 10000
然后需要一个配置类,可以以后直接复制用
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
@Bean(name = "redisTemplate")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
//参照StringRedisTemplate内部实现指定序列化器
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.setKeySerializer(keySerializer());
redisTemplate.setHashKeySerializer(keySerializer());
redisTemplate.setValueSerializer(valueSerializer());
redisTemplate.setHashValueSerializer(valueSerializer());
return redisTemplate;
}
private RedisSerializer<String> keySerializer(){
return new StringRedisSerializer();
}
//使用Jackson序列化器
private RedisSerializer<Object> valueSerializer(){
return new GenericJackson2JsonRedisSerializer();
}
}
到这里我们可以开始测试了,新建一个测试单元。
首先测试数据的新增
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.concurrent.TimeUnit;
@RunWith(SpringRunner.class)
@SpringBootTest
public class test {
@Autowired
private RedisTemplate redisTemplate;
@Test
public void A() throws InterruptedException {
//插入单条数据
redisTemplate.opsForValue().set("key1", "我是新信息");
System.out.println(redisTemplate.opsForValue().get("key1"));
//插入单条数据(存在有效期)
System.out.println("-----------------");
redisTemplate.opsForValue().set("key2", "这是一条会过期的信息", 1, TimeUnit.SECONDS);//向redis里存入数据和设置缓存时间
System.out.println(redisTemplate.hasKey("key2"));检查key是否存在,返回boolean值
System.out.println(redisTemplate.opsForValue().get("key2"));
Thread.sleep(2000);
System.out.println(redisTemplate.hasKey("key2"));//检查key是否存在,返回boolean值
System.out.println(redisTemplate.opsForValue().get("key2"));
System.out.println("-----------------");
}
}
结果
打开图形化界面验证一下,确实加进去了,过期的信息就不见了
接下来我们试试删除
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.concurrent.TimeUnit;
@RunWith(SpringRunner.class)
@SpringBootTest
public class test {
@Autowired
private RedisTemplate redisTemplate;
@Test
public void A() throws InterruptedException {
redisTemplate.delete("key1");
}
}
结果发现刚刚添加的东西成功删除。
新技能get!!继续加油!!!!