所以我有Laravel 5.2项目,其中Redis用作缓存驱动程序。
有一个控制器,它有一个连接Redis的方法,每次调用此方法时都会增加一个值并为该值添加值,就像
一样$redis = Redis::connection();
$redis->incr($value);
$redis->sadd("set", $value);
但问题是有时会有很多连接和许多同时调用此方法,并且存在数据丢失,因为如果两个调用者在$value
为2时调用此方法,则在{{ 1}}它将变为3,但应该是4(基本上在incr
之后)。
我考虑过使用Redis事务,但我无法想象何时应该调用incr
命令来启动队列以及何时调用multi
。
我还有一个想法是将所有exec
和incr
作为字符串收集到另一个集合,然后用sadd
进行交易,但这会花费太多RAM。
那么,有什么建议,如何避免这种数据丢失?
答案 0 :(得分:0)
Laravel使用Predis作为Redis驱动程序。
要使用Predis执行事务,您必须调用驱动程序的事务方法并为其提供回调:
$responses = $redis->transaction(function ($tx) {
$redis->incr($value);
$redis->sadd("set", $value);
});