V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
daoqiongsi1101
V2EX  ›  Redis

Redis 事务是不是没什么用?如果在生产环境中用到了,请举例说明场景。

  •  
  •   daoqiongsi1101 · 2022-09-03 23:54:36 +08:00 · 6144 次点击
    这是一个创建于 840 天前的主题,其中的信息可能已经有所发展或是发生改变。
    RT ,请举例说明,学习一下。
    30 条回复    2022-09-05 21:44:47 +08:00
    fkdog
        1
    fkdog  
       2022-09-04 00:21:44 +08:00
    现在的人都懒到官方文档都不肯去看一眼,光明正大伸手了?
    https://redis.io/docs/manual/transactions/
    richangfan
        2
    richangfan  
       2022-09-04 00:22:40 +08:00
    时间窗口计数器,用来限流
    LeegoYih
        3
    LeegoYih  
       2022-09-04 04:40:36 +08:00
    用事务的目的是什么,如果只是为保证多条命令原子性,可以用 lua 脚本
    LeeReamond
        4
    LeeReamond  
       2022-09-04 05:12:44 +08:00   ❤️ 18
    @fkdog 显然 OP 是看过以后认为没什么用才来发帖,你不想答可以不答,我觉得没必要踩别人一句体现自己的优越感
    kindjeff
        5
    kindjeff  
       2022-09-04 07:56:23 +08:00
    用 Redis 做分布式锁简直不要太常见
    sardina
        6
    sardina  
       2022-09-04 08:22:26 +08:00 via iPhone
    @kindjeff 做分布式锁 用 redis 的事务吗
    luin
        7
    luin  
       2022-09-04 09:13:03 +08:00   ❤️ 3
    个人感觉确实没啥用哈哈哈。之前公司的项目都是用 Redis scripts 。

    另外 Redis 官方文档也提到了:

    > Something else to consider for transaction like operations in redis are redis scripts which are transactional. Everything you can do with a Redis Transaction, you can also do with a script, and usually the script will be both simpler and faster.
    xhinliang
        8
    xhinliang  
       2022-09-04 09:13:17 +08:00
    没什么用。尤其是对于 proxy 实现的集群,等同于摆设。
    javaisthebest
        9
    javaisthebest  
       2022-09-04 10:22:18 +08:00
    没啥用,Redis 事务是一个假事务,不保证原子性。
    orzwalker111
        10
    orzwalker111  
       2022-09-04 10:44:26 +08:00
    没用
    qinxi
        11
    qinxi  
       2022-09-04 10:47:07 +08:00
    @sardina #6 redisson 里面应该是用的.
    qinxi
        12
    qinxi  
       2022-09-04 10:47:54 +08:00
    @javaisthebest #9 假事务说的是不能回滚.并不是不保证原子吧
    crysislinux
        13
    crysislinux  
       2022-09-04 11:04:53 +08:00 via Android
    事务确实没啥用了,基本上都用 lua 替代了
    MeteorCat
        14
    MeteorCat  
       2022-09-04 11:35:38 +08:00 via Android
    实际日常很少用,都忘记有这个特性了
    securityCoding
        15
    securityCoding  
       2022-09-04 12:37:12 +08:00
    基本不用,都在用 lua 了
    Mitt
        16
    Mitt  
       2022-09-04 14:08:16 +08:00   ❤️ 1
    @LeeReamond #4 不知道你这个 “显然” 又是从何而来,毕竟楼主既没有说明自己看过也没列举自己的观点
    jack778
        17
    jack778  
       2022-09-04 15:13:18 +08:00
    被 redis 事务坑过,你插入了一个值,然后马上查询居然查不到...
    roundgis
        18
    roundgis  
       2022-09-04 16:34:06 +08:00 via Android
    從來沒用過

    有需要用 eval script 就好了
    kkkiio
        19
    kkkiio  
       2022-09-04 18:10:39 +08:00 via iPhone
    redis 持久性都很难保证,跟数据库的事务差太远了,用脚本凑合就行了
    cheng6563
        20
    cheng6563  
       2022-09-04 18:35:01 +08:00
    没用,被 lua 完全取代了
    S2Line
        21
    S2Line  
       2022-09-04 20:29:44 +08:00 via iPhone
    没用,用 lua 脚本
    thetbw
        22
    thetbw  
       2022-09-04 21:39:56 +08:00
    @jack778 multi 之后执行的查询都不会返回值,而是 exec 后批量返回。所以说 redis 的这个不像是事务,像是批处理。不过可以用 watch 来监听一个 key
    自己简单写过一个笔记 https://blog.thetbw.xyz/archives/java-redis-transaction
    Euthpic
        23
    Euthpic  
       2022-09-04 23:20:36 +08:00
    @qinxi #12 你好好想想原子性的定义
    daoqiongsi1101
        24
    daoqiongsi1101  
    OP
       2022-09-04 23:31:58 +08:00
    @LeeReamond 看到第一个回复感到很惊讶,觉得他就是想都没想就喜欢喷的那种人,很多人也赞同我们的感受,我也给你点个赞
    @fkdog 看了文档,介绍了事务的一些用法,谢谢你,我不是伸手要这个,麻烦具体回答我的问题
    daoqiongsi1101
        25
    daoqiongsi1101  
    OP
       2022-09-04 23:35:23 +08:00
    @Mitt 澄清一下,redis 事务原理和用法我看过,所以才提问,谢谢!请关注问题本身。
    ediron
        26
    ediron  
       2022-09-05 02:15:27 +08:00   ❤️ 1
    Redis 事务并不是传统意义上的 ACID 事务,它满足不了原子性和持久性,只是保证了这批命令在这个客户端执行完之前不被别的操作打断,执行期间遇到异常(命令执行错误或服务宕机)并不会回滚,这点官方也说明了认为 Redis 没必要回滚,命令执行了就是执行了彼此之间没有什么必要联系,这样简单便捷性能也更好。我也觉得是这样,Redis 本身就是非关系型数据库,各个数据之间并不存在逻辑关系,没必要回滚。所以就像 @thetbw 说的就把 Redis 事务当作是批处理,而批处理用 Lua 脚本就可以。确实我也没用到和见到过 Redis 事务的应用,另外有看到说事务中的每条命令都会与 Redis 服务器进行网络交互,这是比较浪费资源的行为,所以 Redis 事务是不建议在日常开发中使用的。
    yanqic
        27
    yanqic  
       2022-09-05 10:54:51 +08:00
    bulljs 库(消息队列),会用到事务(批量添加消息 addBulk). 但是我们用的时候在阿里云 redis 集群模式下不可用. 感觉 redis 事物还是尽量少用
    tairan2006
        28
    tairan2006  
       2022-09-05 13:46:52 +08:00
    基本用 lua
    iseki
        29
    iseki  
       2022-09-05 21:43:49 +08:00 via Android
    在你不想 /不便于使用 lua 时,事物还是有点用的
    iseki
        30
    iseki  
       2022-09-05 21:44:47 +08:00 via Android
    比如说我在 Redis 里存了 protobuf…lua 就不太方便了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2652 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 15:21 · PVG 23:21 · LAX 07:21 · JFK 10:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.