根据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; }
测试成功