在工作中,我们用到分布式缓存的时候,第一选择就是Redis,今天介绍一下SpringBoot如何集成Redis的,分别使用Jedis和Spring-data-Redis两种方式。
一、使用Jedis方式集成
1、增加依赖
<!--spring-boot-starter-web不是必须的,这里是为了测试--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId></dependency><dependency><!--fastjson不是必须的,这里是为了测试--><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.73</version></dependency>
2、配置项
redis.host=localhostredis.maxTotal=5redis.maxIdle=5redis.testOnBorrow=true#以下方式也可以,SpringBoot同样能将其解析注入到JedisPoolConfig中#redis.max-total=3#redis.max-idle=3#redis.test-on-borrow=true
3、配置连接池
/***@author公-众-号:程序员阿牛*由于Jedis实例本身不非线程安全的,因此我们用JedisPool*/@ConfigurationpublicclassCommonConfig{@Bean@ConfigurationProperties("redis")publicJedisPoolConfigjedisPoolConfig(){returnnewJedisPoolConfig();}@Bean(destroyMethod="close")publicJedisPooljedisPool(@Value("${redis.host}")Stringhost){returnnewJedisPool(jedisPoolConfig(),host);}}
4、测试
/***@author公-众-号:程序员阿牛*/@RestControllerpublicclassJedisController{@AutowiredprivateJedisPooljedisPool;@RequestMapping("getUser")publicStringgetUserFromRedis(){UserInfouserInfo=newUserInfo();userInfo.setUserId("A0001");userInfo.setUserName("张三丰");userInfo.setAddress("武当山");jedisPool.getResource().set("userInfo",JSON.toJSONString(userInfo));UserInfouserInfo1=JSON.parseObject(jedisPool.getResource().get("userInfo"),UserInfo.class);returnuserInfo1.toString();}}
运行结果如下:\
我们可以自己包装一个RedisClient,来简化我们的操作
使用spring-data-redis
1、引入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
2、配置项
在application.properties中增加配置
spring.redis.host=localhostspring.redis.port=6379
3、使用
/***@author公-众-号:程序员阿牛*/@RestControllerpublicclassRedisController{@AutowiredprivateRedisTemplateredisTemplate;@RequestMapping("getUser2")publicStringgetUserFromRedis(){UserInfouserInfo=newUserInfo();userInfo.setUserId("A0001");userInfo.setUserName("张三丰");userInfo.setAddress("武当山");redisTemplate.opsForValue().set("userInfo",userInfo);UserInfouserInfo1=(UserInfo)redisTemplate.opsForValue().get("userInfo");returnuserInfo1.toString();}}
是的,你只需要引入依赖、加入配置就可以使用Redis了,不要高兴的太早,这里面会有一些坑
4、可能会遇到的坑
使用工具查看我们刚才set的内容,发现key前面多了一串字符,value也是不可见的
原因
使用springdataredis,默认情况下是使用org.springframework.data.redis.serializer.JdkSerializationRedisSerializer这个类来做序列化\ 具体我们看一下RedisTemplate 代码如何实现的
/***在初始化的时候,默认的序列化类是JdkSerializationRedisSerializer*/publicvoidafterPropertiesSet(){super.afterPropertiesSet();booleandefaultUsed=false;if(this.defaultSerializer==null){this.defaultSerializer=newJdkSerializationRedisSerializer(this.classLoader!=null?this.classLoader:this.getClass().getClassLoader());}...省略无关代码}
如何解决
很简单,自己定义RedisTemplate并指定序列化类即可
/***@author公-众-号:程序员阿牛*/@ConfigurationpublicclassRedisConfig{@BeanpublicRedisTemplate<String,Object>redisTemplate(RedisConnectionFactoryconnectionFactory){RedisTemplate<String,Object>template=newRedisTemplate<>();template.setConnectionFactory(connectionFactory);template.setValueSerializer(jackson2JsonRedisSerializer());//使用StringRedisSerializer来序列化和反序列化redis的key值template.setKeySerializer(newStringRedisSerializer());template.setHashKeySerializer(newStringRedisSerializer());template.setHashValueSerializer(jackson2JsonRedisSerializer());template.afterPropertiesSet();returntemplate;}@BeanpublicRedisSerializer<Object>jackson2JsonRedisSerializer(){//使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值Jackson2JsonRedisSerializerserializer=newJackson2JsonRedisSerializer(Object.class);ObjectMappermapper=newObjectMapper();mapper.setVisibility(PropertyAccessor.ALL,JsonAutoDetect.Visibility.ANY);mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);serializer.setObjectMapper(mapper);returnserializer;}}
查看运行结果:\
哨兵和集群
只需要改一下配置项即可
#哨兵spring.redis.sentinel.master=mymasterspring.redis.sentinel.nodes=127.0.0.1:26379,127.0.0.1:26380,127.0.0.1:26381#集群spring.redis.cluster.max-redirects=100spring.redis.cluster.nodes=127.0.0.1:6379,127.0.0.1:6380,127.0.0.1:6381,127.0.0.1:6382,127.0.0.1:6383,127.0.0.1:6384
总结: 这里只是简单的介绍一下如何集成,希望对大家有所帮助。