连连科技广东(Redis实现分布式锁)
用户投稿
•
•
阅读 97
连连科技广东:Redis实现分布式锁。

一、背景:
在高并发情况下,不加锁时,会导致重复插入数据等问题。 此时一般的解决方法是添加锁。Mysql表锁或文件锁。 但这两种锁有不足的的地方:
Mysql锁:在锁表的过程中只能操作锁住的表,如果有多表需要锁住多个表,这很影响性能,特别高并发情况下很容易导致mysql瘫痪。
文件锁:分布式环境中,文件锁的文件可能不在同一个服务器。此时锁只能解决访问同一个服务器的并发问题。不同服务器之间还是会有重复插入数据的情况发生。只是概率小很多。
综上所述,分布式锁就是为了解决以上情况的。
二、原理:
分布式锁是控制分布式系统或不同系统之间共同访问共享资源的一种锁实现;
分布式锁需要具备以下条件:
- 互斥性:在任意一个时刻,只有一个客户端持有锁。
- 无死锁:即便持有锁的客户端崩溃或者其他意外事件,锁仍然可以被获取。
- 容错:只要大部分Redis节点都活着,客户端就可以获取和释放锁
这次我们使用Redis的setnx命令来实现:
SETNX key value
将 key 的值设为 value,当且仅当 key 不存在。若给定的 key 已经存在,则 SETNX 不做任何动作。
返回值:
- 1,当 key 的值被设置 - 0,当 key 的值没被设置
举例:
redis> SETNX mykey "hello" (integer) 1 redis> SETNX mykey "hello" (integer) 0 redis> GET mykey "hello" redis>
三、分布式锁实现:
class RedisLock { protected $redis = null; private $lockExpire = 10; //锁有效时间 private $lockKey = ‘gl_frame:lock:’; private $status = true; public function __construct() { $this->redis = new Redis(); $this->redis->connect(‘127.0.0.1’, 6379, 60); } /** * 加锁 * @return bool */ public function lock($key) { while($this->status){ $lockValue = time() + $this->lockExpire; $lockKey = $this->lockKey . $key; $lock = $this->redis->setnx($lockKey, $lockValue); if(!empty($lock) || ($this->redis->get($lockKey) < time() && $this->redis->getSet($lockKey, $lockValue) < time() )){ $this->redis->expire($lockKey, $this->lockExpire); return true; } } return false; //$this->lock($key); } /** * 关闭锁 */ public function dellock($key) { $lockKey = $this->lockKey . $key; if($this->redis->ttl($lockKey)) { $this->redis->del($lockKey); } $this->status = false; } }
四、锁调用调用:
$lock = new appcommoncontrollerRedisLock(); $status = $lock->lock(‘gl_frame:test:’); $data = [ ‘name’ => ‘objui’.$i ]; $name = Db::name(‘test’)->where(‘name’,$data[‘name’])->value(‘name’); if($name == null) { Db::name(‘test’)->insert($data); } } $lock->dellock(‘gl_frame:test:’ . $data[‘name’]);
随机文章
站长导航友情链接交换
搜素引擎算法
关键词排名优化
GEO培训
SEO小小课堂网
站长导航
搜素引擎算法
百度搜索“网赚联盟”即可找到本站,微信搜索“小小课堂网”关注小小课堂网公众号。网赚联盟( wangzhuan.org.cn )欢迎用户投稿,发布者:用户投稿,文章版权归作者所有,投稿文章不代表网赚联盟立场,中二少年发布为网赚联盟原创文章,转载请注明出处:https://wangzhuan.org.cn/24818.html

微信扫一扫
支付宝扫一扫