环境描述

某客户的生产环境,Redis 4.0.2 单机

问题现象

客户生产环境服务器因过年停机,年后开机后,Redis 重启,Java 服务连接 Redis 提示某个 Key 在 Redis 里不存在。

问题分析

Java 服务从 Redis 读 Key 读失败,说明服务本身是知道读哪个 Key 的,于是梳理了下问题的相关流程:

  1. Java 服务实际提供了一个 SQL 类型的 API,可以将数据库里的数据通过 API 透出给其他应用程序
  2. 当 HTTP 请求达到 Java 服务后,它会通过自身的业务库查询到当前 API 对应在 Redis 里的 Key
  3. 通过 Key 去 Redis 里查到对应的数据库连接信息以及要执行的查询 SQL
  4. 通过 JDBC 连接数据库,然后执行查询 SQL 查询数据,最后将数据返回给前台

既然读 Key 失败,说明在 Java 服务自身的业务库里是保存了这个 Key 的,于是去 MySQL 中查询,果然存在这个 Key,而 Redis 里确实也不存在这个 Key,说明 Redis 重启后,这个 Key 确实丢了。

继续分析,Java 程序在特定条件下会在 Redis 里写入这个 Key,而且 Redis 配置文件里配置了 SnapShot 的 save 机制:

save 900 1
save 300 10
save 60 10000

这个 Key 是个很早就写入 Redis 的,按照第一条 save 规则,应该是已经从内存写入到 rdb 文件中了,那为什么 Redis 启动的时候没有读到这条数据呢?

继续查看 Redis 配置文件,发现端倪:

# The working directory.
#
# The DB will be written inside this directory, with the filename specified
# above using the 'dbfilename' configuration directive.
#
# The Append Only File will also be created inside this directory.
#
# Note that you must specify a directory here, not a file name.
dir ./

Redis 配置文件里,工作目录配置的是 ./ 这种相对路径,也就是说,启动 Redis 时,在哪个目录下运行启动命令,它就会在那个目录下找 rdb 文件并加载,如果目录下没有 rdb 文件,那 Redis 启动后就没有任何数据。

于是排查了 Redis 目录,在 Redis 根目录下发现了一个 rdb 文件,在 src 目录下也有个 rdb 文件,而这次 Redis 启动是在根目录下启动的,上次是在 src 目录启动的,导致这次启动后无法加载上次的 rdb 文件,也就导致了 Key 丢失。

解决方案

由于 Redis 被很多 Java 服务使用,不能随意重启,只好手动在 Redis 里将这个 Key-Value 写进去供程序使用;如果可以重启,只需更换启动目录,再重启下 Redis 就可以了。

不过最好的方式,还是将配置文件中的工作目录 dir 设置成绝对路径,这样无论在哪里启动 Redis,都能读到同一份 rdb 文件。

总结

很多知识是书本上学不到的,只有从一次次生产事故中总结学习…

Redis 数据丢失问题排查相关推荐

  1. Linux Redis 重启数据丢失解决方案,Linux重启后Redis数据丢失解决方

    Linux Redis 重启数据丢失解决方案,Linux重启后Redis数据丢失解决方案 >>>>>>>>>>>>>> ...

  2. 记一次线上Redis高负载排查经历

    作者:JingQ https://www.sevenyuan.cn/ 周一早上刚上班,突然大量用户反馈进入网页很慢,登录服务器一看,Redis调用时间严重超时,这样高速的缓存反而变成了短板,由于数据一 ...

  3. Redis 性能问题排查:slowlog 和排队延时

    一.Redis Slowlog介绍 Redis slowlog是排查性能问题关键监控指标.它是记录Redis queries运行时间超时特定阀值的系统. 这类慢查询命令被保存到Redis服务器的一个定 ...

  4. Redis高负载排查记录

    Redis简单运维学习 周一早上刚上班,突然大量用户反馈进入网页很慢,登录服务器一看,Redis调用时间严重超时,这样高速的缓存反而变成了短板,由于数据一直没有返回,导致了请求响应变慢. 网页监控 通 ...

  5. Redis——性能问题排查

    对于开发者来说,Redis是个速度非常快的key-value内存数据库,并提供了方便的API接口.为了最好最优的使用Redis,需要理解哪些因素能影响到Redis性能,哪些数据指标能帮助我们避免性能陷 ...

  6. Redis数据丢失讨论及规避和解决的几点总结

    Redis大部分应用场景是 纯缓存服务,请求后端有Primary Storage的组件,如MySQL,HBase;请求Redis的键未命中,会从primary Storage中获取数据返回,同时更新R ...

  7. Redis性能问题排查方法及优化

    查看Redis各项指标 首先要能够连接到Redis并获取性能相关的指标. 本文使用redis-cli客户端指令连接到Redis,使用info [section]命令获取相关指标. 不指定section ...

  8. Redis 高负载排查记录

    来源:https://www.sevenyuan.cn/ 周一早上刚上班,突然大量用户反馈进入网页很慢,登录服务器一看,Redis调用时间严重超时,这样高速的缓存反而变成了短板,由于数据一直没有返回, ...

  9. Redis性能问题排查解决手册(值得收藏)

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:今天给大家推荐 6 个 Spring Boot 项目,拿来就可以赚钱! 个人原创100W+访问量博客:点击前往, ...

  10. redis 内存不足 排查_一文深入了解 Redis 内存模型,Redis 的快是有原因的!

    前言 一.Redis内存统计 二.Redis内存划分 1.数据 2.进程本身运行需要的内存 3.缓冲内存 4.内存碎片 三.Redis数据存储的细节 1.概述 2.jemalloc 3.redisOb ...

最新文章

  1. Docker操作笔记(四)使用网络
  2. 【机器学习算法-python实现】决策树-Decision tree(2) 决策树的实现
  3. Python运算符 - Python零基础入门教程
  4. 今天第72个儿童节,程序猿“童”样精彩~
  5. delphi madExcept使用指南
  6. 尼尔机械纪元免安装中文 2B的姐姐单机游戏 NieR Automata +修改器解锁存档
  7. pyltp实现句法分析并画出句法图
  8. html设置一级标题二级标题格式怎么弄,word如何设置一级二级三级标题格式
  9. keil中 使用for循环体中条件判断框定义变量出错
  10. Gmail中基本html
  11. c语言码流文件,视频文件大小的计算以及视频在网络上的传输(KB、kb、GB、kbps码率)...
  12. Js常用40个页面效果
  13. finereport与finebi差别_FineBI与FineReport对比
  14. 三十天博客计划之《引言》
  15. usb触摸屏驱动移植
  16. OpenGL-基础知识总结
  17. ubuntu18.04 安装 roboware-studio
  18. sql语句,sql文件加注释
  19. Win10Chrome调试安卓Chrome
  20. IDEA 的Surround With (例如try/catch)快捷键

热门文章

  1. DeskSpace-适用于Vista的类似Beryl的3D多维数据集虚拟桌面管理器
  2. DragonBones快速入门指南1
  3. matlab斯奈尔定律,斯奈尔定律和Zoeppritz方程
  4. 笔记本电脑怎么找计算机硬盘,详细教您笔记本电脑怎么安装固态硬盘
  5. matlab示波器有毛刺,在使用示波器时如何消除毛刺?
  6. 编解码学习笔记(七):微软Windows Media系列
  7. ADI高速信号采集芯片与JESD204B接口简介
  8. android系统铃声选择画面源码,gogo体育体验官网-官网首页
  9. 侯世达:为什么人工智能还远远谈不上「智能」?
  10. 笔试题(求一组数中能构成三角形的个数,不能重复)