php redis setnx分布式锁简单原理解析

2025-05-27 0 75

我就废话不多说了,大家还是直接看代码吧~

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42
<?php

//高并发分布式锁

header("Content-type:text/html;charset=utf-8");

$redis = new Redis();

$redis->connect('127.0.0.1', 6379);

echo "Connection to server sucessfully";

//echo $redis->get("name");exit;

$expire = 1;

$key = 'test1';

$lock = false;

$is_lock=$redis->setnx($key,time()+$expire);

if(!$is_lock){

$lock_time=$redis->get($key);

//锁已过期,重置

if($lock_time<time()){

$redis->del($key);

$lock_time=$redis->get($key);

$is_lock=$redis->setnx($key,time()+$expire);

}

}

$is_lock ? true : false;

if($is_lock){

writeFile("正常访问"."\\n");

}else{

writeFile("系统繁忙"."\\n");

}

function writeFile($data,$type='a'){

//sleep(1);

//usleep(500000);//假设暂停 500毫秒

$filename = date("Ymd").".log";

$handle =@ fopen($filename, $type);

flock($handle, LOCK_EX);

ob_start();

echo "\\n" . "[SQL]" . "\\n";

print_r ($data);

$string = ob_get_contents();

ob_end_clean();

$fettle = @fwrite($handle, $string);

fclose($handle);

@chmod($filename,0777);

}

补充知识:php redis set 单机锁

如果一个请求更新缓存的时间比较长,甚至比锁的有效期还要长,导致在缓存更新过程中,锁就失效了,此时另一个请求会获取锁,但前一个请求在缓存更新完毕的时候,如果不加以判断直接删除锁,就会出现误删除其它请求创建的锁的情况,所以我们在创建锁的时候需要引入一个随机值:

?

1

2

3

4

5

6

7

8

9
$ok = $redis->set($key, $random, array('nx', 'ex' =>5));

if ($ok) {

$cache->update();

if ($redis->get($key) == $random) {

$redis->del($key);

}

}

以上这篇php redis setnx分布式锁简单原理解析就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持快网idc。

原文链接:https://www.cnblogs.com/zhangjian816/p/10849504.html

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 php redis setnx分布式锁简单原理解析 https://www.kuaiidc.com/70449.html

相关文章

发表评论
暂无评论