一个空格带来的惨案

  • 案例背景
  • 问题分析
  • 问题原因
  • 解决办法

案例背景

研发同事反馈线上某redis cluster 某个hashmap异常, 应用日志中已经明确对于这个hashmap 特定的field1 hset成功了,但是其他的业务模块在hget 对应的field时,读不到对应数据。

问题分析

根据业务提供的field到DB里面查询相应信息,查询redis

$redis-cli -p port -a  -c
127.0.0.1:4410> hget hashmapa f1087507-c90f-4b08-b028-b3f14efc49f3/01
-> Redirected to slot [5265] located at IP:port
(nil)

注: HGET KEY_NAME FIELD_NAME 返回给定字段的值。如果给定的字段或 key 不存在时,返回 nil 。
这里需要注意,因为是redis cluster所以连接的使用切记加上-c进入cluster 模式

redis说你这根本就不存在这个field,但研发言之凿凿这个field一定是设置成功了的,redis说这个锅我可不背,这种时候最好的办法就是把证据(一口大黑锅)甩他脸上。

思索片刻之后,我们环境中cluster的从节点都是开启了aof持久化,那有无可能通过分析aof,来分析历史执行命令,从而定位问题?当然有可能。前提是需要考虑aof是否已经重写了,如果没有重写可以直接分析aof文件。

AOF的重写机制,分为手工触发和自动触发。
手动触发:调用bgrewriteaof命令。
自动触发:aof_current_size > auto-aof-rewrite-min-size && (aof_current_size - aof_base_size) / aof_base_size >= auto-aof-rewrite_percentage(默认100%)

幸运的是 ,问题现象能够复现,那就没必要去分析不确定的历史aof,现在的问题就是如何在业务触发的时候,记录下这段时间redis的操作日志。
方法一: 可以使用redis本身的monitor 命令,但这一个繁忙的系统中,会对系统有一定的性能损耗(当然也可以选择在从节点执行 )。
方法二: 使用linux命令对aof文件进行tail -200f db.aof >res.log,也可以将这段时间内的命令记录下来。

此处我们采用方法二。接下来的任务问题就是cluster里面有非常多的分片,那我们要需要提前确定这个key目前在哪个分片上。

127.0.0.1:PORT> CLUSTER KEYSLOT userTokenMap
(integer) 5265
127.0.0.1:PORT> CLUSTER SLOTS
4) 1) (integer) 27312) (integer) 54603) 1) "IP1"2) (integer) PORT13) "e6e62c68eed8a9869b6e31aed5bac3291270688f"4) 1) "IP2"2) (integer) PORT23) "bedc109fa35821d379567649e2f3a2ded3771b73"

通过cluster命令我们定位到了key所在分片。

在业务开始触发时开启收集日志,在复现结束后停止,并分析。下面是tail aof文件的结果(二进制)

这里可以看到值是存在的
IP:PORT> HGET userTokenMap "f1087507-c90f-4b08-b028-b3f14efc49f3 /01"
"50017d18bf4a427e0111c1e7386c37f557ef39d3644d393d598c4fe8b986c1b30aa26f1b5f24e7394cb2ef99a0d5549d6980"

