您可以编写一个lua脚本,该脚本将检查密钥的当前值,如果该值与新密钥不同,则将其更改。我在c中添加了一个通过c程序调用lua脚本的示例,并完成了所需的工作。
//g++ -g -o condition condition.cpp -I/usr/local/include/hiredis -L/usr/local/lib -levent -lhiredis#include <iostream>#include <stdio.h>#include <stdlib.h>#include <string>#include <hiredis/hiredis.h>using namespace std;struct timeval _timeout ;redisContext *_redisContext;const long long SEC_TO_USEC = 1000000 ;void connect(const std::string &ip, int port, int timeoutInUsec ){ _timeout.tv_sec = timeoutInUsec / SEC_TO_USEC ; _timeout.tv_usec = timeoutInUsec % SEC_TO_USEC ; _redisContext = redisConnectWithTimeout(ip.c_str(), port, _timeout); if (_redisContext->err) { std::cout << "Cannot connect to redis server. " << " Error : " << _redisContext->errstr << std::endl ; exit(1); }}//lua scrip for conditional setstring scriptMultipleCommands ="local res = redis.call("GET", KEYS[1]) ""if res == ARGV[1] then "" return nil ""else ""redis.call("SET", KEYS[1], ARGV[1]) ""end ""local data = redis.call("GET",KEYS[1]) ""return data ";void luaCommand(char** argv){ string command; command.append( scriptMultipleCommands ); redisReply *reply = ( redisReply * ) redisCommand( _redisContext, "eval %s %d %s %s ",command.c_str(),1,argv[1],argv[2]); cout<<"Redis reply type "<<reply->type<<endl; if (reply->type == REDIS_REPLY_ARRAY) { cout<<"Redis reply size "<<reply->elements<<endl; for (int j = 0; j < reply->elements; j++) { if((j+1) < reply->elements) { cout<<(reply->element[j]->str)<<","<<(reply->element[j+1]->str)<<endl; ++j; } } } else if (reply->type == REDIS_REPLY_INTEGER) { cout<<"Key value "<<reply->integer<<endl; } else cout<<endl<<"eval: "<< reply->str<<endl; freeReplyObject(reply);}int main(int argc,char** argv){ connect("10.0.0.30",6379,1500000); luaCommand(argv); return 0;}


