Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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

License

Notifications You must be signed in to change notification settings

uutao/Distributed-Kit

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

24 Commits

Repository files navigation

Distributed-Kit

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

使用

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);
 }
 }
}

#技术交流: QQ: 4115291 Mail: sunyujia.d@gmail.com

About

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

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 100.0%

AltStyle によって変換されたページ (->オリジナル) /