分析日志发现,结果很明显 ,程序在使用这个field(f1087507-c90f-4b08-b028-b3f14efc49f3 /01)的时候会截取**/**部分, 默认的规则field都是无空格的,但是这个field 由于程序存取环节异常导致多了空格,从而引起应用其他模块使用该key的部分field异常,至此真相大白。

问题原因

hset的时候拼接部分多了多了个空格

解决办法

程序后续版本对field前半部分进行trim取消无效空格之后再拼接。

Redis cluster Hget hash field value异常分析案例--一个空格带来的惨案相关推荐

  1. Redis集群Hash槽分配异常 CLUSTERDOWN Hash slot not served的解决方式

    在搭建Redis5.x版本的集群环境出现各节点无法互相发现与Hash槽分配异常 CLUSTERDOWN Hash slot not served的情况 在Linux同一台服务器下搭建伪集群-- 127 ...

  2. Redis Cluster 源码分析

    作者介绍 姓名:李航 工作经历:    5 年多互联网工作经验,先后在 58 同城,汽车之家,优酷土豆集团工作.目前主要在优酷土豆集团任职高级开发工程师,目前主要负责大数据基础平台 Redis 集群开 ...

  3. 高性能分布式缓存redis(持久化原理 安全策略 过期删除内存淘汰策略 性能压测 高可用 Redis Cluster)

    redis redis(持久化原理 安全策略 过期删除&内存淘汰策略 性能压测 高可用 Redis Cluster) 1. 持久化原理 1.1 持久化流程(落盘) 1.2 RDB详解 1.2. ...

  4. Redis Cluster 实战 - 图解 - 秒懂 - 史上最全

    文章很长,而且持续更新,建议收藏起来,慢慢读! Java 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 免费赠送 经典图书 : 极致经典 + 社群大片好评 < Java 高 ...

  5. Python操作Redis中的hash

    Redis 数据库hash数据类型是一个string类型的key和value的映射表,适用于存储对象.Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿).  Python的re ...

  6. [Java工程师面试精选]Redis cluster集群模式的原理

    redis cluster redis cluster是Redis的分布式解决方案,在3.0版本推出后有效地解决了redis分布式方面的需求 自动将数据进行分片,每个master上放一部分数据 提供内 ...

  7. redis集群之REDIS CLUSTER

    redis集群之REDIS CLUSTER 时间 2016-04-11 17:05:00  NoSQL_博客园 原文  http://www.cnblogs.com/zhanchenjin/p/537 ...

  8. redis cluster集群选主

    redis 选主过程分析  当slave发现自己的master变为FAIL状态时,便尝试进行Failover,以期成为新的master.由于挂掉的master可能会有多个slave.Failover的 ...

  9. Redis Cluster 原理你了解不?

    1. redis cluster 介绍 1.1 自动将数据进行分片,每个master上放一部分数据 1.2 提供内置的高可用支持,部分master不可用时,这是可以继续工作的 在redis clust ...

  10. Redis cluster集群模式的原理

    redis cluster redis cluster是Redis的分布式解决方案,在3.0版本推出后有效地解决了redis分布式方面的需求 自动将数据进行分片,每个master上放一部分数据 提供内 ...

最新文章

  1. 扩散模型就是自动编码器!DeepMind研究学者提出新观点并论证
  2. C语言从来都没有过时,你大爷终究是你大爷
  3. 从源码安装mysql_从源代码安装mysql
  4. 智能指针变量做函数参数的一个值得注意的地方
  5. Terracotta - 分布式共享对象
  6. 【Mybatis】mapper文件的解析
  7. VMware利用unlocker开启MacOS支持
  8. 怎么从零基础学计算机打字,新手学电脑打字 0基础打字快速上手教程
  9. 西门子dcs系统组态手册下载_PLC/DCS/HMI 知识普及
  10. 医学影像常用Python包
  11. 群晖域名注册_小白瞎折腾 篇九:玩转群晖NAS:域名注册技巧,及SSL证书获取...
  12. 2.2.7 虚拟Ethernet以太网卡
  13. 余世雄 - 与上司沟通的7个技巧
  14. 如何修改文件最后一次修改时间?
  15. 前后端离线开发相关软件下载地址大全
  16. kubectl源码分析之cordon and uncordon
  17. python pandas读取csv文件指定行_python pandas获取csv指定行 列的操作方法
  18. cayina计算机主板怎么改路线,七彩虹计算机主板biOs设置(图文).doc
  19. haxm intel庐_如何开启Intel HAXM功能
  20. 通过巧妙设置确保局域网安全

热门文章

  1. 【评价模型】层次分析法(AHP) 个人总结 续更
  2. 一级计算机考试如何移动文件夹,2010年职称计算机考试:文件或文件夹的移动...
  3. 国内外实行HACCP情况(转载)
  4. 微信小程序获取Appsecret报错40125“invalid appsecret”
  5. 《居里夫人自传》的读后感作文1700字
  6. Photoshop水平线快捷键怎么使用的?
  7. ps: 如何调出辅助线
  8. 【前端面试之缓存】js本地缓存、浏览器缓存、服务器缓存
  9. php+redis+保存多个值,php向redis list一次性lPush多个值
  10. 关于C语言常量需要注意的点