现象:

  1、在A方法中根据key查询一个list,可以获取到相应的值

  2、在B方法中同样调用此方法,传入相同的key,查询不到值,为null,报空指针异常

起初我也一脸懵逼,到现在虽然解决了,还是不知道根本原因

分析:

  1、key肯定是相同的,redis也有该key,  A能查出,B查不出。那就肯定是哪里不一样。

  2、后来分析有可能是在查redis的时候,redis内部存在不同。

  3、这个时候就觉得是序列化的问题

  4、查看redis连接配置

@Autowired
private RedisConfigProperties redis;
@Bean
public RedisSerializer fastJson2JsonRedisSerializer() { ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
return new FastJson2JsonRedisSerializer<Object>(Object.class);
}
@Bean
public RedisConnectionFactory redisConnectionFactory() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
//最大空闲接连
jedisPoolConfig.setMaxIdle(redis.getMaxIdle());
//最小空闲连接
jedisPoolConfig.setMinIdle(redis.getMinIdle());
//连接池最大阻塞等待时间
jedisPoolConfig.setMaxWaitMillis(redis.getMaxWait());
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
//主机地址
jedisConnectionFactory.setHostName(redis.getHost())
//端口
jedisConnectionFactory.setPort(redis.getPort());
//密码
jedisConnectionFactory.setPassword(redis.getPassword());
//索引
jedisConnectionFactory.setDatabase(redis.getDatabase());
//超时时间
jedisConnectionFactory.setTimeout(redis.getTimeOut());
jedisConnectionFactory.setUsePool(true);
jedisConnectionFactory.setPoolConfig(jedisPoolConfig);
return jedisConnectionFactory;
}
@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory, RedisSerializer fastJson2JsonRedisSerializer) {
StringRedisTemplate redisTemplate = new StringRedisTemplate(factory); redisTemplate.setConnectionFactory(redisConnectionFactory());
//redis 开启事务
redisTemplate.setEnableTransactionSupport(true);
//hash 使用jdk 的序列化
redisTemplate.setHashValueSerializer(fastJson2JsonRedisSerializer);
//StringRedisSerializer key 序列化
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
//keySerializer 对key的默认序列化器。默认值是StringSerializer
redisTemplate.setKeySerializer(new StringRedisSerializer());
// valueSerializer
redisTemplate.setValueSerializer(fastJson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}

  5、标黄部分,使用过各种序列化工具,都失败。

  6、突然突发奇想,会不会是redis事务的问题,然后  redisTemplate.setEnableTransactionSupport(true); 将事务关闭,莫名其妙就可以了。

  7、有哪位知道根本原因,请留言告知,万分感谢

  8、最后的配置如下

  

@Bean
public RedisSerializer fastJsonRedisSerializer(){
ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
return new FastJsonRedisSerializer<Object>(Object.class);
}
@Bean
public RedisConnectionFactory redisConnectionFactory() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
//最大空闲接连
jedisPoolConfig.setMaxIdle(redis.getMaxIdle());
//最小空闲连接
jedisPoolConfig.setMinIdle(redis.getMinIdle());
//连接池最大阻塞等待时间
jedisPoolConfig.setMaxWaitMillis(redis.getMaxWait());
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
//主机地址
jedisConnectionFactory.setHostName(redis.getHost());
//端口
jedisConnectionFactory.setPort(redis.getPort());
//密码
jedisConnectionFactory.setPassword(redis.getPassword());
//索引
jedisConnectionFactory.setDatabase(redis.getDatabase());
//超时时间
jedisConnectionFactory.setTimeout(redis.getTimeOut());
jedisConnectionFactory.setUsePool(true);
jedisConnectionFactory.setPoolConfig(jedisPoolConfig);
return jedisConnectionFactory;
}
 @Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory,RedisSerializer fastJsonRedisSerializer) {
StringRedisTemplate redisTemplate = new StringRedisTemplate(factory);
redisTemplate.setConnectionFactory(redisConnectionFactory());
//redis 开启事务
// redisTemplate.setEnableTransactionSupport(true); //hash 使用jdk 的序列化
// Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
// ObjectMapper om = new ObjectMapper();
// om.setVisibility( PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
// om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
// jackson2JsonRedisSerializer.setObjectMapper(om);
redisTemplate.setHashValueSerializer(fastJsonRedisSerializer);/*new JdkSerializationRedisSerializer()*/
//StringRedisSerializer key 序列化//一般可以不做设置
//redisTemplate.setHashKeySerializer(new StringRedisSerializer());
//keySerializer 对key的默认序列化器。默认值是StringSerializer
//redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(fastJsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}

爬坑系列----Redis查询key报空指针异常,而redis中确实存在该key的更多相关文章

  1. 【爬坑系列】之kubernetes环境搭建:二进制安装与镜像安装

    准备: 网上教如何编译与安装kubernetes的教程很多,需要提前准备的也很多,比如关闭selinux,防火墙啦....但有一点一定要注意,编译kubernetes源码时要求有2G内存,这个可是实打 ...

  2. 【爬坑系列】之vxlan网络实现

    linux 内核从3.7之后就内部集成了vxlan功能,所以可以使用linux内核提供的vxlan功能,经过配置创建vxlan网络. 而从Docker自Docker Engine 1.9之后,就自带o ...

  3. 【爬坑系列】之解读kubernetes的认证原理&实践

    对于访问kube-apiserver模块的请求来说,如果是使用http协议,则会顺利进入模块内部得到自己想要的:但是如果是用的是https,则能否进入模块内部获得想要的资源,他会首先要进行https自 ...

  4. 【爬坑系列】之docker的overlay网络配置(未完,待续)

    理论知识储备: 想了解vxlan网络的知识:https://www.cnblogs.com/shuiguizi/p/10923841.html 想了解docker网络的原理知识:https://www ...

  5. Python踩坑系列之安装pycrypto报错:“Microsoft Visual C++14.0 is required”问题。

    由于要使用Python3实现des3加密要使用pycrypto模块,所以使用pip install pycrypto 来安装,然后就常规性掉坑.安装报错“Microsoft Visual C++14. ...

  6. ssh登录,爬坑系列

    最近在实验室弄ssh登录,结果被虐了,要注意以下: 1.主机名不能包括   -     _    !  等非法字符. 2.如果hadoop格式化时,报:“SHUTDOWN_MSG: Shutting ...

  7. SpringBoot爬坑系列

    1.日志篇 现象 由于日志配置采用原来SpringMVC项目中的log4j.properties 文件,日志采用springboot自带的jar包会出现打印不出日志的情况. 解决 引入原日志包 < ...

  8. 【Redis】【报错】redis.exceptions.ResponseError: DENIED Redis is running in protected mode

    (一)报错前提 写flask 项目的时候,因为连接了私有云中的redis地址指定了IP host,启动项目的时候报错 (二)解决方法 首先要切换到root用户 root@:/etc/redis# pw ...

  9. wx:key报错does not look like a valid key name

    把花括号去掉就行了,  现在改版了,  要注意了     wx:key="index"  

随机推荐

  1. PHP算法学习(1) 全局唯一ID

    2019年1月8日16:11:13 svn地址:svn://gitee.com/zxadmin/live_z    代码在code里面 全局唯一ID 生产 后续会添加其他方法 <?php /* ...

  2. 使用 Windows PowerShell 实现 Web UI 自动化 (转)

    转自 https://msdn.microsoft.com/zh-cn/magazine/cc337896.aspx

  3. linux开通端口允许其他机器访问

    命令开通8080端口允许其他机器对linux的访问: iptables -I INPUT -p tcp --dport 8080 -j ACCEPT

  4. box-sizing (摘录)

    //http://www.jianshu.com/p/e2eb0d8c9de6 box-sizing其它的值 content-box 描述:在宽度和高度之外绘制元素的内边距和边框. border-bo ...

  5. 1. Scala概述

    1.1 概述 联邦理工学院洛桑(EPFL)的Martin Odersky于2001年开始设计Scala Scala是Scalable Language的简写,是一门多范式的编程语言 1.2 Scala ...

  6. python基础的学习

    今日内容 1.常见操作系 1.win win7 win10 window serrer 2.linux centons 图像界面差 upuntu 个人开发(图形化较好) redhat 企业 3.mac ...

  7. flex总结一下

    display:flex:规定元素是flex布局,里面的元素自然会像浮动一样横向排列: flex-direction:row | row-reverse | column | column-rever ...

  8. JVM TI

    JVM TI JVM TI全名Java Virtual Machine Tool Interface,是开发虚拟机监控工具使用的编程接口,它可以监控JVM内部时间的执行,也可以控制JVM的某些行为,可 ...

  9. Java集合框架面试题目

    1.为什么Map接口不继承Collection 接口? Set是无序集合,并且不允许重复的元素 List是有序的集合,并且允许重复的元素 而Map是键值对 它被视为是键的set和值的set的组合 Ma ...

  10. Cocos Creator_继承组件单例

    前言 单例,在游戏开发中是比较常用的功能,全局唯一,可以在任何地方直接获取, 省去了方法赋值 或者 属性面板拖动的麻烦. 普通单例_饿汉模式 不管有没调用,一开始就创建单例 1 // Singleto ...