SpringBoot整合Redis
一、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;
}
}