有没有办法在Redis中进行条件设置?
我想使用Redis缓存一些对象。缓存的每个用户(服务器程序)都将检查对象,并在对象具有更新版本时对其进行更新。我需要确保在更新步骤中,只有最新版本才真正保存在Redis中。
您可以编写一个lua脚本,该脚本将检查密钥的当前值,如果该值与新密钥不同,则将其更改。我在c中添加了一个通过c程序调用lua脚本的示例,并完成了所需的工作。
//g++ -g -o condition condition.cpp -I/usr/local/include/hiredis -L/usr/local/lib -levent -lhiredis
/*----------------------
EVAL
------------------------*/
#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 set
string 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;
}
问题内容: 我在Postgres 11.3数据库中有一个带有列的表。 尝试更新嵌套数组名称中的所有对象。 如果路径是对象,则应将路径从对象更新为具有以下值的字符串: 如果不存在该路径,则该对象应保持不变。 使用查询测试设置:小提琴链接 所需结果: 我已经修改了查询并链接到小提琴中。有人可以看看是否正确吗? 问题答案: 平原应该有所作为。 db <>在这里 拨弄 (Postgres 11!) 为了同
文档中缺少这方面的信息。 这个假设正确吗?
问题内容: 我在安装项目时遇到了一些问题。 我拥有运行 Swift 3* 的最新版本的 Xcode ,并且当我尝试安装alamofire时遇到800个编译器错误。 * 显然地 构建Alamofire 4.0.0+需要CocoaPods 1.1.0+ 我看着终端机上的CocoaPods版本,它说我的版本是1.0.1。 我猜运行更新没有用,因为CocoaPods 1.1是beta版。 因此,我不确定如
我的工件版本如下所示: 1.0.0-快照 我想使用maven release插件将工件部署到releases存储库,使用以下版本:1.0.0.1234,其中1234是最新的svn修订号。 这可能吗? 我试图使用org检索svn修订号。科德豪斯。mojo:buildnumber maven插件并添加以下部分: 但是当我运行以下命令时: 看起来版本设置为1.0.0$改为标记中的{buildNumber
最近我和Laravel一起工作。我使用作曲家来安装包和工匠的命令。 问题是我的机器使用的是Laravel 5.4而不是5.7。 当我运行phpinfo()时,结果是PHP版本7.2.7。您是否认为问题在于我没有使用最新版本的xampp,其中包含PHP7?
问题内容: 使用in 时可以执行更新吗?例如: 问题答案: 有一个非常强大的功能,称为: [15.4。DML风格的操作](http://docs.jboss.org/hibernate/orm/4.3/manual/en- US/html/ch15.html#batch-direct) 来自doc的小引用: …但是,Hibernate提供了通过Hibernate查询语言执行批量SQL样式DML语句