關於分布式套件(Distributed-Kit)簡述
使用
maven: 需先編譯安裝到本地倉庫或者本地私服 。
<dependency>
<groupId>dance</groupId>
<artifactId>Distributed-Kit</artifactId>
<version>0.0.1</version>
</dependency>
##基於Redis實現的分布式鎖(可重入)
public static void main(String[] args){
final RedisDistributedLockTemplate template=new RedisDistributedLockTemplate(jedisPool);//本類線程安全,可通過spring註入
template.execute("訂單流水號", 5000, new Callback() {//獲取鎖超時時間為5秒@Override
br/>@Override
//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
br/>@Test
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);
}
}
}
關於分布式套件(Distributed-Kit)簡述