所以我有 Laravel 5.2 项目,其中 Redis 用作缓存驱动程序。
有一个controller,它有一个连接Redis的方法,每次调用这个方法都会增加一个值,给set增加一个值,就像
$redis = Redis::connection();
$redis->incr($value);
$redis->sadd("set", $value);
但问题是有时候连接很多,同时调用这个方法很多,会出现数据丢失,因为如果两个调用者都调用了这个方法,而$value
是2 ,在incr
之后会变成3,但是应该是4(基本上是在两次incr
之后)。
我想过使用 Redis 事务,但我无法想象什么时候应该调用 multi
命令来启动队列以及什么时候 exec
它。
我还有一个想法,将所有 incr
和 sadd
作为字符串收集到另一组,然后使用 cron job
处理它们,但它会花费太多 RAM。
那么,有什么建议,如何避免这种数据丢失?
最佳答案
Laravel 使用 Predis作为 Redis 驱动程序。
要使用 Predis 执行事务,您必须调用驱动程序的事务方法并为其提供回调:
$responses = $redis->transaction(function ($tx) {
$redis->incr($value);
$redis->sadd("set", $value);
});
关于laravel - Redis多连接多次incr调用不丢数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40997997/