Distributed-Kit - 基于redis和zookeeper分布式工具集

jopen 8年前

Distributed-Kit

基于redis和zookeeper分布式工具集-包括:分布式锁实现,分布式速率限制器,分布式序列等.

使用

maven: 需先编译安装到本地仓库或者本地私服。

    <dependency>        <groupId>dance</groupId>        <artifactId>Distributed-Kit</artifactId>        <version>0.0.1</version>      </dependency>

基于Redis实现的分布式锁(可重入)

public static void main(String[] args){      JedisPool jedisPool=new JedisPool("127.0.0.1",6379);//实际应用时可通过spring注入      final RedisDistributedLockTemplate template=new RedisDistributedLockTemplate(jedisPool);//本类线程安全,可通过spring注入      template.execute("订单流水号", 5000, new Callback() {//获取锁超时时间为5秒          @Override          public Object onGetLock() throws InterruptedException {              //TODO 获得锁后要做的事              return null;          }            @Override          public Object onTimeout() throws InterruptedException {              //TODO 获得锁超时后要做的事              return null;          }      });  }
public static void main(String[] args) throws Exception {      JedisPool jedisPool=new JedisPool("127.0.0.1",6379);//实际应用时可通过spring注入      RedisReentrantLock lock=new RedisReentrantLock(jedisPool,"订单流水号");      try {          if (lock.tryLock(5000L, TimeUnit.MILLISECONDS)) {//获取锁超时时间为5秒              //TODO 获得锁后要做的事          }else{              //TODO 获得锁超时后要做的事          }      }finally {          lock.unlock();      }  }

测试本实现的可靠性见测试用例

基于Zookeeper实现的分布式锁(可重入)

public static void main(String[] args){      RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);      CuratorFramework client = CuratorFrameworkFactory.newClient("127.0.0.1:2181", retryPolicy);      client.start();        final ZkDistributedLockTemplate template=new ZkDistributedLockTemplate(client);//本类多线程安全,可通过spring注入      template.execute("订单流水号", 5000, new Callback() {//获取锁超时时间为5秒          @Override          public Object onGetLock() throws InterruptedException {              //TODO 获得锁后要做的事              return null;          }            @Override          public Object onTimeout() throws InterruptedException {              //TODO 获得锁超时后要做的事              return null;          }      });  }

测试本实现的可靠性见测试用例

基于Redis实现的分布式速率限制器

限制的资源,可以是ip,用户id,订单id,手机号,等等.

  • 例如限制一个手机号每分钟只能发1条短信.
  • 例如限制一个手机号每10秒钟只能发起1次叫车请求.
  • 例如限制一个ip地址每秒钟只能访问10次特定的资源.
public class AccessSpeedLimitTest {      @Test      public void test1() throws InterruptedException {          JedisPool jp=new JedisPool("127.0.0.1",6379);          AccessSpeedLimit accessSpeedLimit=new AccessSpeedLimit(jp);          SimpleDateFormat sdf=new SimpleDateFormat(" mm:ss");          while(true){              //10.0.0.1这个ip每1秒钟最多访问5次if块内代码              if(accessSpeedLimit.tryAccess("10.0.0.1", 1,5)){                  System.out.println("yes"+sdf.format(new Date()));              }else{                  System.out.println("no"+sdf.format(new Date()));              }              Thread.sleep(100);          }      }        @Test      public void test2() throws InterruptedException {          JedisPool jp=new JedisPool("127.0.0.1",6379);          final RedisDistributedLockTemplate template=new RedisDistributedLockTemplate(jp);          LimitRule limitRule=new LimitRule();          limitRule.setSeconds(1);          limitRule.setLimitCount(5);          limitRule.setLockCount(7);          limitRule.setLockTime(2);          AccessSpeedLimit accessSpeedLimit=new AccessSpeedLimit(jp);          SimpleDateFormat sdf=new SimpleDateFormat(" mm:ss");          while(true){              //10.0.0.1这个ip每1秒钟最多访问5次if块内代码.1秒超过10次后,锁定2秒,2秒内无法访问.              if(accessSpeedLimit.tryAccess("10.0.0.1",limitRule)){                  System.out.println("yes"+sdf.format(new Date()));              }else{                  System.out.println("no"+sdf.format(new Date()));              }              Thread.sleep(100);          }      }  }

项目地址: https://github.com/yujiasun/Distributed-Kit