gpt4 book ai didi

java - compareAndSet 如何在 Redis 内部工作

转载 作者:IT王子 更新时间:2023-10-29 06:04:15 32 4
gpt4 key购买 nike

spring-data-redis 模块包含 RedisAtomicLong 类。

在这个类中你可以看到

public boolean compareAndSet(long expect, long update) {

return generalOps.execute(new SessionCallback<Boolean>() {

@Override
@SuppressWarnings("unchecked")
public Boolean execute(RedisOperations operations) {
for (;;) {
operations.watch(Collections.singleton(key));
if (expect == get()) {
generalOps.multi();
set(update);
if (operations.exec() != null) {
return true;
}
}
{
return false;
}
}
}
});
}

我的问题是它为什么有效?

generalOps.multi() 在调用 get() 后开始事务。这意味着有可能两个不同的线程(甚至客户端)可以更改值并且它们都将成功。

operations.watch 是否以某种方式阻止了它? JavaDoc 没有解释此方法的用途。

PS:小问题:为什么 for (;;)?总是有一个迭代。

最佳答案

问:operations.watch 是否以某种方式阻止它?

是。

引自Redis documentation about transaction :

WATCH is used to provide a check-and-set (CAS) behavior to Redis transactions.

WATCHed keys are monitored in order to detect changes against them. If at least one watched key is modified before the EXEC command, the whole transaction aborts, and EXEC returns a Null reply to notify that the transaction failed.

您可以从该文档中了解有关 Redis 事务的更多信息。

问:为什么要 (;;)?总是有一个迭代。

您发布的代码似乎很旧。来自 Google 的缓存 this url ,我看到你提供的代码可以追溯到 2012 年 10 月 15 日!

最新的代码看起来很不一样:

关于java - compareAndSet 如何在 Redis 内部工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54234192/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com