redis 中 serializer 的坑

本贴最后更新于 2154 天前,其中的信息可能已经时过境迁

问题描述

在项目中对方法使用了 @Cacheable 注解,然后在其他地方使用这个方法获取值的时候,获取不到。
伪代码如下:

@Cacheable(value = "demo",cacheManager = "fiveManager")
@Override
public Map<Long, Long> getById(Long id){
}

原因分析

找到代码中,redis 的配置,发现如下代码:

@Bean
public RedisTemplate<Serializable, Serializable> redisTemplate(RedisConnectionFactory factory) {
  RedisTemplate template = new RedisTemplate();
  template.setConnectionFactory(factory);
  GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
  template.setDefaultSerializer(jackson2JsonRedisSerializer);
  StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
  template.setKeySerializer(stringRedisSerializer);
  template.setHashKeySerializer(stringRedisSerializer);
  template.afterPropertiesSet();
  return template;
}

主要是 template.setHashKeySerializer(stringRedisSerializer); 这行代码,他设置了 Map 的 key 为字符串类型,就是你存储在 redis 中 map 的 key 为字符串。在使用的时候,因为 key 的类型不一致,导致获取不到数据。

问题解决

1、修改需要缓存的方法返回值

@Cacheable(value = "demo",cacheManager = "fiveManager")
@Override
public Map<String, Long> getById(Long id){
}

2、修改 redis 的 Serializer 类型

这个可能会有风险,会影响已有代码

反思

主要原因还是对系统不熟悉,因为这块不是本人配置,所有才会出现这个问题。还是需要对系统多了解。

  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3453 回帖 • 203 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖
  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    286 引用 • 248 回帖 • 62 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
chaigx
欢迎关注我的公众号:程序之声。有些文章没办法同步过来,访问个人博客:http://www.chaiguanxin.com 杭州