编程思想之幂等性一编程之道

  J前言

  今年年初遇到项目灾难,解决了不少问题,这是其中一个问题。很早的时候写的,学以致用的。今天看到还有这样一篇稿文,那就整理下分享给大家学习!编程思想之幂等性

  什么是幂等性

  既然幂等性源于数学,那我就使用数学公式来表示,即可一目了然!

  f(f(x)) = f(x)

  显然,从上面的二元函数可以看出,无论x(等幂元素)被函数y无限地执行运算,它的结果都是相同的。在计算机编程领域中,我们可以这么定义幂等性:在调用某个方法、接口中,我们使用相同的参数(相同的特定参数),其返回值都是相同的,我们便可称方法、接口具有幂等性。从信仰上说,幂等性是一种承诺,只要一次答应某个承诺,其承诺内容都是不会改变的。

  Methods can also have the property of “idempotence” in that (aside from error or expiration issues) the side-effects of N 0 identical requests is the same as for a single request.

  如何理解幂等性

  理解性的理论,举例子掌握最快。

  无心举例,看场景更易理解。哈哈

  幂等性场景设计

  下单处理

  这个例子曾经出现在我的身边:微信服务端在搞事情!

  客户端提交数据超过十秒后,他会定时在十秒后自行断开并自动再次发起请求,请求的数据体一模一样,但是这样的请求是不合法的,属重复请求。如何解决此事呢?可以使用幂等性作为一个良好的解决方案。为解决此问题,在此先谢谢腾讯大佬CC,后会无期!

  原本的方法是这样设计的

  function add($userToken, $orderMessage){ //todo}

  这样处理那就不能规避重复请求了。

  基于幂等性来解决此问题,改进的设计方法

  function add($seq,$userToken, $orderMessage){ // 现根据seq来判断是否已经处理过了,是的话就返回第一次处理的结果

  $resultJson = $this-redis-get(‘***_pre_‘ . $seq); if(false != $resultJson){ return $resultJson;

  } // 既然没有处理过,那就正式处理

  // todo

  // 处理完了,没有问题那就将结果保存起来

  // todo

  return $resultJson;

  }

  幂等性属于解决此问题的一部分,是解决方案的一部分,还有另一部分是异步。

  提现

  基于幂等性设计 | 防止用户多次点击(后端是不相信前端处理的)或者突然网络异常等情况下,可以保持数据的一致性。

  两个步骤:

  后端生产票据 | 生产队时给你发粮票,你才有机会拿钱去购买柴米油盐酱醋茶

  根据上一步拿到合法的票据来提现

  function createTicketSequence($user) : string{ // todo }

  function withdraw($ticketSequence,$user,$amount){ // todo}

  场景理解

  1、用户在取款的时候,客户端先带上token请求服务端生成一个合法的取款凭证ticketSequeuence

  2、用户在输入取款金额并确认取款后,客户端将会带上用户登录凭证userToken、取款票据ticketSequence以及取款金额amount进行请求

  3、服务端接收到请求后,先校验userToken,校验失败则返回重新登录,否则换取user对象

  4、用户鉴权通过后,那么再来校验取款票据ticketSequence,票据不合法,那么取款失败,否则继续进行取款,一直到取款成功并根据票据作为幂等值来保存提现成功的结果

  5、即使客户端请求后与服务端失去了联系,并且服务端处理成功,客户端处于假死的状态并再次请求取款,也是返回第一次的结果,并且是迅速的响应。

?

原文地址:https://www.cnblogs.com/qfjavabd/p/10240319.html

时间: 2024-10-11 11:20:15

编程思想之幂等性一编程之道的相关文章

抽象,编程之道

要敢于去挑战有难度的书籍,挑战最本质的难题,才能激发人生的飞跃.如果仅仅满足于学习那些实用的开发技术,虽然可少花费些气力,但也限制了自己的高度. 一.  抽象 —— 编程的实质 抽象是针对问题的特征对现实事物的紧密相关的属性的提炼过程及结果.程序中弥漫着大大小小的抽象. 分页控件是对分页功能的抽象, Extjs 中 store 是对组件的数据管理者的抽象, Java 并发库是对底层多核处理器的抽象, 拦截器,回调函数, Socket ,  管道, 消息, 对象, 都是对现实世界的某种实体的抽象.

Python灰帽子-***与逆向工程师的Python编程之道PD

Python灰帽子-***与逆向工程师的Python编程之道PDF百度网盘链接:https://pan.baidu.com/s/1OsBpcSYuIFQmmFhRs9FehQ 提取码:j1xa 内容简介 · · · · · · <Python灰帽子>是由知名安全机构Immunity Inc的资深黑帽Justin Seitz主笔撰写的一本关于编程语言Python如何被广泛应用于***与逆向工程领域的书籍.老牌***,同时也是Immunity Inc的创始人兼首席技术执行官(CTO)Dave Ai

读书笔记 ~ Python黑帽子 黑客与渗透测试编程之道

Python黑帽子  黑客与渗透测试编程之道   <<< 持续更新中>>> 第一章: 设置python 环境 1.python软件包管理工具安装 [email protected]:~# apt-get install python-setuptools python-pip [email protected]:~# pip install github3.py [注]如果在安装的过程中出现:E: Sub-process /usr/bin/dpkg returned a

黑客与渗透测试编程之道

本书是畅销书<Python 灰帽子—黑客与逆向工程师的 Python 编程之道>的姊妹篇,那本书一面市便占据计算机安全类书籍的头把交椅.本书由 Immunity 公司的高级安全研究员 Justin Seitz 精心撰写.作者根据自己在安全界,特别是渗透测试领域的几十年经验,向读者介绍了 Python 如何被用在黑客和渗透测试的各个领域,从基本的网络扫描到数据包捕获,从 Web 爬虫到编写 Burp 扩展工具,从编写木马到权限提升等. 作者在本书中的很多实例都非常具有创新和启发意义, 如 HTT

Swift2编程之道:POP+MVVM

Swift2.0中引入了协议扩展的特性,并且建议开发者一切从协议(Protocol)出发,经过几个月的学习探索,博主发现Swift作为一门面向协议编程(POP)的语言非常适合时下火热的MVVM架构.MVVM已经提出有一段时间了,如果你还不懂什么是MVVM,建议先去补充相关的知识,再回到本文中. 在Cocoa Touch体系内,MVC是广为人知的经典架构,博主之前也讲解过MVC的相关知识,但是随着业务逻辑的扩张,控制器中的代码可能会变得非常庞大导致难以维护,因为无论是OC还是Swift都是单类继承

程序员的修炼-从优秀到卓越札记:编程之道2

前言:天气愈来愈热了,笔记本也开始发烫,写一篇文章也开始变得艰难.我最近一直在写读书札记,也许很多人不喜欢看,我却乐此不疲,能够把自己的感悟跃然于纸上,感觉就像一个"好"的程序员,你觉得呢?今天继续来看编程之道的下半部分,看看我在通往优秀程序员的路上还需要做些什么. 你循规蹈矩吗 最开始的时候,我的手机贴膜都是找伙伴做的,而如今,我都是自己来做的,并且认为做的不错. 其实贴出来没有气泡的模还是比较容易的: 擦洗手机屏幕,保证没有肉眼所见的脏污 撕下保护膜的后膜,将内膜按照屏幕轮廓进行覆

Java编程之Map中分拣思想。

题目:给定一个字符串,求出字符串中每一个单词在字符串中出现的次数 旨意:map的分拣思想. 每一个key的包装类,存放出现的次数 1 /** 2 * 作为包装类,用来存放英文单词,和该英文单词出现的次数 3 * @ClassName: Str 4 * @Description: TODO(这里用一句话描述这个类的作用) 5 * @author 尚晓飞 6 * @date 2014-7-30 下午6:57:29 7 * 8 */ 9 public class Str { 10 private St

网络编程之TCP编程

html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption

编程思想、哲学、道与术

一切的起源:问题及问题的求解: 编程是为了解决问题,而解决问题可以有多种视角和思路: 世界观与方法论: 马克思:世界是物质的,物质是运动的:运动着的物质是普遍联系和永恒发展的: 编程思想与世界观: 我们知道,哲学领域中,最根本的对立是唯物主义和唯心主义的对立,而附属其下,又有许多对立,如形而上学和辩证法的对立.可知论和不可知论的对立等等.这些对立形成了哲学的基本体系.派别和出发点.实际上,这些对立,都是世界观的对立.世界观,简而言之即如何看待这个世界.世界观是一切哲学问题的本源和出发点. 同样,