【突破舒适圈】在SpringBoot中配置Redis

     阅读:75

业务背景

前端的App、网页在登录时,或是用户在进行一些敏感操作的时候需要进行短信验证。但是在等待用户输入验证码的这段时间里,这个随机生成的验证码在后台应该存放在哪里呢?

放在MySql数据库?可以的确是可以,但是如果用户访问量一下巨大起来,SQL读写面临高并发,会严重拖慢程序响应速度,甚至导致直接宕机。

那放在Session里?emmm好像也不行,执行效率过低,性价比不高。在多用户访问时似乎并不能很好的承担这一重任。

我们需要一个读写迅速,使用方便的工具。于是我们顺着思路,比磁盘读写速度更快的,那就是内存读写咯,于是Redis 数据库便浮现于脑海。

一直想着找机会试试这个东西,今天就是个正好的机会。

1.Redis安装

由于是第一次使用Redis,还一头雾水,天真的以为在 Pom.xml 文件里引入依赖就可以使用了…
直到把 Redis 的配置过程和 Mysql 联系到一起,才逐渐明白。

首先要进行安装:(所有安装资源链接都放到文章最后了)

下载、解压之后,配置环境变量。
在这里插入图片描述

然后打开控制台
输入redis-server.exe,如果出现Redis 的界面,则代表安装成功、环境变量配置成功。
在这里插入图片描述

2.安装 Redis 图形化管理界面

毕竟是Redis 新手,直观总好过抽象。图形化界面不仅可以让我们对Redis理解得更快,在操作上也会更加便捷。

解压、安装之后。

新建一个连接,就跟Mysql一样。
在这里插入图片描述
此时界面是这样的。
在这里插入图片描述
左边那一排就应该是“数据库”了,未来的数据应该就会存储到那里。

3. SpringBoot配置

现在可以开始在项目里配置了。

首先是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();
    }

}

4. 测试

到这里我们可以开始测试了,新建一个测试单元。

首先测试数据的新增

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!!继续加油!!!!