现象:

  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. 聚焦AI实践,2019 A2M峰会将在上海举行!

    18年,BERT重磅发布,刷新了很多NLP的任务的最好性能:KENSHO等智能化应用的成功应用,让知识图谱在证券行业的建设思路和应用实践成为业内较为关注的问题:强化学习也在与人类的对战游戏中独领风骚: ...

  2. 新装的centos怎样显示中文界面

    默认的显示英文界面,即使各种配置中都选择的chinese也没用,默认显示的还是英文. 要在终端输入 vim ~/.bashrc 编辑本用户配置文件 打开后最后一行加入 export LANG=&quo ...

  3. oo第二单元作业总结

    oo第二单元博客总结 在第一单元求导结束后,迎来了第二单元的多线程电梯的问题,在本单元前两次作业中个人主要应用两个线程,采用“生产者-消费者”模式和共享数据变量的方式解决问题.在第三次作业中加入多个电 ...

  4. go 学习第一个hello world 遇到的问题

    mac:Go安装和配置+GoLand安装和使用之完整教程 https://blog.csdn.net/zxy_666/article/details/80182688 前言作为一个go语言程序员,觉得 ...

  5. Linux常用命令之-删除文件

    在测试过程中,有时候会需要删除一些文件,例如日志文件过大等,这里汇总一些删除文件常用的命 已这个系统内的文件为例 删除文件(即这个文件被删除) 单个删除:rm -f + 文件名 eg:rm -f  2 ...

  6. 10个用于处理日期和时间的 Python 库

    Python本身提供了处理时间日期的功能,也就是datetime标准库.除此之外,还有很多优秀的第三方库可以用来转换日期格式,格式化,时区转化等等.今天就给大家分享10个这样的Python库. 上期入 ...

  7. 扫黑除恶Team second

    团队介绍: 团队序号:② 团队名称:扫黑除恶 团队项目:飞机大战游戏 团队码云地址:https://gitee.com/MrLiu199903/seflash/branches 撰写人:刘新飞 学号: ...

  8. lumen----------A facade root has not been set.

    1.新拉下来的lumen源码,直接使用Log::info是不行的.汇报如下图错误 解决办法如下图,因为lumen需要设置一些开关

  9. mongo中常用的增删改查

    db.students.find();//按性别分组,并显示每组的姓名db.students.aggregate({ $group:{ _id:'$sex', name:{$push:'$name'} ...

  10. 使用 acme.sh 签发续签 Let‘s Encrypt 证书 泛域名证书

    1. 安装 acme.sh 安装很简单, 一个命令: curl https://get.acme.sh | sh 并创建 一个 bash 的 alias, 方便你的使用 alias acme.sh=~ ...