首页>>后端>>Spring->Spring系列之Redis的两种集成方式

Spring系列之Redis的两种集成方式

时间:2023-11-30 本站 点击:0

在工作中,我们用到分布式缓存的时候,第一选择就是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

总结: 这里只是简单的介绍一下如何集成,希望对大家有所帮助。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/Spring/2613.html