Redis学习(五)---SpringBoot整合Redis
程序员文章站
2022-10-03 15:07:02
创建项目创建一个SpringBoot项目,我就用快速方法建的主要要注意一个点:记得勾选NoSql中的Spring Data Redis简单看一下pom文件Redis主要需要下面的这依赖 org.springframework.boot spring-boot-starter-data-redis
创建项目
创建一个SpringBoot项目,我就用快速方法建的
主要要注意一个点:记得勾选NoSql中的Spring Data Redis
简单看一下pom文件
Redis主要需要下面的这依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
我们点进去看一下:ctrl+鼠标左键
下面就是spring-boot-starter-data-redis的基本依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.3.2.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>2.3.2.RELEASE</version>
<scope>compile</scope>
</dependency>
<!--Jedis 改成 lteeuce >
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
<version>5.3.2.RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>
我们仔细看一下这个依赖,发现没有Jedis这个链接工具,为什么?
原因:
SpringBoot2.x之后,原来的Jedis被替换成了lettuce
- Jedis:Jedis在实现上是直接连接的redis server,如果在多线程环境下是非线程安全的,这个时候只有使用连接池,为每个Jedis实例增加物理连接
- lettuce:Lettuce的连接是基于Netty的,连接实例(StatefulRedisConnection)可以在多个线程间并发访问,应为StatefulRedisConnection是线程安全的,所以一个连接实例(StatefulRedisConnection)就可以满足多线程环境下的并发访问,当然这个也是可伸缩的设计,一个连接实例不够的情况也可以按需增加连接实例
Redis自动配置类(源码)
- spring boot搜友的配置类都有一个自动配置类
- redis的自动配置类就是 RedisAutoConfiguration
- 自动配置类都会自动绑定一个配置文件
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package org.springframework.boot.autoconfigure.data.redis;
@Configuration(
proxyBeanMethods = false
)
@ConditionalOnClass({RedisOperations.class})
//RedisProperties 绑定的默认配置类
@EnableConfigurationProperties({RedisProperties.class})
@Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class})
public class RedisAutoConfiguration {
public RedisAutoConfiguration() {
}
@Bean
//ConditionalOnMissingBean 这个注解的疑是就是:如果这个bean不存在的话,下面的方法就生效,也就是我们可以自己声明的一个redisTemplate来替换下面默认的方法
@ConditionalOnMissingBean(
name = {"redisTemplate"}
)
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
//默认的redisTemplate 没有过多的设置,每一个redis对象都需要序列化
//两个泛型都是Objiect,使用的时候需要强转 <String, Object>
RedisTemplate<Object, Object> template = new RedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
@Bean
@ConditionalOnMissingBean //String是redis最常用的数据类型,所以单独封装了一个bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
默认配置文件(源码)
# redis 配置
spring.redis.host=127.0.1
spring.redis.port=6379
下面图片就是自动配置类的源码:
- 默认配置三个信息:database = 0、host = ‘localhsot’、port=6379
RedisTemplate使用
- RedisTemplate 也是操作redis的工具
- 其实你只要熟悉redis的命令、RedisTemplate的方法也是大致相同的
- opsFor[数据类型],例:RedisTemplate.opsForValue就是操作String数据类型的
下面测试:
@SpringBootTest
class RedisSpringbootApplicationTests {
@Autowired
private RedisTemplate redisTemplate;
@Test
void contextLoads() {
/**
* opsFor 就是操作某个数据类型
* opsForValue - String
* opsForSet - Set
* 等等其他也都是一样的
*/
//获取连接对象
RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();
connection.flushDb();
redisTemplate.opsForValue().set("myKey","redis");
System.out.println(redisTemplate.opsForValue().get("myKey"));
}
}
测试成功!
我们去redis上获取一下键值:
发现 key 前面有 一串乱码、获取key值也是为nil?
- 原因是:redis对象都需要序列化
RedisTemplate详细深入
下面的内容还有点多,我还是写在下一篇吧
Redis学习(六)—RedisTemplate序列化、自定义RedisTemplate,RedisTemplate工具.
本文地址:https://blog.csdn.net/weixin_43157543/article/details/107584095