SpringBoot-整合Redis
1 - Spring Boot整合Redis
SpringBoot 操作数据:spring-data jpa jdbc mongodb redis
SpringData 也是和 SpringBoot齐名的项目
jedis:采用的直连,多个线程操作不安全,若要避免,则要使用jedis pool连接池,更像Bio模式
lettuce:采用netty,可以在多个线程中共享,不存在线程不安全的情况,可以减少线程数量,更像Nio模式
1、源码分析
// RedisAutoConfiguration.java @Configuration(proxyBeanMethods = false) @ConditionalOnClass(RedisOperations.class) @EnableConfigurationProperties(RedisProperties.class) // RedisAutoConfiguration配置类绑定着RedisProperties类 @Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class }) public class RedisAutoConfiguration {
// RedisProperties.java @ConfigurationProperties(prefix = "spring.redis") // RedisProperties类又绑定着全局配置文件 public class RedisProperties {
RedisAutoConfiguration.java 自动配置类绑定着RedisProperties.java(封装配置文件中相关属性类,这个类又绑定着全局配置文件,当我们在全局配置中添加一些属性时,
就是改变了这个配置文件类的属性),给容器添加Redis组件的时候,从这个RedisProperties类获取相关的属性,生成Redis组件,添加到SrpingBoot容器中。
@Bean @ConditionalOnMissingBean(name = "redisTemplate") // 这个注解的使用告诉我们,"redisTemplate" 不存在时下面方法才生效,此时我们可以自定义一个redisTemplate替换默认的 public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException { /* 默认的RedisTemplate没有过多的配置,Redis对象都是需要序列化 两个泛型都是Object类型的,后面我们使用需要强转<String,String> */ 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; }
2、配置步骤
1.导入maven依赖(也可以构建项目时勾选对应的内容)
<!--操作redis--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
2.在全局配置文件中配置Redis
# 配置Redis spring: redis: host: localhost port: '6379'
3.测试
@SpringBootTest class Day07ApplicationTests { @Autowired private RedisTemplate<Object,Object> redisTemplate; @Test void contextLoads() { /*opsForValue操作string opsForList list opsForHyperLogLog HyperLogLog 除了基本的操作,常用的方法都可以直接通过RedisTemplate操作,比如事务 清空数据库通过connection操作 RedisConnection connection = redisTemplate.getConnectionFactory().getConnection(); connection.flushDb();*/ redisTemplate.opsForValue().set("myKey","hello world"); Object myKey = redisTemplate.opsForValue().get("myKey"); System.out.println(myKey); } }
4、序列化配置,默认为JdkSerializationRedisSerializer
。自定义序列化配置网上查询。
@SuppressWarnings("rawtypes") private @Nullable RedisSerializer keySerializer = null; @SuppressWarnings("rawtypes") private @Nullable RedisSerializer valueSerializer = null; @SuppressWarnings("rawtypes") private @Nullable RedisSerializer hashKeySerializer = null; @SuppressWarnings("rawtypes") private @Nullable RedisSerializer hashValueSerializer = null;
学习没有捷径,需要日积月累的积淀及对技术的热爱。