PHP中redis加锁和解锁的简单实现

背景说明

在程序开发过程中,通常会遇到需要独占式的访问一些资源的情形,比如商品秒杀时扣减库存。这时就需要对资源加锁。实现锁的方式有很多,比如数据库锁、文件锁等等。本文简单介绍PHP中使用redis来实现加锁和解锁。实现方式参考了redis官方文档。

示例代码

代码环境:单redis实例,PHP5.6及以上,且需开启redis扩展

    $redis = new \Redis();
    $redis->connect(‘127.0.0.1‘);

    $lockKey = ‘lock_key‘;
    $randValue = rand(10000, 99999);

    //lock
    $lock = $redis->set($lockKey, $randValue, [‘NX‘, ‘EX‘=>1]);
    if($lock) {
        //do something

        //unlock
        $script = ‘
            if redis.call("get",KEYS[1]) == ARGV[1] then
                return redis.call("del",KEYS[1])
            else
                return 0
            end
        ‘;
        $redis->eval($script, [$lockKey, $randValue], 1);
    }

代码说明

这段代码会在资源未被锁定(NX选项)时获取锁,同时设定了1s的过期时间(EX)选项,可在代码出错或超时情况下自动释放锁。值被设定为一个随机数,且执行lua脚本来解锁,就不会误释放其它用户加的锁。

分布式锁的实现可参考 https://redis.io/topics/distlock

原文地址:https://www.cnblogs.com/cnsr/p/9645995.html

时间: 2024-08-30 16:42:51

PHP中redis加锁和解锁的简单实现的相关文章

Redis加锁与解锁

Redis加锁 customerM = BaseMemCached.setMLock(customerId); /** * 个人账户表加锁 **/ public static CustomerM setMLock(Integer userId){ CustomerM customerM = (CustomerM)setLock(USER_M_USERID+userId, CustomerM.class); customerM.setAddPiggy(0); customerM.setAddPay

Redis分布式锁的正确加锁与解锁方式

现在的业务场景越来越复杂,使用的架构也就越来越复杂,分布式.高并发已经是业务要求的常态.像腾讯系的不少服务,还有CDN优化.异地多备份等处理. 说到分布式,就必然涉及到分布式锁的概念,如何保证不同机器不同线程的分布式锁同步呢? 实现要点 互斥性,同一时刻,只能有一个客户端持有锁. 防止死锁发生,如果持有锁的客户端因崩溃而没有主动释放锁,也要保证锁可以释放并且其他客户端可以正常加锁. 加锁和释放锁必须是同一个客户端. 容错性,只要redis还有节点存活,就可以进行正常的加锁解锁操作. 正确的red

sql语句对数据库表进行加锁和解锁

锁是数据库中的一个非常重要的概念,它主要用于多用户环境下保证数据库完整性和一致性. 我们知道,多个用户能够同时操纵同一个数据库中的数据,会发生数据不一致现象.即如果没有锁定且多个用户同时访问一个数据库,则当他们的事务同时使用相同的数据时可能会发生问题.这些问题包括:丢失更新.脏读.不可重复读和幻觉读: 1.当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题.每个事务都不知道其它事务的存在.最后的更新将重写由其它事务所做的更新,这将导致数据丢失.例如,两个编辑人员制作了

Redis系列-远程连接redis并给redis加锁

假设两台redis服务器,ip分别为:192.168.1.101和192.168.1.103,如何在101上通过redis-cli访问103上的redis呢?在远程连接103之前,先讲下redis-cli的几个关键参数: 用法:redis-cli [OPTIONS] [cmd [arg [arg ...]]] -h <主机ip>,默认是127.0.0.1 -p <端口>,默认是6379 -a <密码>,如果redis加锁,需要传递密码 --help,显示帮助信息 通过对

Redis集群搭建与简单使用【转】

Redis集群搭建与简单使用 安装环境与版本 用两台虚拟机模拟6个节点,一台机器3个节点,创建出3 master.3 salve 环境. redis 采用 redis-3.2.4 版本. 两台虚拟机都是 oracle linux 6.6 ,一台(IP:192.168.31.245),一台(IP:192.168.31.210) . 安装过程 1. 下载并解压 cd /root/software wget http://download.redis.io/releases/redis-3.2.4.t

Linux下互斥量加锁与解锁操作的C代码实现

一.概述 在实际的软件程序中,由于代码量较大,函数之间的调用关系较为复杂,因此对于某些全局变量的操作要格外小心.在程序中,一般采用互斥量加锁的方式来保证对全局变量的操作的唯一性. 本文详细介绍了Linux下互斥量加锁与解锁操作的C代码实现,为相关的软件开发工作的开展提供了有益的参考. 二.加锁与解锁函数及时间结构体介绍 1.加锁函数pthread_mutex_timedlock 函数原型:int pthread_mutex_timedlock(pthread_mutex_t *restrict

redis的java客户端Jedis简单封装

经过我们团队的一番讨论,最终决定使用redis来进行我们的业务缓存.redis会将数据缓存到内存中,运行效率会很快.同时异步将数据写入到磁盘中,进行持久化. 且redis支持主从同步,支持分布式部署,支持N多数据结构,这对于我们有着莫大的吸引力. 参见:http://blog.csdn.net/yichenlian/article/details/27207383 我们团队讨论的焦点是在于redis的灾备恢复问题.由于redis的持久化是异步的,总会有一点时间内存中数据和磁盘数据不同步的情况(当

Redis之五种数据类型的简单增删改查

开心一笑 乌龟受伤.让蜗牛去买药.过了2个小时.蜗牛还没回来.乌龟急了骂道:他妈的再不回来老子就死了!这时门外传来了蜗牛的声音:你他妈再说老子不去了! 提出问题 Redis五种数据类型的简单增删改查命令??? 解决问题 假设你已经安装Redis服务器: 假设你已经打开Redis cli命令行工具: 假设你对Redis有所了解: Redis简单增删改查例子 例一:字符串的增删改查 #增加一个key为ay_key的值 127.0.0.1:6379> set ay_key "ay" O

laravel中redis的配置和使用

引入redis composer require predis/predis 会在composer.json中引入最新版本的predis composer update 把下载predis 库加入到vendor,命令执行成功后,如图: 配置redis 说到laravel 中redis 的配置,其实默认项目中已经有了相关配置,只是默认没有使用.默认使用的是: 项目 使用类型 CACHE_DRIVER file SESSION_DRIVER file 添加redis数据库使用 'redis' =>