redis分布ロックRedisson性能テスト
総括する
redissonはredisに接続するためのjavaクライアントワークであり、jedisに対して非同期モデルを採用し、netty promiseプログラミングを大量に使用するクライアントフレームワークであり、性能をテストする必要がある.
コード#コード#
総括分析 isSkipLockはfalse運転のために分布式ロックを開き、圧力テストtpsは300ペン前後 である. isSkipLockはtrueのために分布式ロックを閉じ、tpsは1万ペン前後 である. redissonは、非正常閉鎖など、様々な異常の場合に強いが、性能には確かに大きな損失があり、その後、他の実装案を比較したり、コードを見て最適化する必要がある を見たりする.その後、非同期コールバック方式を用いて、分散ロックの性能が 向上するかどうかを確認する.
redissonはredisに接続するためのjavaクライアントワークであり、jedisに対して非同期モデルを採用し、netty promiseプログラミングを大量に使用するクライアントフレームワークであり、性能をテストする必要がある.
コード#コード#
import java.util.concurrent.CountDownLatch;
import org.redisson.Config;
import org.redisson.Redisson;
import org.redisson.RedissonClient;
import org.redisson.core.RAtomicLong;
import org.redisson.core.RLock;
/** * redis * @author zhaoyq */
public class RedissonPerformanceTest {
private static int TOTAL_PRE_THREADS = 10;
private static long SECONDS = 10;
protected static boolean isSkipLock = false;
public static void main(String[] args) {
Config config = new Config();
// for single server
config.useSingleServer()
.setAddress("10.10.208.32:7003")
.setConnectionPoolSize(10);
final RedissonClient redissonCli = Redisson.create(config);
final RLock lock = redissonCli.getLock("testLock");
final CountDownLatch startLatch = new CountDownLatch(1);
final CountDownLatch endLatch = new CountDownLatch(TOTAL_PRE_THREADS);
Thread[] threads = new Thread[TOTAL_PRE_THREADS];
setZero(redissonCli);
for (int i = 0; i < TOTAL_PRE_THREADS; i++) {
PerformanceThread runningThread = new PerformanceThread(startLatch,endLatch,lock,redissonCli);
runningThread.start();
threads[i]=runningThread;
}
//
startLatch.countDown();
try {
Thread.sleep(SECONDS*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i < threads.length; i++) {
PerformanceThread runningThread =(PerformanceThread)threads[i];
runningThread.stopThrad();
}
try {
endLatch.await();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
printCount(redissonCli);
redissonCli.shutdown();
}
public static class PerformanceThread extends Thread{
private volatile boolean isRunning = true;
private CountDownLatch startLatch ;
private CountDownLatch endLatch;
private RLock lock;
private RedissonClient redissonCli;
private PerformanceThread(CountDownLatch startLatch ,CountDownLatch endLatch,RLock lock ,RedissonClient redissonCli){
this.startLatch = startLatch;
this.endLatch = endLatch;
this.lock = lock;
this.redissonCli =redissonCli;
}
@Override
public void run() {
try {
startLatch.await();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
while (isRunning) {
try {
if (!isSkipLock) {
lock.lock();
}
testUpdate(redissonCli);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (!isSkipLock) {
lock.unlock();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
endLatch.countDown();
}
public void stopThrad(){
isRunning = false;
}
}
/** * */
public static void testUpdate(RedissonClient redissonCli) {
RAtomicLong addLong = redissonCli.getAtomicLong("test_performance");
long totalUsed = addLong.addAndGet(1);
}
/** * * @param redissonCli */
public static void printCount(RedissonClient redissonCli){
RAtomicLong addLong = redissonCli.getAtomicLong("test_performance");
System.out.println("count tps is:"+(addLong.get()/SECONDS));
}
/** * * @param redissonCli */
public static void setZero(RedissonClient redissonCli){
RAtomicLong addLong = redissonCli.getAtomicLong("test_performance");
addLong.set(0);
}
}
総括分析