Amp

php实现redis分布式锁

半腔热情 提交于 2020-05-08 12:29:07
前言 分布式锁一般有三种实现方式: 1. 数据库乐观锁;2. 基于Redis的分布式锁;3. 基于ZooKeeper的分布式锁。 以下将介绍第二种方式,基于Redis实现分布式锁。 可靠性 首先,为了确保分布式锁可用,我们至少要确保锁的实现同时满足以下四个条件: 互斥性。在任意时刻,只有一个客户端能持有锁。 不会发生死锁。即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。 具有容错性。只要大部分的Redis节点正常运行,客户端就可以加锁和解锁。 解铃还须系铃人。加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给解了 代码实现 <?php class RedLock { private $retryDelay ; private $retryCount ; private $clockDriftFactor = 0.01 ; private $quorum ; private $servers = array (); private $instances = array (); function __construct ( array $servers , $retryDelay = 200 , $retryCount = 3 ) { $this -> servers = $servers ; $this -> retryDelay =

CAN总线数据链路层分析(四)

梦想与她 提交于 2020-05-08 10:55:48
在SPI通信中,片选、时钟信号、数据输入及数据输出这四个信号都有单独的信号线。而CAN使用的是两条差分信号线,只能表达一个信号。简洁的物理层决定了CAN必然要配上一套更为复杂的协议。如何用一个信号通道实现同样甚至更强大的功能,答案就是对数据或操作命令进行打包。 一、通信机制 1.1 多主机(Multi-Master) 安全敏感的应用(如汽车动力)对通信系统的可靠性要求很高。将总线能否正常工作归结到单一节点是非常危险的,比较合理的方案是对总线接入的去中心化,即每个节点都有接入总线的能力。这也是CAN总线采用多主控(Multi-Master)线性拓扑结构的原因。 在CAN总线上,每个节点都有往总线上发送消息的能力,而消息的发送不必遵从任何预先设定的时序,通信是事件驱动的。只有当有新的信息传递时,CAN总线才处于忙碌的状态,这使得节点接入总线速度非常快。CAN总线理论最高数据传输速率为1Mbps,对于异步事件反应迅速,基本对于ms级别的实时应用没有任何问题。 1.2 寻址机制 不同于其它类型的总线,CAN总线不设定节点的地址,而是通过消息的标识符(Identifier)来区别消息。这种机制虽然会增加消息的复杂度(增加标识符),但是节点在此情况下可以无需了解其他节点的状况,而相互间独立工作。在总线上增加节点时仅需关注消息类型,而非系统上其他节点的状况。这种以消息标识符寻址的方式

Java Stream & Method Reference

冷暖自知 提交于 2020-05-08 09:21:57
[TOC] 传统集合的多步遍历代码 /* 传统的方式遍历集合,过滤集合,打印输出满足条件的集合 */ import java.util.ArrayList; public class Demo01LIst { public static void main(String[] args) { // 创建list集合,存储姓名 ArrayList<String> list = new ArrayList<>(); list.add("张无忌"); list.add("赵敏"); list.add("周芷若"); list.add("张强"); list.add("张三丰"); ArrayList<String> listA = new ArrayList<>(); for (String s : list) { // 对list集合过滤,将张字开头的添加到listA集合中 if (s.startsWith("张")) { listA.add(s); } } ArrayList<String> listB = new ArrayList<>(); for (String s : listA) { // 对listA集合过滤,只要名字长度为3的 if (s.length() == 3) { listB.add(s); } } // 遍历listB集合,打印输出 for (String s

【原】javascript笔记之Array方法forEach&map&filter&some&every&reduce&reduceRight

冷暖自知 提交于 2020-05-08 05:12:55
做前端有多年了,看过不少技术文章,学了新的技术,但更新迭代快的大前端,庞大的知识库,很多学过就忘记了,特别在项目紧急的条件下,哪怕心中隐隐约约有学过一个方法,但会下意识的使用旧的方法去解决,多年前ES5几个新增的数组方法,好用但是常忘记用,趁着这周比较清闲,重温下并做下笔记,养成记笔记的好习惯。 forEach map filter some every reduce reduceRight forEach forEach是ES5的Array方法中用得最频繁的一个,就是遍历,循环输出,它接受一个必须的回调函数作为参数。 let arr1 = [1,2,3,4 ] arr1.forEach((item) => { console.info(item); }) // 1 // 2 // 3 // 4 等同于传统的for循环。 let arr1 = [1,2,3,4 ] for (let i = 1;i<arr1.length;i++ ){ console.info(arr1[i]) } // 1 // 2 // 3 // 4 相比for循环,forEach简洁了很多,forEach方法中的回调函数支持3个参数,第1个是遍历的数组内容;第2个是对应的数组索引,第3个是数组本身。 [].forEach( (value, index, array)=> { }); 举个例子: let

List&Map&Set的操作和遍历

白昼怎懂夜的黑 提交于 2020-05-08 04:56:01
Java的三大集合即:Set、List、Map 。 Set:代表无序、不可重复的集合,常用的有HashSet(哈希表实现)、TreeSet(红黑树实现); List:代表有序、可以重复的集合,比较常用的有ArrayList(数组实现)、LinkedList(链表实现); Map:代表具有映射关系的集合,常用的有HashMap(哈希表实现)、TreeMap(红黑树实现); Java5以后又增加了Queue体系集合,代表一种队列集合实现,这里先不介绍。 List的实现类原理比较简单,Map比较复杂,而Set其实是基于Map的一种实现。 下面从各个集合的基本操作介绍一下,分别选取HashSet、ArrayList、HashMap三个典型的实现类: 1. HashSet /** * HashSet的增删遍历 * @author wangjun * @email scuwangjun@hotmail.com * @time 2018年4月6日 下午2:40:33 */ public class HashSetOperation { public static void main( String[] args) { //初始化 HashSet< String> set = new HashSet<>(); //增 set. add( "key1"); set. add( "key2");

5323042:真心奉献---给缠迷们的实战忠告1&2

折月煮酒 提交于 2020-05-08 04:15:27
娇注:5323042是某位学长的网名,在某论坛盖过万楼高帖,下面内容节选自万楼贴,只供参考。 ====================================================================== 本人学缠时间不短了,基本与缠论课程同步。至今实际操作上,还可以。积累了一些经验性的东西,真心奉献给大家。本帖不参与缠论理论性口水战。主要针对学缠仍亏钱的缠迷们,提供一些较为实用的东西。形式以问答为主。有问才有答,不问不答! 你别指望我在理论上是否符合缠论的教条,你就关注我说的,对你赚钱有用没有?有缘人自得之吧! 另外,对不够友善的,不予回复。不想口水战。 问什么呢?就问问这个:缠师说牛市急跌是机会;缠师还说顶部大阴线下不要抢反弹;请问,大阴线看起来都一样,如何区分是牛市急跌还是顶部大阴线?最好能结合729和1124谈谈。谢谢。 跟你的操作级别有关,不要关心大阴线,关心三类买卖点。只讲大阴线讲不清楚的,讲级别可以讲清楚。每一个人,应有一个自己比较固定的操作级别,然后,对应的就是三类买卖点。第一类,不一定能抓住的。第二、三类,比较实用。 我本人,很多时候,就错过第一类。但二类,基本可以把握的。大家现在比较重视背驰的精确点,那确实比较难。第三类也很重要,因为,那是能看见的,不用估计,预测什么的。要重视第三类。 我这里没有什么惊人的发现

MariaDB CentOS 安装的时候如何确定 Repo 地址

拥有回忆 提交于 2020-05-08 02:09:58
在CentOS 安装 MariaDB 数据库的时候,yum 安装显示没有匹配的安装包。 我们应该如何配置能够让安装成功呢? 你需要在你的 CentOS 中编辑 /etc/yum.repos.d/MariaDB.repo 文件。 这个文件的内容,你可以访问: https://downloads.mariadb.org/mariadb/repositories/#distro=CentOS&mirror=supportex 找到。 通过上面的链接,你可以找到你需要的仓库配置。 例如 MariaDB 10.4 的配置如下: # MariaDB 10.4 CentOS repository list - created 2020-05-06 05:31 UTC # http://downloads.mariadb.org/mariadb/repositories/ [mariadb] name = MariaDB baseurl = http://yum.mariadb.org/10.4/centos7-amd64 gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck=1 如果你只需要安装服务器,你就可以执行: sudo yum install MariaDB-server 命令进行安装就可以了。 https://www

数据结构与算法之美_33_字符串匹配基础(中):如何实现文本编辑器中的查找功能?

若如初见. 提交于 2020-05-07 21:57:30
文本编辑器的查找替换功能我们应该都不陌生,它是如何实现的呢? 上一节我们学习了 BF 算法 和 RK 算法,它们也可以实现者功能,但是在某些极端情况下,BF 算法性能会退化的比较严重,而 RK 算法需要用到哈希算法,而设计一个可以应对各种类型字符的哈希算法并不简单。 那么,对于查找功能是重要的软件来说,比如一些文本编辑器,它们的查找功能都是用哪种算法来实现的呢?有没有比 BF 算法和 RK 算法更加高效的字符串匹配算法呢? 今天,我们就来学习 BM(Boyer-Moore)算法。它是一种非常高效的字符串匹配算法,有实验统计,它的性能时著名的 KMP 算法的 3 到 4 倍。BM 算法的原理很复杂,比较难懂。 BM 算法的核心思想 我们把模式串和主串的匹配过程,看作模式串在主串中不停地往后滑动。当遇到不匹配的字符时,BF 算法和 RK 算法的做法是,模式串往后滑动一位,然后从模式串的第一个字符开始重新匹配。 在这个例子中,主串中的 c,在模式串中是不存在的,所以,模式串向后滑动的时候,只要 c 与模式串有重合,肯定无法匹配。所以,我们可以一次性把模式串往后多滑动几位,把模式串移动到 c 的后面。 由现象找规律,当遇到不匹配的字符时,有什么固定的规律,可以将模式串往后多滑动几位呢?这样一次性往后滑动好几位,那匹配的效率岂不是就提高了? 今天学习的 BM 算法

PHP之错误处理

↘锁芯ラ 提交于 2020-05-07 21:57:11
目录 1. 前言 2. 错误类型和提示类型 2.1错误类型 2.2提示类型 3. 错误配置选项 3.1通过php.ini配置设置 3.2通过php函数设置 3.3通过ini_set()函数设置 3.4触发PHP错误函数 3.5自定义错误类型 4. PHP错误处理方法 4.1方法一:将错误日志保存在指定文件中 4.2方法二:将错误日志保存在系统日志中 4.3方法三:错误日志以邮件方式发送 5. 自定义错误处理器 5.1简介 5.2使用步骤 5.3实例演示 5.4封装自定义错误处理器类 5.5错误处理器类的测试 5.5.1通知错误测试 5.5.2警告错误测试 5.5.3手动抛出错误测试 6.脚本结束函数调用register_shutdown_function() 6.1含义 6.2使用场景 6.3案例演示 7.总结 1.前言 了解PHP的错误类型有助于我们很好地定位和解决bug,下面让我们一起深入了解吧。 代码分享: https://github.com/mtdgclub/ErrorDeal 2.错误类型和提示类型 说到PHP的错误我们先要搞清楚错误有几种错误类型,几种提示类型 2.1错误类型 语法错误 环境错误 逻辑错误 2.2提示类型 不推荐级别的错误—Deprecated 通知级别的错误—Notice 警告级别的错误—Warning 致命级别的错误—Fatal 语法解析错误

python脚本实现接口自动化轻松搞定上千条接口用例

陌路散爱 提交于 2020-05-07 20:50:16
接口自动化目前是测试圈主流的一个话题,我也在网上搜索了很多关于自动化的关键词,大多数博主分享的python做接口自动化都是以开源的框架,比如:pytest、unittest+ddt(数据驱动) 最常见的。 这些框架的缺陷太多,如下列举几个: 1.无法实现参数关联:上个请求的结果是下个请求的参数,如token 2.接口请求参数名有重复的,目前未处理,如key1=value1&key1=value2,两个key都一样,这种需要用元组存储,无法判断 3.接口数据更新无法直接更新excel,仍需修改代码,对于新手产生很大的不便 4.对于新手不会代码的测试人员,不易管理 我将分享一个python编写的接口自动化脚本,可以完全解决上面框架实现出现的问题,基本上http请求的接口均通用,仅需在excel中编写接口用例无需更改代码! 采用同样是数据驱动方式,将数据和业务完全分离在excel表格中、代码无需变更,两部分分离的方式相互独立,代码简单好维护,单个脚本调试方便,不用关注代码编写,提高了效率,(懂基础python的测试人员)也可无限扩展。 核心的思想与开源工具是相同的:数据和测试代码分离 优点:足够灵活,可以随时根据需求进行变更扩展 测试结果:直接展示在excel中,一目了然 目前已实现的功能: 1.支持HTTP请求方式 2.支持上下接口参数关联:参数提取实现各种响应值取参 3.支持上传