当前位置: 首页 > 科技观察

SpringBoot如何快速集成Redis?

时间:2023-03-11 22:40:12 科技观察

SpringBoot如何快速集成Redis?没错,本文就教大家stackmanager,让大家少走弯路!添加依赖要使用像Redis这样的NoSQL数据库,你必须依赖像spring-data-redis这样的能力包,它在SpringBoot中是开箱即用的:importspring-boot-starter-data-redis:>groupId>org.springframework.bootspring-boot-starter-data-redisSpringBoot的基础知识就不介绍了,不熟悉的话,可以关注公众号Java技术栈,后台回复:开机,可以看我写的历史实战教程。主要包括以下四个依赖:spring-boot-dependenciesspring-boot-starterspring-data-redislettuce-core添加Redis连接配置Redis自动配置支持单机、集群、sentinel的配置,一起来看看在RedisPropertiesBar的参数类图:本文以单机为例。我们在application.yml配置文件中添加Redis连接配置:spring:redis:host:192.168.8.88port:6379password:redis2020database:1也可以在SpringCloudConfigServer配置中心中配置参数。Redis自动配置添加依赖和连接配置参数后,即可自动配置Redis。参考Redis的自动配置类:org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration源码:@Configuration(proxyBeanMethods=false)@ConditionalOnClass(RedisOperations.class)@EnableConfigurationProperties(RedisProperties.class)@Import({LettuceConnectionConfiguration.class,JedisConnectionConfiguration.class})publicclassRedisAutoConfiguration{...}通过查看源码,Redis内置了两个客户端的自动配置:1)Lettuce(默认):org.springframework.boot.autoconfigure.data。redis.LettuceConnectionConfiguration2)Jedis:为什么org.springframework.boot.autoconfigure.data.redis.JedisConnectionConfiguration默认是Lettuce,其实文章前面的四个依赖也可以看,请看默认依赖:自动配置提供了两个操作模板:1)RedisTemplatekey-value为Object对象,默认使用JDK的序列化器/反序列化器:org.springframework.data.redis.serializer.JdkSerializationRedisSerializer要使用这个序列化器,key和value都需要实现java.io.Serializable接口。2)StringRedisTemplatekey-value是String对象,默认字符串UTF-8格式的序列化器/反序列化器:org.springframework.data.redis.serializer.StringRedisSerializer上面提到了两个序列化器,还有两个值得学习的JSON序列化器,将在以下配置中使用。Jackson2JsonRedisSerializerGenericJackson2JsonRedisSerializer可以两种方式用于序列化和反序列化JSON数据。Jackson2JsonRedisSerializer效率高,但GenericJackson2JsonRedisSerializer更通用,不需要指定泛型类型。除了核心配置的自动配置,下面是Redis的核心配置,主要是自定义RedisTemplate来使用JSON序列化器。另外,几个数据类型的操作类都经过了Beanpooling的处理。@ConfigurationpublicclassRedisConfig{@BeanpublicRedisTemplateredisTemplate(RedisConnectionFactoryfactory){RedisTemplatetemplate=newRedisTemplate<>();template.setConnectionFactory(factory);StringRedisSerializerstringSerializer=newStringRedisSerializer();RedisSerializerjacksonSerializer=getJacksonSerializer();模板。setKeySerializer(stringSerializer);template.setValueSerializer(jacksonSerializer);template.setHashKeySerializer(stringSerializer);template.setHashValueSerializer(jacksonSerializer);template.setEnableTransactionSupport(true);template.afterPropertiesSet();returntemplate;}privateRedisSerializergetJacksonSerializer(){ObjectMapperom=newObjectMapper();om.setVisibility(PropertyAccessor.ALL,JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);returnnewGenericJackson2JsonRedisSerializer(om);}@BeanpublicHashOperationshashOperations(RedisTemplateredisTemplate){returnredisTemplate.opsForHash();}@BeanpublicValueOperationsvalueOperations(RedisTemplateredisTemplate){returnredisTemplate.opsForValue();}@BeanpublicListOperationslistOperations(RedisTemplateredisTemplate){returnredisTemplate.opsForList();}@BeanpublicSetOperationssetOperations(RedisTemplateredisTemplate){returnredisTemplate.opsForSet();}@BeanpublicZSetOperationszSetOperations(RedisTemplateredisTemplate){returnredisTemplate.opsForZSet();}}如果只想使用默认的JDK序列化器,那么RedisTemplate相关的配置是不需要缓存的读取缓存中的类对象。@GetMapping("/redis/set")publicStringset(@RequestParam("name")Stringname){Useruser=newUser();user.setId(RandomUtils.nextInt());user.setName(name);user.setBirthday(newDate());Listlist=newArrayList<>();list.add("sing");list.add("run");user.setInteresting(list);Mapmap=newHashMap<>();map.put("hasHouse","yes");map.put("hasCar","no");map.put("hasKid","no");user.setOthers(map);redisOptService.set(name,user,30000);UseruserValue=(User)redisOptService.get(name);returnuserValue.toString();}测试:http://localhost:8080/redis/set?name=zhangsan返回:User(id=62386235,name=zhangsan,birthday=TueJun2318:04:55CST2020,interesting=[sing,run],others={hasHouse=yes,hasKid=no,hasCar=no})Redis中的值:192.168.8.88:6379>getzhangsan["cn.javastack.springboot.redis.pojo.User",{"id":62386235,"name":"zhangsan","birthday":["java.util.Date",1592906695750],"interesting":["java.util.ArrayList",["sing","run"]],"others":["java.util.HashMap",{"hasHouse":"yes","hasKid":"no","hasCar":"no"}]}]"好了,SpringBoot对Redis的快速集成到此结束,下篇带来SpringBoot如何快速集成Redis分布式锁,关注公众号Java技术栈,第一时间推送,敬请期待……本文完整源码也会一起上传到Github与下一篇文章。欢迎大家Star关注学习https://github.com/javastacks/spring-boot-best-practice