依赖引入 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <dependency > <groupId > org.springframework.boot</groupId > <artifactId > spring-boot-starter-data-redis</artifactId > </dependency > <dependency > <groupId > org.apache.commons</groupId > <artifactId > commons-pool2</artifactId > <version > 2.4.2</version > </dependency > <dependency > <groupId > com.alibaba</groupId > <artifactId > fastjson</artifactId > <version > 1.2.40</version > </dependency >
配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 # REDIS (RedisProperties) # Redis数据库索引(默认为0 ) spring.redis.database=0 # Redis服务器地址 spring.redis.host=47.97 .173.227 # Redis服务器连接端口 spring.redis.port=6379 # Redis服务器连接密码(默认为空) spring.redis.password=asdf12331aafjdahj1312jhj131+_111ghghgh # 连接池最大连接数(使用负值表示没有限制) spring.redis.jedis.pool.max -active=8 # 连接池最大阻塞等待时间(使用负值表示没有限制) spring.redis.jedis.pool.max -wait=-1 ms # 连接池中的最大空闲连接 spring.redis.jedis.pool.max -idle=8 # 连接池中的最小空闲连接 spring.redis.jedis.pool.min -idle=0 # 连接超时时间(毫秒) spring.redis.timeout=3000 ms
序列化问题 data-redis在进行存储时,key和value默认使用了基于JDK的序列化方式(JdkSerializationRedisSerializer),在使用连接工具查看时看到的都是编码后的信息,不方便查看,所以需要更改默认的序列化方式。此处对key值的序列化使用自定义的String序列化器(data-redis也提供了一个基于String的序列化器,但是该序列化器的泛型是String类型的,不能传入其他类型的值,所以基于官方提供的String序列化器再重写一个泛型为Object的序列化器),对value使用基于FastJson的序列化器(FastJson也提供了一个序列化器,可以使用该序列化器,也可以仿照该序列化器自定义一个序列化器)
自定义String序列化器 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 public class StringRedisSerializer implements RedisSerializer <Object> { private final Charset charset; private final String target = "\"" ; private final String replacement = "" ; public StringRedisSerializer () { this (StandardCharsets.UTF_8); } public StringRedisSerializer (Charset charset) { Assert.notNull(charset, "Charset must not be null!" ); this .charset = charset; } @Override public String deserialize (@Nullable byte [] bytes) { return (bytes == null ? null : new String (bytes, charset)); } @Override public byte [] serialize(@Nullable Object o) throws SerializationException { String string = JSON.toJSONString(o); if (StringUtils.isEmpty(string)) { return null ; } string = string.replace(target, replacement); return string.getBytes(charset); } }
自定义FastJSON序列化器 我这里用了官方提供的FastJSON序列化器,如果想自定义的话,可以参考以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 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 (t == null ) { return new byte [0 ]; } return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET); } @Override public T deserialize (byte [] bytes) throws SerializationException { if (bytes == null || bytes.length <= 0 ) { return null ; } String str = new String (bytes, DEFAULT_CHARSET); return (T) JSON.parseObject(str, clazz); } }
指定序列化器 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 @Configuration @ConditionalOnClass(RedisOperations.class) @EnableConfigurationProperties(RedisProperties.class) @EnableCaching public class RedisConfig extends CachingConfigurerSupport { @Bean @ConditionalOnMissingBean(name = "redisTemplate") public RedisTemplate<Object, Object> redisTemplate (RedisConnectionFactory redisConnectionFactory) { RedisTemplate<Object, Object> redisTemplate = new RedisTemplate <>(); FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer (Object.class); redisTemplate.setValueSerializer(fastJsonRedisSerializer); redisTemplate.setHashValueSerializer(fastJsonRedisSerializer); redisTemplate.setKeySerializer(new StringRedisSerializer ()); redisTemplate.setHashKeySerializer(new StringRedisSerializer ()); redisTemplate.setConnectionFactory(redisConnectionFactory); redisTemplate.afterPropertiesSet(); return redisTemplate; } }