The right answer is to "watch" the value. It is also important to make sure each query has its own connection and handles the possibility of a concurrency error.
var atomicReadWriteOperationRecursive = function (hashKey, valueKey, count) {
var client = redis.createClient();
client.watch(hashKey, valueKey);
client.hget(hashKey, valueKey, function (err, response) {
client.multi()
.hset(orgId, topicId, newValue);
.exec(function (err) {
client.close();
if (err && count < 3) {
atomicReadWriteOperationRecursive(hashKey, valueKey, count++);
}
});
});
}