搜公众号
推荐 原创 视频 Java开发 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库
Lambda在线 > 极客攻略 > redis乐观锁悲观锁实现秒杀

redis乐观锁悲观锁实现秒杀

极客攻略 2018-12-31
举报

乐观锁实现秒杀

 1header('content-type:text/html;charset=utf-8');  
2$redis = new Redis();  
3$result = $redis->open('192.168.1.236'6379 , 5 );  
4$redis -> auth('likang');  
5//var_dump($redis -> set( 'b' , 123 ));  
6//var_dump( $redis -> get('b') );  
7//var_dump( $result );exit;  
8//echo "<pre>";  
9echo "页面被访问了" . $redis->incr('ci'). '<br>';  
10echo '总共抢到了' . $redis->lLen('s_kill') . '<br>';  
11echo '剩余数量' . $redis->get('s_kill_number'). '<br>';  
12
13//乐观锁 
14$redis ->  watch('s_kill_number');   
15$num_ber = $redis -> get('s_kill_number');  

//开始redis事务(redis事务与mysql不同没有回滚机制,如果事务里的一条命令出现了运行错误,事务里其他的命令依然会继续执行。可以用DISCARD回滚)

 1$redis -> multi();  
2
3//print_r( $redis->lGetRange('s_kill',0 , $redis ->lLen('s_kill')));  
4//var_dump($num_ber);exit;  
5
6if ( $num_ber > 0) {  
7    $redis->decr('s_kill_number');  
8    $redis->lPush('s_kill'rand(10009999));  
9    $redis -> exec();  //  执行事务
10    exit('OK''<br>');  
11else {  
12    $redis -> exec();  
13    exit('抢光了''<br>');  
14}  

RedisPHP中的基本使用案例
http://blog.csdn.net/helencoder/article/details/51275759

悲观锁实现秒杀

思路:

1、一个任务在同一时间段内只能被一个用户所持有;

2、避免出现死任务,即避免任务被用户长时间占有,无法释放。

设置一个锁的key,setnx是原子操作,只能一个进程写入成功,写入成功返回true(表示获取锁权限),然后写入内容立即释放锁即删除锁key。如果只用SETNX命令设置锁的话,如果当持有锁的进程崩溃或删除锁失败时,其他进程将无法获取到锁,问题就大了。获取不到锁的进程去判断锁的剩余有效时间,如果为-1,那么表示没有设置过期时间,则设置锁的有效时间为5秒(预留5秒给拿到锁的进程处理时间,足够多了),返回true,等待锁删除。

 1<?php
2$lock_key = 'LOCK_PREFIX' . $redis_key;
3$is_lock = $redis->setnx($lock_key, 1); // 加锁
4if($is_lock == true){ // 获取锁权限
5    $redis->setex($redis_key, $expire, $data); // 写入内容
6    // 释放锁
7    $redis->del($lock_key);
8}else{
9    // 防止死锁
10    if($redis->ttl($lock_key) == -1){
11        $redis->expire($lock_key, 5);
12    }
13    return true// 获取不到锁权限,直接返回
14}
15

欢迎订阅


版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《redis乐观锁悲观锁实现秒杀》的版权归原作者「极客攻略」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

关注极客攻略微信公众号

极客攻略微信公众号:ll18311162654

极客攻略

手机扫描上方二维码即可关注极客攻略微信公众号

极客攻略最新文章

精品公众号随机推荐

举报