码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 一次 Redis 事务使用不当引发的生产事故


    这是悟空的第 170 篇原创文章

    官网:www.passjava.cn

    你好,我是悟空。

    本文主要内容如下:

    一、前言

    最近项目的生产环境遇到一个奇怪的问题:

    现象:每天早上客服人员在后台创建客服事件时,都会创建失败。当我们重启这个微服务后,后台就可以正常创建了客服事件了。到第二天早上又会创建失败,又得重启这个微服务才行。

    初步排查:创建一个客服事件时,会用到 Redis 的递增操作来生成一个唯一的分布式 ID 作为事件 id。代码如下所示:

    return redisTemplate.opsForValue().increment("count", 1);
    
    • 1

    而恰巧每天早上这个递增操作都会返回 null,进而导致后面的一系列逻辑出错,保存客服事件失败。当重启微服务后,这个递增操作又正常了。

    那么排查的方向就是 Redis 的操作为什么会返回 null 了,以及为什么重启就又恢复正常了。

    二、排查

    根据上面的信息,我们先来看看 Redis 的自增操作在什么情况下会返回 null。

    2.1 推测一

    根据重启后就恢复正常,我们推测晚上执行了大量的 job,大量 Redis 连接未释放,当早上再来执行 Redis 操作时,执行失败。重启后,连接自动释放了。

    但是其他有使用到 Redis 的业务功能又是正常的,所以推测一的方向有问题,排除。

    2.2 推测二

    可能是 Redis 事务造成的问题。这个推测的依据是根据下面的代码来排查的。

    直接看 redisTemplate 递增的方法 increment,如下所示:

    官方注释已经说明什么情况下会返回 null:

    • 当在 pipeline(管道)中使用这个 increment 方法时会返回 null。
    • 当在 transaction(事务)中使用这个 increment 方法时会返回 null。

    事务提供了一种将多个命令打包,然后一次性、有序地执行机制.

    多个命令会被入列到事务队列中,然后按先进先出(FIFO)的顺序执行。

    事务在执行过程中不会被中断,当事务队列中的所有命令都被执行完毕之后,事务才会结束。(内容来自 Redis 设计与实现)

    继续看代码,发现在操作 Redis 的 ServiceImpl 实现类的上面添加了一个 @Transactional 注解,

  • 相关阅读:
    Node.js 入门教程 19 package-lock.json 文件
    C 语言中如何实现图结构?
    [附源码]JAVA毕业设计衡师社团管理系统(系统+LW)
    Springboot中使用netty 实现 WebSocket 服务
    实时大数据流处理技术:Spark Streaming与Flink的深度对比
    超强功能WebSSH安装,解决Web远程SSH终端
    龙口联合化学通过注册:年营收5.5亿 李秀梅控制92.5%股权
    TypeScript 中 Type 和 Interface 有什么区别?
    IO Watch:用 Arduino UNO 制造的可编程手表
    Altium Designer实用系列(四)----Ultra Librarian 下载芯片原理图库及封装并导入AD
  • 原文地址:https://blog.csdn.net/jackson0714/article/details/127508180
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号