ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# :-: **redis的使用** ### 悲观锁 解释:悲观锁(Pessimistic Lock), 顾名思义,就是很悲观。 每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁。 场景:如果项目中使用了缓存且对缓存设置了超时时间。 当并发量比较大的时候,如果没有锁机制,那么缓存过期的瞬间, 大量并发请求会穿透缓存直接查询数据库,造成雪崩效应。 ### 乐观锁 监控key,就是一个或多个key添加一个乐观锁 在此期间如果key的值如果发生的改变,则不能为key设定值 exec,discard,unwatch命令都会清除连接中的所有监视。 ``` mssql类型 <?php $error_level = error_reporting(0); $con = new mysqli('localhost','root','root','test'); if(!$con){ echo "数据库连接失败"; } $sql = "select * from products where id=1"; $result = mysqli_query($con,$sql); $aa= mysqli_fetch_row($result); if($aa[3]>0){ sleep(1); $sql = "update products set store=store-1 where id=1"; if(mysqli_query($con,$sql)){ echo "更新成功"; } }else{ echo "没有库存"; } ``` ``` <?php // ini_set('default_socket_timeout', -1); $redis =new Redis(); $redis->connect("127.0.0.1", 6379); $redis->watch('sales');//乐观锁 监视作用 set() 初始值0 $sales=$redis->get('sales'); $n=100; if($sales>=$n){ exit('秒杀结束'); } //开启事务 $redis->multi(); $redis->incr('sales'); //将 key 中储存的数字值增一 ,如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。 $res=$redis->exec(); //成功1 失败0 if($res){ //秒杀成功 include 'db.php'; $sql="update products set store=store-1 where id=1"; if($mod->exec($sql)){ echo "秒杀完成"; } }else{ exit('抢购失败'); } ```