【问题标题】: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。
例如HashOperation 的get() 方法在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 团队的人能否说明预期的行为。