Redis多个连接和多个incr调用,不会丢失数据

时间:2016-12-06 14:42:31

标签: laravel redis connection laravel-5.2

所以我有Laravel 5.2项目,其中Redis用作缓存驱动程序。

有一个控制器,它有一个连接Redis的方法,每次调用此方法时都会增加一个值并为该值添加值,就像

一样
$redis = Redis::connection();
$redis->incr($value);
$redis->sadd("set", $value);

但问题是有时会有很多连接和许多同时调用此方法,并且存在数据丢失,因为如果两个调用者在$value为2时调用此方法,则在{{ 1}}它将变为3,但应该是4(基本上在incr之后)。

我考虑过使用Redis事务,但我无法想象何时应该调用incr命令来启动队列以及何时调用multi

我还有一个想法是将所有execincr作为字符串收集到另一个集合,然后用sadd进行交易,但这会花费太多RAM。

那么,有什么建议,如何避免这种数据丢失?

1 个答案:

答案 0 :(得分:0)

Laravel使用Predis作为Redis驱动程序。

要使用Predis执行事务,您必须调用驱动程序的事务方法并为其提供回调:

$responses = $redis->transaction(function ($tx) {
  $redis->incr($value);
  $redis->sadd("set", $value);
});