根据b站UP主狂神说Redis课程所写的个人学习笔记
视频地址:https://www.bilibili.com/video/BV1S54y1R7SB
springboot操作数据:spring-data jpa jdbc mongodb redis
springdata也是和springboot齐名的项目
新建一个springboot项目,在nosql分类中勾选redis
在springboot2.x之后,原来使用的jedis被替换为了lettuce
jedis:采用的直连,多个线程操作是不安全的,如果想要避免不安全,使用jedis pool连接池,更像BIO模式
lettuce:采用netty,实例可以在多个线程中共享,不存在线程不安全的情况,可以减少线程数量,更像NIO模式
源码分析:
@Bean
@ConditionalOnMissingBean(
name = {"redisTemplate"}//可以自定义一个redisTemplate来替换默认
)
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
//默认的redistemplate 没有过多的设置,redis对象都是需要序列化的
//两个泛型都是object类型,需要强制转换<String,object>
RedisTemplate<Object, Object> template = new RedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
@Bean
@ConditionalOnMissingBean//操作string类型的bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
整合测试:
1.导入依赖
2.连接配置
#在application.properties配置redis
spring.redis.host=127.0.0.1 spring.redis.port=6379
3.测试
class Redis02SpringbootApplicationTests {
@Autowired
private RedisTemplate redisTemplate;
@Test
void contextLoads() {
//redisTemplate 操作不同数据类型
//opsForValue 字符串操作
//opsForList 列表操作
//opsForSet 集合操作
//....
//除了基本操作,我们常用的方法都可以直接通过redisTemplate操作,比如事务和基本的curd
//获取连接对象
// RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();
// connection.flushDb();
redisTemplate.opsForValue().set("mykey","lin");
System.out.println(redisTemplate.opsForValue().get("mykey"));
}
}
默认的序列化方式是jdk序列化,我们可能使用json来序列化
没有序列化则会报错
public class RedisConfig {
//自己定义一个rediscomplate
@Bean
@SuppressWarnings("all")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
Jackson2JsonRedisSerializer objectJackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_CONCRETE_AND_ARRAYS);
objectJackson2JsonRedisSerializer.setObjectMapper(om);
//String 的序列化
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
//配置具体序列化方式 key用string value用json
template.setKeySerializer(stringRedisSerializer);
template.setHashKeySerializer(stringRedisSerializer);
template.setValueSerializer(objectJackson2JsonRedisSerializer);
template.setHashValueSerializer(objectJackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
测试成功