资讯专栏INFORMATION COLUMN

集成 Spring data redis 笔记

张迁 / 3470人阅读

摘要:本文有部分代码是抄袭的。第二个坑需要指定对象的数据类型,不然反序列化报错。第三的编辑器非常不好用。上面的配置有个缺陷,就是只能指定数据类型去缓存到。其实还可以配置一个但我持久层是。查询分页结果时,会无法反序列化。搜了半天没解决方案。

本文有部分代码是抄袭的。

</>复制代码

  1. 1 :引入依赖
  2. org.springframework.data
  3. spring-data-redis
  4. ${spring-data-redis.version}
  5. org.apache.commons
  6. commons-pool2
  7. ${commons-pool2.version}
  8. biz.paluch.redis
  9. lettuce
  10. ${lettuce.version}

</>复制代码

  1. /**
  2. * 配置缓存
  3. */

@EnableCaching
public class CachingConfig extends CachingConfigurerSupport {

</>复制代码

  1. @Resource(name = "redisTemplate")
  2. private RedisTemplate redisTemplate;
  3. @Override
  4. @Bean(name = "redisCache")
  5. public CacheManager cacheManager() {
  6. ///需要更快启动cacheManager就开启这个
  7. // manager.afterPropertiesSet();
  8. // ConcurrentMapCacheManager manager=new ConcurrentMapCacheManager();
  9. RedisCacheManager manager = new RedisCacheManager(redisTemplate);
  10. return manager;
  11. }
  12. @Override
  13. @Bean(name = "redisKeyGen")
  14. public KeyGenerator keyGenerator() {
  15. return new KeyGenerator() {
  16. @Override
  17. public Object generate(Object target, Method method, Object... objects) {
  18. StringBuilder sb = new StringBuilder();
  19. sb.append(target.getClass().getName());
  20. sb.append(method.getName());
  21. for (Object obj : objects) {
  22. sb.append(obj.toString());
  23. }
  24. return sb.toString();
  25. }
  26. };
  27. }

}

配置redis

public class RedisConfig {

</>复制代码

  1. private static final Logger LOGGER = LoggerFactory.getLogger(RedisConfig.class);
  2. private String host = "localhost";
  3. private int port = 6379;
  4. private String password = "redis";
  5. private int database = 0;
  6. /**
  7. * 使用这个连接池,需要commons-pool2依赖
  8. * lettuce其实没有必要使用连接池 https://github.com/lettuce-io/lettuce-core/wiki/Connection-Pooling
  9. *
  10. * @return
  11. */
  12. @Bean(value = "lettucePool")
  13. public LettucePool lettucePool() {
  14. DefaultLettucePool pool = new DefaultLettucePool();
  15. pool.setDatabase(0);
  16. pool.setHostName("localhost");
  17. pool.setPort(6379);
  18. //调用这个方法,确保连接池被初始化
  19. pool.afterPropertiesSet();
  20. return pool;
  21. }
  22. /**
  23. * 设置 redis连接工厂,通过连接池的方式来初始化工厂
  24. *
  25. * @return
  26. */
  27. //@Lazy(value = false)
  28. @Bean(name = "redisConnectionFactory")
  29. @DependsOn(value = "lettucePool")
  30. public RedisConnectionFactory redisConnectionFactory() {
  31. //Linux使用这种方式初始化工厂
  32. //return new LettuceConnectionFactory(new RedisSocketConfiguration("/var/run/redis.sock"));
  33. LettuceConnectionFactory factory = new LettuceConnectionFactory(lettucePool());
  34. //如果不使用连接池初始化工厂,则需要调用这个方法
  35. //factory.afterPropertiesSet();
  36. return factory;
  37. }
  38. /**
  39. * 设置redis操作模板
  40. *
  41. * @param redisConnectionFactory
  42. * @return
  43. */
  44. @Bean(name = "redisTemplate")
  45. @DependsOn(value = "redisConnectionFactory")
  46. public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory,
  47. Jackson2JsonRedisSerializer jackson2JsonRedisSerializer,
  48. StringRedisSerializer stringRedisSerializer) {
  49. RedisTemplate template = new RedisTemplate<>();
  50. template.setConnectionFactory(redisConnectionFactory);
  51. //设置序列化方式
  52. template.setHashKeySerializer(jackson2JsonRedisSerializer);
  53. template.setHashValueSerializer(jackson2JsonRedisSerializer);
  54. template.setKeySerializer(jackson2JsonRedisSerializer);
  55. template.setValueSerializer(jackson2JsonRedisSerializer);
  56. template.setStringSerializer(stringRedisSerializer);
  57. return template;
  58. }

}

