使用WireShark分析使用RedisTemplate取不到值的问题
现象:
使用Java Redis客户端将数据存放到Redis后,使用redisTemplate却不出来
原因:
Java Redis客户端在将数据存放在Redis时,会对Key,Value,Field进行编码。从Redis中取数据时,如果Key、Field的编码和存放时不一样,就会取不出来。
就像中文乱码一样,同样的中文字符串,存放时编码格式不对,就不能被识别。
问题复盘及分析过程:
(1)使用下面代码将数据放到Redis中
stringRedisTemplate.opsForHash().put("CATALOG_DEV","KEY_INDEX_CATALOG",JsonUtil.list2json(list));
(2)使用方式1,可以hget到的value和存放时的一致:
stringRedisTemplate.opsForHash().get("CATALOG_DEV","KEY_INDEX_CATALOG")
(3)使用方式2,hget到的value是nulll:
redisTemplate.opsForHash().get("CATALOG_DEV","KEY_INDEX_CATALOG")
使用wireshark抓包:
方式1时,HGET命令发送到Redis服务器的指令:
方式2时,HGET命令发送到Redis服务器的指令:
可见,虽然代码中,Redis的Java客户端发送的key和field都是相同和字符串,但Redis接受到的Field却是不同的。
看看Redis服务器上存放的Field是什么样的:

看一个使用redisTemplate客户端存放的数据:
对比看下方式1存放到Redsi服务器上的数据
为什么有这个差异呢?来看看Spring容器中的stringRedisTemplate 和 redisTemplate实例有什么区别:
RedisTemplate的实例化代码如下:
@Bean
@SuppressWarnings({"rawtypes", "unchecked"})
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
RedisSerializer<String> stringSerializer = new StringRedisSerializer();
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
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);
// 设置value的序列化采用Jackson2JsonRedisSerializer
template.setValueSerializer(jackson2JsonRedisSerializer);
// 设置key的序列化采用StringRedisSerializer
template.setKeySerializer(stringSerializer);
// template.setHashKeySerializer(stringSerializer);
// template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
HashKeySerializer、HashValueSerializer没有指定,应该会走默认,如下图所示:

StringRedisTemplate的实例化代码如下:
@Bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
可以看到,HashKeySerializer、HashValueSerializer都使用了StringRedisSerializer,与上面的情况一致。O了
扩展:
WireShark抓包利器:
https://github.com/jzwinck/redis-wireshark
链接:https://pan.baidu.com/s/1M9tXDN54FODU7NftkLfwKQ
提取码:kzhc
复制这段内容后打开百度网盘手机App,操作更方便哦
查看WireShark插件配置目录及已经配置插件的信息:
插件copy到目录:帮助--》关于--》文件夹--》Personal configuration
已经安装的插件列表:

使用WireShark分析使用RedisTemplate取不到值的问题的更多相关文章
- Android 抓包并通过 Wireshark 分析
分析 Android 中 app 的网络数据交互,需要在 Android 上抓包,常用工具为 tcpdump ,用 tcpdump 生成 Wireshark 识别的 pcap 文件,把 pcap 文件 ...
- Linux使用tcpdump命令抓包并使用wireshark分析
Linux使用tcpdump命令抓包并使用wireshark分析 介绍 有时分析客户端和服务器网络交互的问题时,为了查找问题,需要分别在客户端和服务器上抓包,我们的客户端一般是windows上的,抓包 ...
- Android利用tcpdump抓包,用wireshark分析包。
1.前言 主要介绍在android手机上如何利用tcpdump抓包,用wireshark分析包. android tcpdump官网: http://www.androidtcpdump.com/ t ...
- wireshark分析https数据包解密前后的特点
wireshark分析https数据包解密前后的特点 (一)https解密前 1.协议种类:2种(1)TCP(第四层,传输层)(2)SSL/TLS(第五层,应用层,加解密)2.应用层数据所在数据包特点 ...
- Wireshark分析非标准端口号流量
Wireshark分析非标准端口号流量 2.2.2 分析非标准端口号流量Wireshark分析非标准端口号流量 应用程序运行使用非标准端口号总是网络分析专家最关注的.关注该应用程序是否有意涉及使用非 ...
- wireshark分析dhcp过程
---恢复内容开始--- DHCP DHCP(Dynamic Host Configuration Protocol)是一个用于主机动态获取IP地址的配置解 析,使用UDP报文传送,端口号为67何68 ...
- sqlserver 抓取所有执行语句 SQL语句分析 死锁 抓取
原文:sqlserver 抓取所有执行语句 SQL语句分析 死锁 抓取 在多人开发中最头疼的是人少事多没有时间进行codereview,本来功能都没时间写,哪有时间来开会细细来分析代码.软件能跑就行, ...
- 【Python3网络爬虫开发实战】 分析Ajax爬取今日头条街拍美图
前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:haoxuan10 本节中,我们以今日头条为例来尝试通过分析Ajax请求 ...
- MAC帧的格式&&wireshark分析MAC帧
MAC帧的格式 MAC帧较为简单,由五个字段组成 目的地址:6字节 源地址:6字节 类型字段:2字节,用来标志上一层使用的是什么协议,以便把收到的MAC地址帧的数据交给上一层的这个协议. 数据字段:其 ...
随机推荐
- Spark技术的总结 以及同storm,Flink技术的对比
spark总结 1.Spark的特点: 高可伸缩性 高容错 基于内存计算 支持多种语言:java,scala,python,R 高质量的算法,比MapReduce快100倍 多种调度引擎:可以运行于Y ...
- 实现输入框不可输入、解决Enable,Disable等不能更新值问题
当在前台JS中更新不可用输入框(TextBox.Enable ="false" or Input box ReadOnly ="True")的值时, 后台可能 ...
- mysql-5.7安装、配置
1.进入到要存放安装包的位置 cd /home/lnmp 2.查看系统中是否已安装 MySQL 服务,以下提供两种方式: rpm -qa | grep mysql yum list installed ...
- 一场关于 .net core 和 .net framework 编码的案情分析
案情背景 目前公司做新项目,基本所有新项目都是用.net core来做,旧项目一半还是基于 .net framework下面,一半已经迁移到了core平台.在做新项目的时候,有个功能需要对接到旧项目那 ...
- WCF加密传输数据,b并且用户名+密码验证
在前2个文章的基础上,继续增加对client 端增加username+password的验证 host增加类Validator,需要添加引用 using System.IdentityModel.Se ...
- HttpWebRequest 跳转后(301,302)ResponseUri乱码问题
问题: 目标地址: http://www.baidu.com/baidu.php?url=a000000aa.7D_ifdr1XkSUzuBz3rd2ccvp2mFoJ3rOUsnx8OdxeOeOL ...
- Spring Cloud实践之服务注册与发现Eureka
一.简述: 服务提供者producer与服务消费者consumer都注册到eureka server,然后服务consumer在其应用内直接调用producer的服务名来调用服务,而不是像之前一样调用 ...
- Apache VirtualHost的配置
自从电脑更换为mac后, 一直没有时间去配置php的环境.导致每次要更改php代码的时候, 都是本地更改,然后直接推送到服务器上运行 这样的开发和测试及其耗时且繁琐, 所以早上特地决定弄好mac下的p ...
- python学习笔记11-文件操作方法
f=open("1.txt","r",encoding='utf-8') # a=f.readline() print(a) #光标会移动 下面两者结果不一样 ...
- easyui datebox 只选择月份的方法
easyui datebox 只选择月份的方法 效果如下图: 代码如下: <html > <head> <meta charset="utf-8"&g ...