1+ package com .crossoverjie .distributed .lock ;
2+
3+ import com .crossoverjie .distributed .constant .RedisToolsConstant ;
4+ import com .google .common .util .concurrent .ThreadFactoryBuilder ;
5+ import org .junit .Before ;
6+ import org .slf4j .Logger ;
7+ import org .slf4j .LoggerFactory ;
8+ import org .springframework .data .redis .connection .jedis .JedisConnectionFactory ;
9+ import redis .clients .jedis .JedisPool ;
10+ import redis .clients .jedis .JedisPoolConfig ;
11+ import redis .clients .jedis .JedisShardInfo ;
12+
13+ import java .util .concurrent .ArrayBlockingQueue ;
14+ import java .util .concurrent .ExecutorService ;
15+ import java .util .concurrent .ThreadFactory ;
16+ import java .util .concurrent .ThreadPoolExecutor ;
17+ import java .util .concurrent .TimeUnit ;
18+
19+ /**
20+ * real test by single Redis
21+ */
22+ public class RealSingleRedisLockTest {
23+
24+ private static Logger logger = LoggerFactory .getLogger (RealSingleRedisLockTest .class );
25+ private static ExecutorService executorServicePool ;
26+
27+
28+ private static RedisLock redisLock ;
29+
30+ private static JedisPool jedisPool ;
31+
32+
33+ public static void main (String [] args ) throws InterruptedException {
34+ RealSingleRedisLockTest redisLockTest = new RealSingleRedisLockTest ();
35+ redisLockTest .init ();
36+ initThread ();
37+
38+ for (int i = 0 ; i < 50 ; i ++) {
39+ executorServicePool .execute (new Worker (i ));
40+ }
41+
42+ executorServicePool .shutdown ();
43+ while (!executorServicePool .awaitTermination (1 , TimeUnit .SECONDS )) {
44+ logger .info ("worker running" );
45+ }
46+ logger .info ("worker over" );
47+
48+ }
49+
50+ @ Before
51+ public void setBefore () {
52+ init ();
53+
54+ }
55+
56+ private void init () {
57+
58+ JedisPoolConfig config = new JedisPoolConfig ();
59+ config .setMaxIdle (100 );
60+ config .setMaxTotal (100 );
61+ config .setMaxWaitMillis (10000 );
62+ config .setTestOnBorrow (true );
63+ config .setTestOnReturn (true );
64+
65+ //单机
66+ JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory (config ) ;
67+
68+ jedisConnectionFactory .setTimeout (100000 );
69+ jedisConnectionFactory .afterPropertiesSet ();
70+ jedisConnectionFactory .setShardInfo (new JedisShardInfo ("127.0.0.1" , 6379 ));
71+
72+ redisLock = new RedisLock .Builder (jedisConnectionFactory , RedisToolsConstant .SINGLE )
73+ .lockPrefix ("lock_" )
74+ .sleepTime (100 )
75+ .build ();
76+
77+ }
78+
79+ public static void initThread () {
80+ ThreadFactory namedThreadFactory = new ThreadFactoryBuilder ()
81+ .setNameFormat ("current-thread-%d" ).build ();
82+ executorServicePool = new ThreadPoolExecutor (350 , 350 , 0L , TimeUnit .MILLISECONDS ,
83+ new ArrayBlockingQueue <Runnable >(200 ), namedThreadFactory , new ThreadPoolExecutor .AbortPolicy ());
84+
85+ }
86+
87+
88+ private static class Worker implements Runnable {
89+
90+ private int index ;
91+
92+ public Worker (int index ) {
93+ this .index = index ;
94+ }
95+
96+ @ Override
97+ public void run () {
98+ //测试非阻塞锁
99+ boolean limit = redisLock .tryLock ("abc" , "12345" );
100+ if (limit ) {
101+ logger .info ("加锁成功=========" );
102+ boolean unlock = redisLock .unlock ("abc" , "12345" );
103+ logger .info ("解锁结果===[{}]" ,unlock );
104+ } else {
105+ logger .info ("加锁失败" );
106+
107+ }
108+
109+ //测试非阻塞锁 + 超时时间
110+ //boolean limit = redisLock.tryLock("abc", "12345",1000);
111+ //if (limit) {
112+ // logger.info("加锁成功=========");
113+ // boolean unlock = redisLock.unlock("abc", "12345");
114+ // logger.info("解锁结果===[{}]",unlock);
115+ //} else {
116+ // logger.info("加锁失败");
117+ //
118+ //}
119+
120+
121+ //测试阻塞锁
122+ //try {
123+ // redisLock.lock("abc", "12345");
124+ // logger.info("加锁成功=========");
125+ //} catch (InterruptedException e) {
126+ // e.printStackTrace();
127+ //}
128+ //redisLock.unlock("abc","12345") ;
129+
130+
131+
132+ //测试阻塞锁 + 阻塞时间
133+ //try {
134+ // boolean limit = redisLock.lock("abc", "12345", 100);
135+ // if (limit) {
136+ // logger.info("加锁成功=========");
137+ // boolean unlock = redisLock.unlock("abc", "12345");
138+ // logger.info("解锁结果===[{}]",unlock);
139+ // } else {
140+ // logger.info("加锁失败");
141+ //
142+ // }
143+ //} catch (InterruptedException e) {
144+ // e.printStackTrace();
145+ //}
146+ }
147+ }
148+
149+
150+ }
0 commit comments