Redis 设置密钥,仅当 val 与前一个匹配时才设置 val 以实现并发

问题描述

如何做到这一点?使用 Jedis 和 Java。

我现在正在使用 hset,但这并不重要。

是否必须发送 lua 代码才能实现这一点? Jedis 是如何做到的?

解决方法

这是使用 LUA 的 HSET 命令的 Check-n-set。

Jedis jedis;
String key,field,oldValueToCheck,newValueToSet;

jedis.eval("if redis.call('HGET',KEYS[1],ARGV[1]) == ARGV[3]"
    + " then return redis.call('HSET',ARGV[1],ARGV[2])"
    + " else return 'NA' end",1,key,newValueToSet,oldValueToCheck);