SpringBoot整合
spring2.x之后,jedis被替换为lettuce 2.4.5又有了
jedis:采用的直连,多个线程操作的话,是不安全的,要避免这种情况就要使用jedis pool连接池!BIO模式
lettuce:采用netty,实例可以在多个线程中进行共享,不存在线程不安全的情况!可以减少线程数据,更像NIO模式
//RedisAutoConfiguration
//默认的RedisTemplate没有过多的设置,redis对象都是需要序列化的
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
public class RedisAutoConfiguration {
@Bean
@ConditionalOnMissingBean(name = "redisTemplate")//当这个bean不存在的时候,这个类就生效
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
@Bean
@ConditionalOnMissingBean
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置连接
spring.redis.host=127.0.0.1
spring.redis.port=6379
测试
@SpringBootTest
class Redis02ApplicationTests {
@Autowired
private RedisTemplate redisTemplate;
@Test
void contextLoads() {
//opsForHash 操作hash
//操作不同的数据类型,api和指令一样
//除了基本的操作,我们常用的方法可以直接redisTemplate来操作,例如事务
//基本的CRUD操作
//清空数据库和关闭连接时,需要获取connection对象来进行相应操作
// RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();
// connection.flushDb();
// connection.flushAll();
// connection.close();
redisTemplate.opsForValue().set("lkyyy","12345");
System.out.println(redisTemplate.opsForValue().get("lkyyy"));
}
}
没有序列化报错
org.springframework.data.redis.serializer.SerializationException: Cannot serialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to serialize object using DefaultSerializer; nested exception is java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type [com.lkyyy.pojo.User]
自定义
@Configuration
public class RedisConfig {
//编写我们自己的redisTemplate
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String,Object> template = new RedisTemplate<String,Object>();
template.setConnectionFactory(factory);
// Json序列化配置
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
// String 的序列化
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key采用string的序列化方式
template. setKeySerializer(stringRedisSerializer);
// hash的key也采用string的序列化方式
template . setHashKeySerializer(stringRedisSerializer);
// value序列化方式采用jackson
template . setValueSerializer(jackson2JsonRedisSerializer);
// hash的value序列化方式采用jackson
template. setHashValueSerializer(jackson2JsonRedisSerializer);
template. afterPropertiesSet();
return template;
}
}
可以编写RedisUtil来操作Redis;
理解redis的思想和每一种数据结构的用处和作用场景