我已经在单个REDIS实例中成功地使用multi和exec功能在Redis中实现(并测试)了事务操作。但是,在集群设置中运行的相同代码会出错并显示以下异常消息。我正在使用spring-data-redis-1.8.1.RELEASE和jedis-2.9.0。Exceptioninthread"main"org.springframework.dao.InvalidDataAccessApiUsageException:MUTLIiscurrentlynotsupportedinclustermode.atorg.springframework.data.redis.connection
因为我想在redis中使用事务。我已阅读redis事务的文档并在下面找到。WATCHmykeyval=GETmykeyval=val+1MULTISETmykey$valEXEC但我的问题是,如果Redis事务是按顺序和原子执行的,那么我们不能使用以下语句实现上述相同的行为吗?MULTIval=GETmykeyval=val+1SETmykey$valEXEC谢谢, 最佳答案 不,您无法实现。使用MULTI和EXEC,您可以在服务器端原子地运行多个命令,并在之后获取这些命令的所有回复>EXEC返回。在您的情况下,val=val+1必
使用Redis,我想执行命令的原子序列,即我需要保证在执行序列时没有其他客户端会在数据库中执行更改。如果我只使用write命令,我可以使用MULTI和EXEC语句来确保使用事务的原子性。但是,我还想在我的交易中使用read命令。因此我不能使用MULTI,因为读取命令也在排队!基本上,以原子方式,我需要执行以下操作:从数据库中读取x,基于x,将f(x)存入数据库。1.和2.都应该是单个原子事务的一部分。有没有简单的方法可以做到这一点? 最佳答案 您的问题有两个很好的解决方案。选项1:您需要在您正在读取的key上发出一个WATCH。您的
Redis专家,我想通过某种类型的资源搜索空闲数据,然后将其标记为非空闲,所有这些都在一个命令中(原子)。我正在使用Redis来记录不同类型的事件资源。我应该如何解决我的这个问题,我需要通过查询一些字段值来获取哈希数据,我已经创建了自己的集合并使用sinter然后更新它以将其标记为正在使用。这是引用如何使用sethttp://robots.thoughtbot.com/redis-set-intersection-using-sets-to-filter-data在redis中进行过滤假设我想找到一个类型为X且属性为A的空闲资源的ID,我通过在type集和attributeA上使用in
我有一个执行以下操作的Node.js应用程序:从Redis获取数据对数据进行预计算将新结果写回Redis这个过程每秒可能发生几次。我现在面临的问题是我希望运行此过程的多个实例,并且由于每个Node在另一个Node获得最后一个值后更新,我显然看到更新的日期已过时。如何使上述过程原子化?我无法将操作添加到Redis中的事务,因为我需要在处理和更新之前获取数据(这会强制提交)。谁能给个建议? 最佳答案 对于问题不够清晰,我们深表歉意。进一步阅读后,我确实可以使用事务,但我一直难以理解的地方是我需要将读取与更新分开,并且只需将更新包装在事务
我只想使用'llen"someKey"'返回值(列表计数)在一次交易中添加'rpush'值。varcount=llen"keys"rpush"keys"count我如何使用这一笔交易? 最佳答案 您将不得不使用Lua在单个事务中执行这两个命令。该命令将是这样的:eval"locallen=redis.call('llen','someKey');redis.call('rpush','keys',len);"2someKeykeys请注意,最后一个参数是过程中涉及的键数及其列表。如果您有许多Redis实例,这将很有用。
实际上,我正在使用优秀的库redis-node。但是,我不知道如何使以下情况起作用:我有一个由参数传递的数量字段,然后,在一个for循环中,我需要使用LPOP从第一个列表中提取项目,然后RPUSH到另一个列表中,数量必须相同,都在一个交易区block。那么,如果数量参数和提取的项目不同,我不想丢弃交易,这可能吗?我放了一段我现在的代码。varredisNode=require('redis-node');varclient=redisNode.createClient();varqty=req.params.qty;//inittransaction,lpopfirstandrpush
我正在使用redis-node库(http://github.com/bnoguchi/redis-node),要求如下:我有一组编号的项目[1,2,3](这些项目不能重复),我需要按请求的项目数量POP/PUSH到另一个列表,主列表的第一个并推送进入另一个列表。所以,我认为更好的选择可以是排序集,因为项目不能相同,但我没有同时弹出和添加的方法(这必须在事务中block),我需要弹出列表/集合的第一个项目,而不是随机的。最好的方法是什么? 最佳答案 如果您希望以原子方式(非事务性)做某事,那么您可以支持luascripts.此外,r
假设food_dict是字典,用于在购物车中存储商品,{:}(一车可能包含多种食物)我已经将食物提前存储在了redis中:r.hset('food:',{'price':,'stock':})在订购cart时,我必须确保stock大于count。基本实现:fork,vinfood_dict.iteritems():_stock=int(redis_db.hget('food:'+str(k),'stock'))ifv>_stock:#Ihavetorollbackthedecrementofstockbreakelse:redis_db.hset('food:'+str(k),'sto
我必须要有一些东西(可能是一个列表,排序集,也许是一个简单的字符串)包含各种数字(不重复),我需要能够切换一些例如列表:LRANGEtodo:200-1=>"2""5""6""7"做我的转换:即MULTILRANGEtodo:2001=>"2""5"(storethem)LSETtodo:200"5"LSETtodo:201"2"EXEC最终结果:LRANGEtodo:200-1=>"5""2""6""7"有什么方法可以让我以更简单(或更好)的方式做到这一点,或者这是REDIS的“限制”? 最佳答案 您可以使用SORT命令。将这些索