RedisTemplate

lettuce

  • pom.xml ```xml org.springframework.boot spring-boot-starter-data-redis
org.apache.commons commons-pool2 - application.ymlyaml spring: redis: host: 127.0.0.1 port: 6379 # Redis 服务器密码,默认为空。生产中,一定要设置 Redis 密码! password: # Redis 数据库号,默认为 0 。 database: 0 # Redis 连接超时时间,默认单位:毫秒。 timeout: 1S # 可以用 lettuce/jedis,如果要用后者需要排除lettuce依赖 lettuce: pool: # 连接池最大连接数,默认为 8 。使用负数表示没有限制。 max-active: 16 # 默认连接数最小空闲的连接数,默认为 8 。使用负数表示没有限制。 max-idle: 10 # 默认连接池最小空闲的连接数,默认为 0 。允许设置 0 和 正数。 min-idle: 1 # 连接池最大阻塞等待时间,单位:毫秒。默认为 -1 ,表示不限制。 max-wait: 1000 --- <a name="WptXc"></a> ## jedis - pom.xmlxml org.springframework.boot spring-boot-starter-data-redis io.lettuce lettuce-core

redis.clients jedis

  1. - application.yml
  2. ```yaml
  3. spring:
  4. # 对应 RedisProperties 类
  5. redis:
  6. host: 127.0.0.1
  7. port: 6379
  8. password: # Redis 服务器密码,默认为空。生产中,一定要设置 Redis 密码!
  9. database: 0 # Redis 数据库号,默认为 0 。
  10. timeout: 1000 # Redis 连接超时时间,单位:毫秒。
  11. # 对应 RedisProperties.Jedis 内部类
  12. jedis:
  13. pool:
  14. max-active: 16 # 连接池最大连接数,默认为 8 。使用负数表示没有限制。
  15. max-idle: 10 # 默认连接数最小空闲的连接数,默认为 8 。使用负数表示没有限制。
  16. min-idle: 1 # 默认连接池最小空闲的连接数,默认为 0 。允许设置 0 和 正数。
  17. max-wait: 1000 # 连接池最大阻塞等待时间,单位:毫秒。默认为 -1 ,表示不限制。

整体配置

  • 先补充个 StringRedisTemplate 和一个 String 的序列化器 ```java @Configuration public class RedisConfig {

    /* Redis连接工厂 / @Autowired private RedisConnectionFactory redisConnectionFactory;

  1. /**
  2. * <h2>string 模板</h2>
  3. *
  4. * @return {@link org.springframework.data.redis.core.StringRedisTemplate}
  5. */
  6. @Bean
  7. public StringRedisTemplate stringRedisTemplate() {
  8. StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
  9. stringRedisTemplate.setConnectionFactory(redisConnectionFactory);
  10. return stringRedisTemplate;
  11. }
  12. /**
  13. * <h2> String 序列化器 </h2>
  14. *
  15. * @return {@link org.springframework.data.redis.core.StringRedisTemplate}
  16. */
  17. @Bean
  18. public StringRedisSerializer stringRedisSerializer() {
  19. return new StringRedisSerializer();
  20. }

}

  1. - 然后补充个生成模板的私有方法
  2. ```java
  3. /**
  4. * 根据条件创建一个 RedisTemplate
  5. *
  6. * @param stringRedisSerializer string 序列化器
  7. * @param redisSerializer json 序列化器
  8. * @param isEnableTransactionSupport 是否开启事务
  9. * @return {@link org.springframework.data.redis.core.RedisTemplate}
  10. */
  11. private RedisTemplate<String, Object> _createRedisTemplate(StringRedisSerializer stringRedisSerializer,
  12. RedisSerializer redisSerializer,
  13. boolean... isEnableTransactionSupport) {
  14. RedisTemplate<String, Object> template = new RedisTemplate<>();
  15. template.setConnectionFactory(redisConnectionFactory);
  16. ////////////////////////////////////////////////////
  17. // 默认使用的是 JdkSerializationRedisSerializer
  18. ////////////////////////////////////////////////////
  19. // key采用String的序列化方式
  20. template.setKeySerializer(stringRedisSerializer);
  21. // hash的key也采用String的序列化方式
  22. template.setHashKeySerializer(stringRedisSerializer);
  23. // value序列化方式采用 redisSerializer
  24. template.setValueSerializer(redisSerializer);
  25. // hash的value序列化方式采用 redisSerializer
  26. template.setHashValueSerializer(redisSerializer);
  27. // 是否开启事务
  28. if (isEnableTransactionSupport.length == 0) {
  29. isEnableTransactionSupport = new boolean[]{false};
  30. }
  31. template.setEnableTransactionSupport(isEnableTransactionSupport[0]);
  32. template.afterPropertiesSet();
  33. return template;
  34. }

模板

