org.springframework.boot spring-boot-starter-data-redis

2、在配置文件中添加redis的连接配置信息

spring: redis: #数据库索引 database: 0 host: 192.168.1.1 port: 6379 password: 123456

3、然后创建一个控制器

就这么简单,但是你会发现,存入redis是一堆乱七八糟的玩意。

@Autowired(required = false) public void setRedisTemplate(RedisTemplate redisTemplate) { RedisSerializer stringSerializer = new StringRedisSerializer(); redisTemplate.setKeySerializer(stringSerializer); redisTemplate.setValueSerializer(stringSerializer); redisTemplate.setHashKeySerializer(stringSerializer); redisTemplate.setHashValueSerializer(stringSerializer); this.redisTemplate = redisTemplate;

1、添加引用

<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.49</version> </dependency>

2、添加自定义序列化器,这里使用fastjson

package com.example.springbootredis; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializerFeature; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.SerializationException; import java.nio.charset.Charset; public class FastJsonRedisSerializer<T> implements RedisSerializer<T> { public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); private Class<T> clazz; public FastJsonRedisSerializer(Class<T> clazz) { super(); this.clazz = clazz; @Override public byte[] serialize(T t) throws SerializationException { if (null == t) { return new byte[0]; return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET); @Override public T deserialize(byte[] bytes) throws SerializationException { if (null == bytes || bytes.length <= 0) { return null; String str = new String(bytes, DEFAULT_CHARSET); return (T) JSON.parseObject(str, clazz);

3、添加RedisConfig配置

package com.example.springbootredis; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.data.redis.RedisProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisOperations; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.serializer.StringRedisSerializer; @Configuration @ConditionalOnClass(RedisOperations.class) @EnableConfigurationProperties(RedisProperties.class) public class RedisConfig { @Bean @ConditionalOnMissingBean(name = "redisTemplate") public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<Object, Object> template = new RedisTemplate<>(); //使用fastjson序列化 FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer(Object.class); // value值的序列化采用fastJsonRedisSerializer template.setValueSerializer(fastJsonRedisSerializer); template.setHashValueSerializer(fastJsonRedisSerializer); // key的序列化采用StringRedisSerializer template.setKeySerializer(new StringRedisSerializer()); template.setHashKeySerializer(new StringRedisSerializer()); template.setConnectionFactory(redisConnectionFactory); return template; @Bean @ConditionalOnMissingBean(StringRedisTemplate.class) public StringRedisTemplate stringRedisTemplate( RedisConnectionFactory redisConnectionFactory) { StringRedisTemplate template = new StringRedisTemplate(); template.setConnectionFactory(redisConnectionFactory); return template;

4、完成,然后运行,即可

另一种支持直接存取对象的方式,也支持序列化LocalDateTime类型。

private static final String STANDARD_PATTERN = "yyyy-MM-dd HH:mm:ss" ; @Bean @ConditionalOnMissingBean ( name = "redisTemplate" ) public RedisTemplate<String , Object> redisTemplate (RedisConnectionFactory redisConnectionFactory) { Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object. class ) ; // 加入支持 localDateTime JavaTimeModule timeModule = new JavaTimeModule() ; DateTimeFormatter dateTimeFormatter = DateTimeFormatter. ofPattern ( STANDARD_PATTERN ) ; timeModule.addSerializer(LocalDateTime. class, new LocalDateTimeSerializer(dateTimeFormatter)) ; timeModule.addDeserializer(LocalDateTime. class, new LocalDateTimeDeserializer(dateTimeFormatter)) ; ObjectMapper om = new ObjectMapper() ; // 下面这两行代码 , 在序列化时会带上属性类型 , 这样在获取数据的时候 , 可以直接用响应的类型获取 , 无需转换 om.setVisibility(PropertyAccessor. ALL , JsonAutoDetect .Visibility. ANY ) ; om.enableDefaultTyping(ObjectMapper.DefaultTyping. NON_FINAL ) ; om.registerModule(timeModule) ; jackson2JsonRedisSerializer.setObjectMapper(om) ; // 键的序列化方式,这样键可以不带双引号 RedisSerializer stringSerializer = new StringRedisSerializer() ; RedisTemplate<String , Object> template = new RedisTemplate<>() ; template.setConnectionFactory(redisConnectionFactory) ; template.setKeySerializer(stringSerializer) ; template.setValueSerializer(jackson2JsonRedisSerializer) ; template.setHashKeySerializer(stringSerializer) ; template.setHashValueSerializer(jackson2JsonRedisSerializer) ; template.afterPropertiesSet() ; return template ;

好,又踩了一个坑,搞了一下午,真特妹的,主从模式和cluster模式不一样,网上教程集群模式都是cluster的,不是主从的。所以配置文件中添加cluster节点无用,会报错,说初始化集群模式失败。需要添加一个哨兵配置,下面这样配置才行。还有哨兵的名字。切记切记切记....

spring: redis: #数据库索引 database: 0 host: 192.168.1.1 port: 6379 password: 123456 sentinel: master: master nodes: 192.168.1.2:26379

配置cluster模式会出现的错误是:

io.lettuce.core.RedisException: Cannot retrieve initial cluster partitions from initial URIs [RedisURI [host='192.168.1.1', port=6379]]

集群模式是分片的,详细概念就不叙述了。

参考地址:

https://blog.csdn.net/fanpeizhong/article/details/79998164

https://blog.csdn.net/qq_21046665/article/details/79692390

展开阅读全文