个人简介

Echo Blog


江湖无名 安心练剑
  • Redis 分布式锁 redis lock
    为什么需要分布式锁 在 jdk 中为我们提供了加锁的方式: (1)synchronized 关键字 (2)volatile + CAS 实现的乐观锁 (3)ReadWriteLock 读写锁 (4)ReenTrantLock 可重入锁 等等,这些锁为我们变成提供极大的便利性,保证在多线程的情况下,保证线程安全。 但是在分布式系统中,上面的锁就统统没用了。 我们想要解决分布式系...
    2018-09-08 03:07:16 | Distributed
  • zookeeper-01-Apache Curator
    什么是 Apache Curator? Apache Curator 是分布式协调服务 Apache ZooKeeper 的 Java/JVM 客户端库。 Apache Curator 包括一个高级 API 框架和实用程序,使使用 Apache ZooKeeper 变得更加容易和可靠。 它还包括常见用例和扩展(例如服务发现和 Java 8 异步 DSL)的方法。 入门 学习 Zoo...
    2018-09-08 02:30:55 | Distributed
  • 分布式锁-03-基于 mysql 实现分布式锁
    MySQL–DB实现分布式锁思路 无论是单机锁还是分布式锁,原理都是基于共享的数据,判断当前操作的行为。 对于单机则是共享RAM内存,对于集群则可以借助Redis,ZK,DB等第三方组件来实现。 Redis,ZK对分布式锁提供了很好的支持,基本上开箱即用,然而这些组件本身要高可用,系统也需要强依赖这些组件,额外增加了不少成本。 DB对于系统来说本身就默认为高可用组件,针对一些低频的业...
    2018-09-08 02:30:55 | Distributed
  • 分布式锁-01-基于 Zookeeper 实现分布式锁
    Zookeeper Zookeeper ZooKeeper的架构通过冗余服务实现高可用性。 因此,如果第一次无应答,客户端就可以询问另一台ZooKeeper主机。 ZooKeeper节点将它们的数据存储于一个分层的命名空间,非常类似于一个文件系统或一个前缀树结构。客户端可以在节点读写,从而以这种方式拥有一个共享的配置服务,更新是全序的。 系统架构 上图为系统架构,左边区域表示...
    2018-09-08 02:30:55 | Distributed
  • 分布式锁-02-SQL 数据库实现分布式锁
    实现方式 基于数据库的锁实现也有两种方式,一是基于数据库表,另一种是基于数据库排他锁。 数据库表的增删 思路 具体使用的方法,当需要锁住某个方法时,往该表中插入一条相关的记录。这边需要注意,方法名是有唯一性约束的,如果有多个请求同时提交到数据库的话,数据库会保证只有一个操作可以成功,那么我们就可以认为操作成功的那个线程获得了该方法的锁,可以执行方法体内容。 执行完毕,需要delet...
    2018-09-08 02:14:05 | Distributed
  • 22讲通关go-07-错误处理:如何通过 error、deferred、panic 等处理错误?
    07 错误处理:如何通过 error、deferred、panic 等处理错误? 上节课我为你讲解了结构体和接口,并留了一个小作业,让你自己练习实现有两个方法的接口。 现在我就以“人既会走也会跑”为例进行讲解。 首先定义一个接口 WalkRun,它有两个方法 Walk 和 Run,如下面的代码所示: type WalkRun interface { Walk() Run(...
    2018-09-07 01:51:23 | Lang
  • 22讲通关go-06 struct 和 interface:结构体与接口都实现了哪些功能?
    06 struct 和 interface:结构体与接口都实现了哪些功能? 上节课我留了一个思考题:方法是否可以赋值给一个变量?如果可以,要怎么调用它呢? 答案是完全可以,方法赋值给变量称为方法表达式,如下面的代码所示: age:=Age(25) //方法赋值给变量,方法表达式 sm:=Age.String //通过变量,要传一个接收者进行调用也就是age sm(age) 我们...
    2018-09-07 01:51:23 | Lang
  • 22讲通关go-05 函数和方法:Go 语言中的函数和方法到底有什么不同?
    05 函数和方法:Go 语言中的函数和方法到底有什么不同? 上一讲的思考题是创建一个二维数组并使用。 上节课,我主要介绍了一维数组,其实二维数组也很简单,仿照一维数组即可,如下面的代码所示: aa:=[3][3]int{} aa[0][0] =1 aa[0][1] =2 aa[0][2] =3 aa[1][0] =4 aa[1][1] =5 aa[1][2] =6 aa[...
    2018-09-07 01:51:23 | Lang