现象:
使用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取不到值的问题的更多相关文章

  1. Android 抓包并通过 Wireshark 分析

    分析 Android 中 app 的网络数据交互,需要在 Android 上抓包,常用工具为 tcpdump ,用 tcpdump 生成 Wireshark 识别的 pcap 文件,把 pcap 文件 ...

  2. Linux使用tcpdump命令抓包并使用wireshark分析

    Linux使用tcpdump命令抓包并使用wireshark分析 介绍 有时分析客户端和服务器网络交互的问题时,为了查找问题,需要分别在客户端和服务器上抓包,我们的客户端一般是windows上的,抓包 ...

  3. Android利用tcpdump抓包,用wireshark分析包。

    1.前言 主要介绍在android手机上如何利用tcpdump抓包,用wireshark分析包. android tcpdump官网: http://www.androidtcpdump.com/ t ...

  4. wireshark分析https数据包解密前后的特点

    wireshark分析https数据包解密前后的特点 (一)https解密前 1.协议种类:2种(1)TCP(第四层,传输层)(2)SSL/TLS(第五层,应用层,加解密)2.应用层数据所在数据包特点 ...

  5. Wireshark分析非标准端口号流量

    Wireshark分析非标准端口号流量 2.2.2  分析非标准端口号流量Wireshark分析非标准端口号流量 应用程序运行使用非标准端口号总是网络分析专家最关注的.关注该应用程序是否有意涉及使用非 ...

  6. wireshark分析dhcp过程

    ---恢复内容开始--- DHCP DHCP(Dynamic Host Configuration Protocol)是一个用于主机动态获取IP地址的配置解 析,使用UDP报文传送,端口号为67何68 ...

  7. sqlserver 抓取所有执行语句 SQL语句分析 死锁 抓取

    原文:sqlserver 抓取所有执行语句 SQL语句分析 死锁 抓取 在多人开发中最头疼的是人少事多没有时间进行codereview,本来功能都没时间写,哪有时间来开会细细来分析代码.软件能跑就行, ...

  8. 【Python3网络爬虫开发实战】 分析Ajax爬取今日头条街拍美图

    前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:haoxuan10 本节中,我们以今日头条为例来尝试通过分析Ajax请求 ...

  9. MAC帧的格式&&wireshark分析MAC帧

    MAC帧的格式 MAC帧较为简单,由五个字段组成 目的地址:6字节 源地址:6字节 类型字段:2字节,用来标志上一层使用的是什么协议,以便把收到的MAC地址帧的数据交给上一层的这个协议. 数据字段:其 ...

随机推荐

  1. 转:Ubuntu 10.10 安装后上不了网的原因

    最近新装了个Ubuntu10.10 发现上不了网,折腾了很久,在网上找了很多办法都不行,最后试了一招居然管用了.特此总结下Ubuntu了网的原因及对策分析. 环境:Ubuntu 10.10网络: 通过 ...

  2. poj1573模拟

    Robot Motion Time Limit: 1000 MS Memory Limit: 10000 KB 64-bit integer IO format: %I64d , %I64u Java ...

  3. csdn 不登录浏览全文 chrome 浏览器

    1将此文章存到书签栏. 2 右键点击保存到书签栏的这个书签,然后点击修改. 3 名称改为:CSDN查看全文,网址改为: javascript:$("#article_content" ...

  4. JMeter----正则表达式&JSON Path Extractor

    最近在用JMerter给公司一个项目做性能测试,期间遇到要提取上一个接口返回的数据作为下个接口的请求.这里做下记录 如图所示,需要将“扫描二维码”接口请求的返回值中的data部分,作为“处理提交码值” ...

  5. .NET 中的 GAC

    GAC : ———> 全局程序集缓存 介绍GAC的好文章(怎么:生成SNK,给项目加强名称,加入到GAC,多个版本共存,介绍了不同的工具): http://www.makaidong.com/% ...

  6. 浏览器环境下JavaScript脚本加载与执行探析之动态脚本与Ajax脚本注入

    在<浏览器环境下JavaScript脚本加载与执行探析之defer与async特性>中,我们研究了延迟脚本(defer)和异步脚本(async)的执行时机.浏览器支持情况.浏览器bug以及 ...

  7. springboot + mybatis + 多数据源

    此文已由作者赵计刚薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验 在实际开发中,我们一个项目可能会用到多个数据库,通常一个数据库对应一个数据源. 代码结构: 简要原理: 1) ...

  8. js中两种for循环的使用

    针对两种for循环的使用 1. for in循环的使用环境     可用在字符串.数组.对象中, 需注意:其中遍历对象得到的是每个key  的value值  2. for 变量递加的方式        ...

  9. Android逆向进阶(7)——揭开Hook的神秘面纱

    本文作者:i春秋作家——HAI_ 0×00 前言 HAI_逆向使用手册(想尝试一下新的写法) 其他 Android逆向进阶 系列课程 <<<<<<< 人物说明 ...

  10. InfluxDB Java入门

    添加依赖 <dependency> <groupId>org.influxdb</groupId> <artifactId>influxdb-java& ...