jackson 模板

  • 定义下 ObjectMapperjackson 序列化器
  • 然后生成 jacksonredisTemplate
  1. /**
  2. * <h2> 默认用的 jackson 序列化模板 </h2>
  3. *
  4. * @return {@link org.springframework.data.redis.core.RedisTemplate}
  5. */
  6. @Bean
  7. public RedisTemplate<String, Object> jacksonRedisTemplate() {
  8. return _createRedisTemplate(stringRedisSerializer(), jackson2JsonRedisSerializer());
  9. }
  10. /**
  11. * <h2>jackson 序列化用的 objectMapper </h2>
  12. *
  13. * @return {@link com.fasterxml.jackson.databind.ObjectMapper}
  14. */
  15. public ObjectMapper objectMapper() {
  16. ObjectMapper objectMapper = new ObjectMapper();
  17. // 支持任意对象的 json 序列化和反序列化
  18. objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
  19. // 过期,源码可知使用 activateDefaultTyping(getPolymorphicTypeValidator(), applicability, includeAs) 代替
  20. // objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
  21. objectMapper.activateDefaultTyping(objectMapper.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.WRAPPER_ARRAY);
  22. // 属性全包括
  23. objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
  24. // 取消默认转换为timestamp形式
  25. objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
  26. // 忽略空 bean 转 json 的错误
  27. objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
  28. // 所有的日期格式都统一为 yyyy-MM-dd HH:mm:ss
  29. objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
  30. // 忽略在 json 字符串中存在,对应 bean 不存在字段的情况,避免错误
  31. objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
  32. return objectMapper;
  33. }
  34. /**
  35. * <h2> jackson redis 序列化器 </h2>
  36. *
  37. * @return {@link org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer}
  38. */
  39. @Bean
  40. public Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer() {
  41. Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
  42. jackson2JsonRedisSerializer.setObjectMapper(objectMapper());
  43. return jackson2JsonRedisSerializer;
  44. }

fastJson 模板

  • 定义下 fastJson 的序列化器 ```java /**

    • 使用 fastjson 作为 redis序列化器 *
    • @param / public class FastJson2JsonRedisSerializer implements RedisSerializer { /*

      • 字符集 */ private final Charset charset;

      /**

      • 指定class */ private Class tClass;

      static {

      1. //如果遇到反序列化autoType is not support错误,请添加并修改一下包名到bean文件路径
      2. // ParserConfig.getGlobalInstance().addAccept("com.xxxxx.xxx");
      3. // 或者直接全局开启
      4. ParserConfig.getGlobalInstance().setAutoTypeSupport(true);

      }

  1. /**
  2. * 默认字符集为 UTF-8
  3. */
  4. public FastJson2JsonRedisSerializer() {
  5. this(StandardCharsets.UTF_8);
  6. }
  7. public FastJson2JsonRedisSerializer(Charset charset) {
  8. Assert.notNull(charset, "charset must be not null! ");
  9. this.charset = charset;
  10. }
  11. /**
  12. * <h2> 序列化设置 </h2>
  13. *
  14. * @param object 被序列化的内容
  15. * @return byte[]
  16. * @throws SerializationException
  17. */
  18. @Override
  19. public byte[] serialize(T object) throws SerializationException {
  20. if (object == null) {
  21. return new byte[0];
  22. }
  23. if (object instanceof String) {
  24. return object.toString().getBytes(charset);
  25. } else {
  26. // 使用 fastJson 做序列化
  27. return JSON.toJSONString(object, SerializerFeature.WriteClassName).getBytes(charset);
  28. }
  29. }
  30. /**
  31. * <h2> 反序列化设置 </h2>
  32. *
  33. * @param bytes 反序列化数组
  34. * @return {@link T}
  35. * @throws SerializationException
  36. */
  37. @Override
  38. public T deserialize(byte[] bytes) throws SerializationException {
  39. if (bytes == null || bytes.length == 0) {
  40. return null;
  41. }
  42. String str = new String(bytes, charset);
  43. return JSON.parseObject(str, tClass);
  44. }

}

  1. - 生成 `fastJson` `redisTemplate`
  2. ```java
  3. /**
  4. * <h2> fastJson redis 序列化器 </h2>
  5. *
  6. * @return {@link com.example.redisdemo.config.FastJson2JsonRedisSerializer}
  7. */
  8. @Bean
  9. public FastJson2JsonRedisSerializer<Object> fastJson2JsonRedisSerializer() {
  10. return new FastJson2JsonRedisSerializer<>();
  11. }
  12. /**
  13. * <h2>用 fastJson 序列化的 redisTemplate</h2>
  14. *
  15. * @return {@link org.springframework.data.redis.core.RedisTemplate}
  16. */
  17. @Bean
  18. public RedisTemplate<String, Object> fastJsonRedisTemplate()
  19. {
  20. return _createRedisTemplate(stringRedisSerializer(), fastJson2JsonRedisSerializer());
  21. }

如何使用

  • 注入的时候指定下 bean 名称即可

注意点

LocalDateTime

  • 需要加上序列化、反序列化器

    1. @JsonDeserialize(using = LocalDateTimeDeserializer.class)
    2. @JsonSerialize(using = LocalDateTimeSerializer.class)
    3. private LocalDateTime localDateTime;
  • joda-time 应该也差不多吧


Jedis

image.png