为什么我无法在Redis的事务中获取缓存数据?

康士甸

我正在用PHP编写一个彩票程序,因为这个程序会有很大的并发请求,我每个奖项的数量有限,在这个例子中是10个。我不想看到任何奖金超过股票。所以我把整个逻辑放在Redis的事务中(我使用predis(https://github.com/nrk/predis)作为我的PHP redis客户端),但它不起作用,在对该程序的请求超过10次之后, 我在数据库中发现了 10 多条我无法理解的记录。有谁知道原因吗?非常感谢您的解释,谢谢!

这是我的 PHP 代码:

$this->load->model('Lottery_model');
$money = $this->_get_lottery();//which prize do you get 
if($money > 0){
    $key = $this->_get_sum_key($money);
    $dbmodel = $this->Lottery_model;
    // Executes a transaction inside the given callable block:
    $responses = $redis->transaction(function ($tx) use ($key, $money, $dbmodel){
        $qty = intval($tx->get($key));
        if($qty < 10){
            //not exceed the stock limit
            $dbmodel->add($customer, $money);  // insert record into db
            $tx->incr($key);
        }else{
            log_message('debug', $money . ' dollar exceed the limit');
        }
    });
    }else{
        log_message('debug', 'you are fail');
    }

阅读有关Redis事务的文档后,我知道上面代码的用法是完全错误的。然后我将其修改为以下版本,使用乐观锁和检查设置。

$options = array(
    'cas' => true,      // Initialize with support for CAS operations
    'watch' => $key,    // Key that needs to be WATCHed to detect changes
    'retry' => 3,    
);
try{
    $responses = $redis->transaction($options, function ($tx) use ($key, $money, $username, $dbmodel, &$qty){
    $qty = intval($tx->get($key));
    if($qty < 10){
        $tx->multi();
        $tx->incr($key);
        $dbmodel->add($username, $money);// insert into mysql db
    }else{
        log_message('debug', $money . ' dollar exceed the limit');
    }
});
}catch(PredisException $e){
    log_message('debug', 'redis transaction failed');
}

但问题是数据库中的记录数超过了奖品的限制,Redis中保存的总数不会。解决此类问题的常见解决方案是什么?在这种情况下,我必须锁定 INNodb 表吗?

伊塔马尔·哈伯

您需要了解 Redis 事务的工作原理 - 简而言之,所有进行事务的命令都由客户端(在您的情况下为 predis)缓冲,然后立即发送到服务器。您的代码尝试get在事务执行之前使用读取请求 ( )的结果更多详情请参考文档:https : //redis.io/topics/transactions

要么读取qty事务外部,并用于WATCH防止竞争更新,要么将此逻辑整体移至 Lua 脚本。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我无法从我之前设置的单例数组中获取数据?

来自分类Dev

为什么我无法从mongodb数据库获取数据?

来自分类Dev

为什么我无法写入从数据库中获取的对象?

来自分类Dev

为什么我无法使用Jooq的into方法获取类中的数据库字段值?

来自分类Dev

在 D3 v5 JS 中读取 CSV:为什么我无法获取数据?

来自分类Dev

为什么我无法在请求方法中从正文中获取数据

来自分类Dev

为什么我无法获取数据库lastrowid?

来自分类Dev

为什么我无法从JSON获取数据值-Flutter

来自分类Dev

为什么我的函数无法从JSON文件获取数据?

来自分类Dev

为什么我无法获取 zebpay Api 数据?

来自分类Dev

为什么我无法从此jsonp响应中获取位置?

来自分类Dev

为什么我的函数无法从提取中获取结果?

来自分类Dev

为什么我无法从android获取php中的值?

来自分类Dev

为什么我无法在AngularJs工厂中获取更新值?

来自分类Dev

为什么我无法从文本框中获取值?

来自分类Dev

为什么我无法在控制器中获取参数?

来自分类Dev

为什么我在文件中获取垃圾数据?

来自分类Dev

为什么我存储在缓存中的数据已在asp.net中删除

来自分类Dev

为什么我无法在适配器中接收数据

来自分类Dev

为什么我的程序无法从文件中读取数据

来自分类Dev

为什么我无法在引导表中填充json数据

来自分类Dev

为什么我无法访问JSON中的数据?

来自分类Dev

为什么我无法在 ListView 中显示 Firebase 数据

来自分类Dev

为什么我无法从数据框中获取饼图。TypeError:“ str”和“ int”的实例之间不支持“ <”

来自分类Dev

为什么 Chrome 应用无法加载我的离线缓存清单

来自分类Dev

为什么我的Redis缓存不能在Spring-Boot / Spring-Data应用程序中工作?

来自分类Dev

为什么我无法通过绑定获取数据到我的 AngularJS 组件?

来自分类Dev

为什么我无法获取输入值?

来自分类Dev

为什么一个新的线程无法看到主线程中的事务春季JUnit测试准备测试数据?

Related 相关文章

  1. 1

    为什么我无法从我之前设置的单例数组中获取数据?

  2. 2

    为什么我无法从mongodb数据库获取数据?

  3. 3

    为什么我无法写入从数据库中获取的对象?

  4. 4

    为什么我无法使用Jooq的into方法获取类中的数据库字段值?

  5. 5

    在 D3 v5 JS 中读取 CSV:为什么我无法获取数据?

  6. 6

    为什么我无法在请求方法中从正文中获取数据

  7. 7

    为什么我无法获取数据库lastrowid?

  8. 8

    为什么我无法从JSON获取数据值-Flutter

  9. 9

    为什么我的函数无法从JSON文件获取数据?

  10. 10

    为什么我无法获取 zebpay Api 数据?

  11. 11

    为什么我无法从此jsonp响应中获取位置?

  12. 12

    为什么我的函数无法从提取中获取结果?

  13. 13

    为什么我无法从android获取php中的值?

  14. 14

    为什么我无法在AngularJs工厂中获取更新值?

  15. 15

    为什么我无法从文本框中获取值?

  16. 16

    为什么我无法在控制器中获取参数?

  17. 17

    为什么我在文件中获取垃圾数据?

  18. 18

    为什么我存储在缓存中的数据已在asp.net中删除

  19. 19

    为什么我无法在适配器中接收数据

  20. 20

    为什么我的程序无法从文件中读取数据

  21. 21

    为什么我无法在引导表中填充json数据

  22. 22

    为什么我无法访问JSON中的数据?

  23. 23

    为什么我无法在 ListView 中显示 Firebase 数据

  24. 24

    为什么我无法从数据框中获取饼图。TypeError:“ str”和“ int”的实例之间不支持“ <”

  25. 25

    为什么 Chrome 应用无法加载我的离线缓存清单

  26. 26

    为什么我的Redis缓存不能在Spring-Boot / Spring-Data应用程序中工作?

  27. 27

    为什么我无法通过绑定获取数据到我的 AngularJS 组件?

  28. 28

    为什么我无法获取输入值?

  29. 29

    为什么一个新的线程无法看到主线程中的事务春季JUnit测试准备测试数据?

热门标签

归档