设置序列化

public class SerializerConfig {

</>复制代码

  1. /**
  2. * 配置 jackson mapper
  3. * @return
  4. */
  5. @Lazy(value = false)
  6. @Bean(name = "jacksonMapper")
  7. public ObjectMapper jacksonMapper(){
  8. ObjectMapper mapper=new ObjectMapper();
  9. //只针对非空的值进行序列化
  10. mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
  11. // 去掉各种@JsonSerialize注解的解析
  12. //mapper.configure(MapperFeature.USE_ANNOTATIONS, false);
  13. // 将类型序列化到属性json字符串中 有的文章说需要这个才能正确反序列化
  14. //mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
  15. // 对于找不到匹配属性的时候忽略报错
  16. mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
  17. // 不包含任何属性的bean也不报错
  18. mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
  19. return mapper;
  20. }
  21. /**
  22. * 关键
  23. * Jackson2JsonRedisSerializer 是泛型,需要指定类型
  24. * 这样才能正确反序列化,不然会抛出 java.util.LinkedHashMap cannot be cast YOUR OBJECT 异常
  25. * @return
  26. */
  27. @Lazy(value = false)
  28. @Bean(name = "jackson2JsonRedisSerializer")
  29. public Jackson2JsonRedisSerializer jackson2JsonRedisSerializer(){
  30. Jackson2JsonRedisSerializer jsonRedisSerializer=new Jackson2JsonRedisSerializer<>(Response.class);
  31. jsonRedisSerializer.setObjectMapper(jacksonMapper());
  32. return jsonRedisSerializer;
  33. }
  34. @Lazy(value =false)
  35. @Bean (name = "stringRedisSerializer")
  36. public StringRedisSerializer stringRedisSerializer(){
  37. return new StringRedisSerializer(StandardCharsets.UTF_8);
  38. }

}

最后在需要的地方开启注解缓存即可
@CacheConfig(cacheManager = "redisCache",cacheNames = {"bxe"})
@Cacheable

弄这个破玩意好几天,尤其是spring data redis还挑lettuce的版本,我把git的源码下载一遍自己编译都报错,最后才发现是版本问题。
第二个坑:RedisSerializer需要指定对象的数据类型,不然反序列化报错。
第三: segmentfault的编辑器非常不好用。

--------update
上面的配置有个缺陷,就是只能指定数据类型去缓存到redis。

其实还可以配置一个GenericJackson2JsonRedisSerializer

</>复制代码

  1. @Bean(name = "jsonRedisSerializer")
  2. public GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer(){
  3. GenericJackson2JsonRedisSerializer jsonRedisSerializer=new GenericJackson2JsonRedisSerializer(“@class);
  4. return jsonRedisSerializer;
  5. }
  6. 但我持久层是 Spring data JPA。
  7. 查询分页结果时,会无法反序列化。
  8. Could not read JSON: Cannot construct instance of `org.springframework.data.domain.PageImpl` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

搜了半天没解决方案。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/76108.html

相关文章

  • Spring笔记1——极简入门教程

    摘要:创建工程将框架代码包解压后放到工作目录。方便起见,本教程使用为例。添加创建一个,负责响应相关的业务请求。添加标注在中,对输入参数进行校验通常使用标注。在本教程,我们将实现的增和查的工作。创建用户用户名重启并提交创建请求。 环境准备 系统:MacOS 开发:IntelliJ IDEA 语言:Java8 其它:Mysql、Redis 脚手架代码 Spring提供了一个创建项目脚手架的官...

    ChristmasBoy 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<