SpringBoot整合Redis

Lou.Chen
大约 3 分钟

一、docker中安装redis

1、镜像安装与容器创建

docker pull redis  //拉取镜像
docker run -d -p 6379:6379 --restart=always --name myredis 镜像名  //创建容器

2、查看redis版本

docker exec -it 9a7d1cf2c234 redis-cli -v //查看版本

3、修改redis密码(临时,重启失效)

①进入redis管理页面

不带密码进入(进入后需验证)==>

docker exec -it 9a7d1cf2c234 redis-cli //进入redis管理界面

带密码进入(进入后无需验证)==>

docker exec -it 9a7d1cf2c234 redis-cli -a '密码' //带密码进入管理界面

②查询密码

config get requirepass //查看密码(初始为空)

③设置密码

config set reuqirepass 密码 //设置密码

④验证密码

auth 密码 //验证密码才能够进行查询密码和设置密码等操作

4、永久设置密码(需要修改配置文件)

二、springboot整合Redis

注意:

①在Springboot 2.1.5及之后使用redis必须引入springSecurity

②redis5及之后远程访问连接必须要设置密码

③使用jedis和lettuce客户端连接redis服务器的区别:

使用jedis:当多线程使用同一个连接时,是线程不安全的。所以要使用连接池,为每个jedis实例分配一个连接。

Jedis在实现上是直接连接的redis server,如果在多线程环境下是非线程安全的,这个时候只有使用连接池,为每个Jedis实例增加物理连接

使用Lettuce:当多线程使用同一连接实例时,是线程安全的

Lettuce的连接是基于Netty的,连接实例(StatefulRedisConnection)可以在多个线程间并发访问,应为StatefulRedisConnection是线程安全的,所以一个连接实例(StatefulRedisConnection)就可以满足多线程环境下的并发访问,当然这个也是可伸缩的设计,一个连接实例不够的情况也可以按需增加连接实例。

1、基于lettuce底层的redis配置

引入SpringSecurity后,SpringSecurity帮我们生成一个密码

在我们第一个请求redis会要求输入账号密码

用户名为:uers 密码为:Using generated security password: 648dcfaa-ce97-459d-a6d4-b02f73532f89

pom.xml

spring-boot-starter-data-redis

spring-boot-starter-security

<dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

    </dependencies>
yaml配置
spring:
  redis:
#    主机
    host: 47.96.141.44
#    默认使用的数据库(第一个)
    database: 0
    port: 6379
    password: 147258369
#    配置lettuce连接池的相关属性

controller
@RestController
public class HelloController {


    @Autowired
    StringRedisTemplate stringRedisTemplate;

    @GetMapping("/set")
    public void set(){
        ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();
        ops.set("lc", "louchen.top");
    }

    @GetMapping("/get")
    public void get() {
        ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();
        System.out.println(ops.get("lc"));
    }

}

自动配置详解

org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration=>

@Configuration(
    proxyBeanMethods = false
)
@ConditionalOnClass({RedisOperations.class})
@EnableConfigurationProperties({RedisProperties.class})
@Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class})
public class RedisAutoConfiguration {
    public RedisAutoConfiguration() {
    }

    @Bean
    @ConditionalOnMissingBean(
        name = {"redisTemplate"}
    )
    //操作健值为对象的redistemplate
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        RedisTemplate<Object, Object> template = new RedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }

    @Bean
    @ConditionalOnMissingBean
    //主要操作健值为字符串的对象
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        StringRedisTemplate template = new StringRedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }
}