V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
goodspb
V2EX  ›  问与答

在 Mysql 事务之中执行 redis 写缓存,对 Mysql 的性能影响大吗?

  •  
  •   goodspb · 2020-02-11 11:18:49 +08:00 · 1984 次点击
    这是一个创建于 1783 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如题,想在 Mysql 的事务之中写一个缓存,不知道对 Mysql 性能是否友好,有老铁尝试过吗??

    begin trans;

    select xxx;

    update xxx;

    redis.set(xxx);

    commit;
    10 条回复    2020-02-11 16:16:49 +08:00
    fancy111
        1
    fancy111  
       2020-02-11 11:25:53 +08:00
    骚操作,阻断事务执行。
    kn007
        2
    kn007  
       2020-02-11 11:38:57 +08:00
    建议不要如此操作。
    mahone3297
        3
    mahone3297  
       2020-02-11 11:41:35 +08:00
    长事务不好
    xmh51
        4
    xmh51  
       2020-02-11 11:47:26 +08:00
    事务回滚了 redis 怎么办?
    goodspb
        5
    goodspb  
    OP
       2020-02-11 11:51:22 +08:00
    @xmh51 #4 也对,感觉我可以直接忽略这个行为了
    goodspb
        6
    goodspb  
    OP
       2020-02-11 11:51:35 +08:00
    @mahone3297 #3
    @kn007 #2
    @fancy111 #1

    谢谢谢
    whileFalse
        7
    whileFalse  
       2020-02-11 15:43:43 +08:00
    正确的做法是 mysql 提交成功之后更新缓存,这样缓存出错的概率较低。
    cabing
        8
    cabing  
       2020-02-11 15:46:13 +08:00
    不能在事务执行成功后放入 redis 吗?
    dilu
        9
    dilu  
       2020-02-11 16:11:30 +08:00
    建议不要这样,除非你是小项目,一天几十个人的那种访问量
    但凡是个数据量大的系统你都要考虑一个极端问题,redis 超时会抛出一个异常,导致事务直接失败,但是本来业务应该是成功的
    还有就是 redis 写完了但是事务失败了
    这些逻辑上的漏洞都考虑清楚
    最好的办法是事务完成后写 redis
    用的时候从 redis 中取 不存在再从数据库取
    NeinChn
        10
    NeinChn  
       2020-02-11 16:16:49 +08:00
    直接提交事务后,通过 binlog 得到消息流,通过回调的方式去更新 Redis 也是一种常用解决方案
    有很多类似的基础组件,例如 linkedin 的 databus,阿里 canal
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2568 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 07:25 · PVG 15:25 · LAX 23:25 · JFK 02:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.