美文网首页
php解决并发操作:LuaScripts

php解决并发操作:LuaScripts

作者: 段义纬 | 来源:发表于2019-03-26 20:54 被阅读0次

1、文档:https://redis.io/commands/eval#atomicity-of-scripts

2、异步操作同一个代码块时,比如多个队列,恰巧有两个一起被触发,会在mysql读取到脏数据,虽然在laravel中可以使用lockForUpdate避免,但是若有很多并发队列,会造成这条记录一直处于被锁的状态,以至于其他地方无法正常获取数据。因为如果get()和set的操作不是原子性的,会造成很小概率的,第二条队列在第一条set()之前get()了,导致无法锁上,所以采用以下方式加锁。

private function getLock($key)
    {
        // 解决并发导致的Jpush重复发送
        return $this->redis->eval(
            $this->preventRepeated(),
            1,
            $key
        );
    }

    private function preventRepeated()
    {
        return <<<'LUA'
            local hash = redis.call('get', KEYS[1])
            
            if hash then
                return 0
            else
                redis.call('set',KEYS[1],1)
                return 1
            end
LUA;
    }

    private function releaseLock($keys)
    {
        $this->redis->del($keys);
    }

3、今天又看到laravel官方文档
https://learnku.com/docs/laravel/5.7/queues/2286#max-job-attempts-and-timeout
中使用的 频率限制 的框架封装的 funnel 方法 ,是一个道理,都是循环获取锁进行sleep操作。

相关文章

  • php解决并发操作:LuaScripts

    1、文档:https://redis.io/commands/eval#atomicity-of-scripts ...

  • PHP高并发高负载系统架构

    一、高并发和高负载的约束条件 硬件 部署 操作系统 Web 服务器 PHP MySQL 测试 二、解决之道——硬件...

  • (转)php处理高并发的方案

    一、高并发和高负载的约束条件 硬件 部署 操作系统 Web 服务器 PHP MySQL 测试 二、解决之道——硬件...

  • 经典多线程同步问题详解

    前言 多线程同步问题是操作系统课程重点内容,是所有程序员解决并发问题无法绕开的一个领域,当然PHP、NodeJS例...

  • 闲言之PHP不支持多线程??

    前言 为什么考虑到多线程呢?--------为了有效率的解决并发问题; 那怎么将多线程应用结合到PHP应用解决并发...

  • 7.高并发大流量

    php如何解决网站大流量,高并发的问题? 考点 高并发架构相关概念 高并发:通常是指并发访问,也就是在某个时间点,...

  • PHP高并发和大流量怎么解决?

    PHP高并发和大流量的解决方案 一 高并发的概念 在互联网时代,并发,高并发通常是指并发访问。也就是在某个时间点,...

  • 高并发系列文章第一篇:高并发和大流量解决方案

    本文将从宏观的角度上全方位剖析高并发和大流量解决方案 从一个面试题开始讲解:PHP如何解决网站大流量与高并发的问...

  • Java中的管程模型

    操作系统使用信号量解决并发问题,Java选择使用管程(Monitor)解决并发问题。信号量和管程是等价的,可以使用...

  • redis 面试题

    技巧:1、redis + lua 解决高并发场景下的写操作2、redis 分布式锁,防止并发写3、redis 队列...

网友评论

      本文标题:php解决并发操作:LuaScripts

      本文链接:https://www.haomeiwen.com/subject/cwonvqtx.html