本帖最后由 howtodown 于 2016-10-3 16:01 编辑 问题导读 1.为什么会产生分布式锁? 2.使用分布式锁的方法有哪些? 3.本文创造的分布式锁的双写Redis框架都包含哪些内容? 一、关于分布式锁 关于分布式锁,可能绝大部分人都会或多或少涉及到。我举二个例子: 场景一:从前端界面发起一笔支付请求,如果前端没有做防重处理,那么可能在某一个时刻会有二笔一样的单子同时到达系统后台。 场景二:在App中下订单的时候,点击确认之后,没反应,就又点击了几次。在这种情况下,如果无法保证该接口的幂等性,那么将会出现重复下单问题。 在接收消息的时候,消息推送重复。如果处理消息的接口无法保证幂等,那么重复消费消息产生的影响可能会非常大。 类似这种场景,我们有很多种方法,可以使用幂等操作,也可以使用锁的操作。 我们先来解释一下什么是幂等操作: 所谓幂等,简单地说,就是对接口的多次调用所产生的结果和调用一次是一致的。扩展一下,这里的接口,可以理解为对外发布的HTTP接口或者Thrift接口,也可以是接收消息的内部接口,甚至是一个内部方法或操作。 在分布式环境中,网络环境更加复杂, 因前端操作抖动、网络故障、消息重复、响应速度慢等原因,对接口的重复调用概率会比集中式环境下更大,尤其是重复消息在分布式环境中很难避免。Tyler Treat也在《You Cannot Have Exactly-Once Delivery》一文中提到: Within the context of a distributed system, you cannot have exactly-once message delivery. 分布式环境中,有些接口是天然保证幂等性的,如查询操作。有些对数据的修改是一个常量,并且无其他记录和操作,那也可以说是具有幂等性的。其他情况下,所有涉及对数据的修改、状态的变更就都有必要防止重复性操作的发生。通过间接的实现接口的幂等性来防止重复操作所带来的影响,成为了一种有效的解决方案。 于是我们根据以上内容就可以讲一下使用分布式锁的方法有哪些。 1、使用数据库乐观锁,包括主键防重,版本号控制。但是这两种方法各有利弊。
2、Zookeeper防重策略
于是我就在想,我该如何做才能让Redis在分布式锁这一块能够达到高可用呢? <ignore_js_op> 说明: |
借读:分布式锁和双写Redis
原文作者:小虾米的java梦
原文地址: http://www.cnblogs.com/fengli9998/p/8660067.html
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: http://www.cnblogs.com/fengli9998/p/8660067.html
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。