【问题标题】:Spring-data-redis: When within a transaction, get operations would return nullSpring-data-redis:在事务中,获取操作将返回 null
【发布时间】:2017-12-08 04:16:18
【问题描述】:

使用redis(4.0) 和spring-data-redis 处理项目时。

似乎在事务中,get 操作会在 java 程序中返回 null。

例如HashOperationget() 方法在multi()exec() 之间调用时将返回null
但是如果把get()放在multi()前面,就可以得到值了。

那么,为什么会这样呢?

【问题讨论】:

    标签: java spring redis spring-data-redis


    【解决方案1】:

    经过测试和思考,我认为这是合理的行为,因为事务在redis中作为原子操作执行,不可能通过网络将事务中间的值返回给客户端,因此null是合理。

    所有值在事务执行后由exec() 方法返回为List

    所以,在调试的时候,在事务的中间,这个值应该是空的,因为它还没有被执行。


    建议:

    如果事务中的计算需要从 redis 中读取值,那么只需在 multi() 之前先读取这些值。

    那么在multi()exec()之间只做更新操作,不做读操作。

    【讨论】:

      【解决方案2】:

      在文档中它说“所有只读操作,例如 KEYS 都通过管道传输到新的(非线程绑定)RedisConnection”。曾经,我认为它曾经返回旧值,因为读取发生在不同的新连接中。最近似乎行为发生了变化,因为现在我看到事务中所有读取的空值。 spring-data-redis 团队的人能否说明预期的行为。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-25
        • 2022-10-05
        • 2018-05-23
        • 1970-01-01
        • 2015-11-28
        • 2019-11-01
        • 2012-09-27
        • 2013-08-29
        相关资源
        最近更新 更多