laravel - Redis多连接多次incr调用不丢数据

标签 laravel redis connection laravel-5.2

所以我有 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 它。

我还有一个想法,将所有 incrsadd 作为字符串收集到另一组,然后使用 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/

相关文章:

php - 拉维尔 5.5 : array_combine(): Both parameters should have an equal number of elements

php - 如何使用带有 laravel 的 Redis 和 Nodejs 广播消息

ruby-on-rails - Redis 服务器强制执行 AUTH,但未配置为 requirepass

spring - Spring Boot和Elasticsearch-无法获取{#transport#-1}的节点信息

php - Laravel 加载更多未按预期工作

php - Laravel 与外键的 Eloquent 关系

java - 如何仅在运行时(即运行 JUnit 时)实例化 redis 实例

forms - Xamarin.Forms预览器 "Connection is closed"

c++ - FPS游戏ping实现

mysql - Laravel 数据库返回未定义索引错误