深入研究php的redlock算法为了应对服务器高并发,可以采用锁进行控制 。
如果redis是单节点部署,基本上不会出现什么问题 。但如果redis是多节点的集群部署,那么使用redis集群作为分布式锁就会存在一些问题 。本文参(抄)考(袭)了以下文章 。
闲聊Redis分布式锁
基于Redis的分布式锁到底安全吗(上)?
基于Redis的分布式锁到底安全吗(下)?
SET resource_name my_random_value NX PX 30000
如果返回成功,则说明客户端获取锁成功,然后就可以访问公共资源了,如果失败则获取锁失败 。对于这条命令,需要注意
my_random_value:必须是一个随机字符,并且唯一 。如果不唯一,可能会出现以下情况:
1.客户端1获取资源成功
2.客户端1阻塞超时,锁自动释放
3.客户端2获取锁成功
4.客户端1从阻塞中醒来 , 释放了客户端2的锁
必须设置NX,表示只有resource_name不存在时才会设置成功,保证只有第一个请求的客户端获取锁成功
PX 30000 表示过期时间为30s,为了保证原子操作必须在SET时设置过期时间
释放锁时使用下面的redis lua脚本执行来保证原子性 。
只有当resource_name的值和客户端持有的数据相等时才能够调用del删除resource_name , 否则不进行删除操作 。从而防止一个客户端释放另一个客户端持有的锁 。
分析一下redis锁的原理 , 我们在redis实例中创建一个键值,同时设置该键值的超时时间 。创建该键值的客户端获取锁成功,访问公共资源 。同时如果客户端宕机则锁会自动释放 。客户端需要释放锁时只需要删除该键即可 。但一旦单节点的Redis宕机则不能再提供服务,即使是基于Master-Slave模式的故障切换也是不安全的,例如下面场景
客户端1从Master获取锁
Master宕机,但锁key还没有同步到Slave上
Slave升级为Master
客户端2从新的Master上获取锁成功
算法实现
php源码实现
php现在有哪些常用的算法?
//--------------------
// 基本数据结构算法
//--------------------
//二分查找(数组里查找某个元素)
function bin_sch($array,$low, $high, $k){
if ( $low = $high){
$mid =intval(($low+$high)/2 );
if ($array[$mid] ==$k){
return $mid;
}elseif ( $k$array[$mid]){
returnbin_sch($array, $low,$mid-1, $k);
}else{
returnbin_sch($array, $mid+ 1, $high, $k);
}
}
return -1;
}
//顺序查找(数组里查找某个元素)
functionseq_sch($array, $n,$k){
$array[$n] =$k;
for($i=0;$i$n; $i++){
if( $array[$i]==$k){
break;
}
}
if ($i$n){
return$i;
}else{
return -1;
}
}
//线性表php连接数据算法的删除(数组中实现)
function delete_array_element($array , $i)
{
$len =count($array);
for ($j= $i; $j$len; $j ++){
$array[$j] = $array [$j+1];
}
array_pop ($array);
return $array ;
}
//冒泡排序(数组排序)
function bubble_sort( $array)
{
$count = count( $array);
if ($count = 0 ) return false;
for($i=0 ; $i$count; $i ++){
for($j=$count-1 ; $j$i; $j--){
if ($array[$j]$array [$j-1]){
$tmp = $array[$j];
$array[$j] = $array[ $j-1];
$array [$j-1] = $tmp;
}
}
}
return $array;
}
//快速排序(数组排序)
function quick_sort($array ) {
if (count($array) = 1) return$array;
$key = $array [0];
$left_arr= array();
$right_arr = array();
for ($i= 1; $icount($array ); $i++){
if ($array[ $i] = $key)
$left_arr [] = $array[$i];
推荐阅读
- 怎么制作优秀的公众号,如何制作一篇优秀的公众号
- flutter应用程序怎么提高性能,flutter platformview 性能
- 电商如何零投资,怎么从零开始做电商
- go语言定时 golang定时器实现
- asp.net文本框接收条码,asp获取文本框内容
- excel表格中怎么添加表格,excel表格中怎样添加表格
- 公众视频号视频怎么下载,视频公众号的视频怎么下载
- php接收数据成数组 php数组是值传递还是引用传递
- 电视机电子邮件怎么退出,电视上出现邮件怎么退出?