µ±Ç°Î»ÖãºÖ÷Ò³ > ²é¿´ÄÚÈÝ

·Ö²¼Ê½ËøÖеÄÍõÕß·½°¸-Redisson

·¢²¼Ê±¼ä£º2021-06-06 00:00| ÓРλÅóÓѲ鿴

¼ò½é£ºÉÏƪ½²½âÁËÈçºÎÓà Redis ʵÏÖ·Ö²¼Ê½ËøµÄÎåÖÖ·½°¸£¬µ«ÎÒÃÇ»¹ÊÇÓиüÓŵÄÍõÕß·½°¸£¬¾ÍÊÇÓà Redisson¡£ »º´æϵÁÐÎÄÕ£º »º´æʵս£¨Ò»£©£º 20 ͼ £ü6 ǧ×Ö£ü»º´æʵս£¨ÉÏƪ£© »º´æʵս£¨¶þ£©£º Redis ·Ö²¼Ê½Ëø£ü´ÓÇàÍ­µ½×êʯµÄÎåÖÖÑݽø·½°¸ ÎÒÃÇÏÈÀ´¿´Ï Redis ¹Ù¡­¡­

ÉÏƪ½²½âÁËÈçºÎÓà Redis ʵÏÖ·Ö²¼Ê½ËøµÄÎåÖÖ·½°¸£¬µ«ÎÒÃÇ»¹ÊÇÓиüÓŵÄÍõÕß·½°¸£¬¾ÍÊÇÓà Redisson¡£

»º´æϵÁÐÎÄÕ£º

»º´æʵս£¨Ò»£©£º20 ͼ £ü6 ǧ×Ö£ü»º´æʵս£¨ÉÏƪ£©

»º´æʵս£¨¶þ£©£ºRedis ·Ö²¼Ê½Ëø£ü´ÓÇàÍ­µ½×êʯµÄÎåÖÖÑݽø·½°¸

ÎÒÃÇÏÈÀ´¿´Ï Redis ¹ÙÍøÔõô˵£¬

¶ø Java °æµÄ ·Ö²¼Ê½ËøµÄ¿ò¼Ü¾ÍÊÇ Redisson¡£±¾ÆªÊµÕ½ÄÚÈݽ«»á»ùÓÚÎҵĿªÔ´ÏîÄ¿ PassJava À´ÕûºÏ Redisson¡£

ÎҰѺó¶Ë¡¢Ç°¶Ë¡¢Ð¡³ÌÐò¶¼ÉÏ´«µ½Í¬Ò»¸ö²Ö¿âÀïÃæÁË£¬´ó¼Ò¿ÉÒÔͨ¹ý Github »ò ÂëÔÆ·ÃÎÊ¡£µØÖ·ÈçÏ£º

Github: https://github.com/Jackson0714/PassJava-Platform ÂëÔÆ£ºhttps://gitee.com/jayh2018/PassJava-Platform ÅäÌ׽̳̣ºwww.passjava.cn

ÔÚʵս֮ǰ£¬ÎÒÃÇÏÈÀ´¿´ÏÂʹÓà Redisson µÄÔ­Àí¡£

Ò»¡¢Redisson ÊÇʲô£¿

Èç¹ûÄã֮ǰÊÇÔÚÓà Redis µÄ»°£¬ÄÇʹÓà Redisson µÄ»°½«»áÊ°빦±¶£¬Redisson ÌṩÁËʹÓà RedisµÄ×î¼òµ¥ºÍ×î±ã½ÝµÄ·½·¨¡£

RedissonµÄ×ÚÖ¼ÊÇ´Ù½øʹÓÃÕß¶Ô Redis µÄ¹Ø×¢·ÖÀ루Separation of Concern£©£¬´Ó¶øÈÃʹÓÃÕßÄܹ»½«¾«Á¦¸ü¼¯ÖеطÅÔÚ´¦ÀíÒµÎñÂß¼­ÉÏ¡£

Redisson ÊÇÒ»¸öÔÚ Redis µÄ»ù´¡ÉÏʵÏÖµÄ Java פÄÚ´æÊý¾ÝÍø¸ñ£¨In-Memory Data Grid£©¡£

  • Netty ¿ò¼Ü£ºRedisson²ÉÓÃÁË»ùÓÚNIOµÄNetty¿ò¼Ü£¬²»½öÄÜ×÷ΪRedisµ×²ãÇý¶¯¿Í»§¶Ë£¬¾ß±¸Ìṩ¶ÔRedis¸÷ÖÖ×é̬ÐÎʽµÄÁ¬½Ó¹¦ÄÜ£¬¶ÔRedisÃüÁîÄÜÒÔͬ²½·¢ËÍ¡¢Òì²½ÐÎʽ·¢ËÍ¡¢Òì²½Á÷ÐÎʽ·¢ËÍ»ò¹ÜµÀÐÎʽ·¢Ë͵ŦÄÜ£¬LUA½Å±¾Ö´Ðд¦Àí£¬ÒÔ¼°´¦Àí·µ»Ø½á¹ûµÄ¹¦ÄÜ
  • »ù´¡Êý¾Ý½á¹¹£º½«Ô­ÉúµÄRedis Hash£¬List£¬Set£¬String£¬Geo£¬HyperLogLogµÈÊý¾Ý½á¹¹·âװΪJavaÀï´ó¼Ò×îÊìϤµÄÓ³É䣨Map£©£¬ÁÐ±í£¨List£©£¬¼¯£¨Set£©£¬Í¨ÓöÔÏóÍ°£¨Object Bucket£©£¬µØÀí¿Õ¼ä¶ÔÏóÍ°£¨Geospatial Bucket£©£¬»ùÊý¹À¼ÆËã·¨£¨HyperLogLog£©µÈ½á¹¹£¬
  • ·Ö²¼Ê½Êý¾Ý½á¹¹£ºÕâ»ù´¡ÉÏ»¹ÌṩÁË·Ö²¼Ê½µÄ¶àÖµÓ³É䣨Multimap£©£¬±¾µØ»º´æÓ³É䣨LocalCachedMap£©£¬ÓÐÐò¼¯£¨SortedSet£©£¬¼Æ·ÖÅÅÐò¼¯£¨ScoredSortedSet£©£¬×ÖµäÅÅÐò¼¯£¨LexSortedSet£©£¬Áжӣ¨Queue£©£¬×èÈû¶ÓÁУ¨Blocking Queue£©£¬Óнç×èÈûÁжӣ¨Bounded Blocking Queue£©£¬Ë«¶Ë¶ÓÁУ¨Deque£©£¬×èÈûË«¶ËÁжӣ¨Blocking Deque£©£¬×èÈû¹«Æ½Áжӣ¨Blocking Fair Queue£©£¬ÑÓ³ÙÁжӣ¨Delayed Queue£©£¬²¼Â¡¹ýÂËÆ÷£¨Bloom Filter£©£¬Ô­×ÓÕû³¤ÐΣ¨AtomicLong£©£¬Ô­×ÓË«¾«¶È¸¡µãÊý£¨AtomicDouble£©£¬BitSetµÈRedisÔ­±¾Ã»Óеķֲ¼Ê½Êý¾Ý½á¹¹¡£
  • ·Ö²¼Ê½Ëø£ºRedisson»¹ÊµÏÖÁËRedisÎĵµÖÐÌáµ½Ïñ·Ö²¼Ê½ËøLockÕâÑùµÄ¸ü¸ß½×Ó¦Óó¡¾°¡£ÊÂʵÉÏRedisson²¢Ã»Óв»Ö¹²½ÓÚ´Ë£¬ÔÚ·Ö²¼Ê½ËøµÄ»ù´¡ÉÏ»¹ÌṩÁËÁªËø£¨MultiLock£©£¬¶ÁдËø£¨ReadWriteLock£©£¬¹«Æ½Ëø£¨Fair Lock£©£¬ºìËø£¨RedLock£©£¬ÐźÅÁ¿£¨Semaphore£©£¬¿É¹ýÆÚÐÔÐźÅÁ¿£¨PermitExpirableSemaphore£©ºÍ±ÕËø£¨CountDownLatch£©ÕâЩʵ¼Êµ±ÖжԶàÏ̸߲߳¢·¢Ó¦ÓÃÖÁ¹ØÖØÒªµÄ»ù±¾²¿¼þ¡£ÕýÊÇͨ¹ýʵÏÖ»ùÓÚRedisµÄ¸ß½×Ó¦Ó÷½°¸£¬Ê¹Redisson³ÉΪ¹¹½¨·Ö²¼Ê½ÏµÍ³µÄÖØÒª¹¤¾ß¡£

¶þ¡¢ÕûºÏ Redisson

Spring Boot ÕûºÏ Redisson ÓÐÁ½ÖÖ·½°¸£º

  • ³ÌÐò»¯ÅäÖá£
  • Îļþ·½Ê½ÅäÖá£

±¾Æª½éÉÜÈçºÎÓóÌÐò»¯µÄ·½Ê½ÕûºÏ Redisson¡£

2.1 ÒýÈë Maven ÒÀÀµ

ÔÚ passjava-question ΢·þÎñµÄ pom.xml ÒýÈë redissonµÄ maven ÒÀÀµ¡£

<!-- https://mvnrepository.com/artifact/org.redisson/redisson -->
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.15.5</version>
</dependency>

2.2 ×Ô¶¨ÒåÅäÖÃÀà

ÏÂÃæµÄ´úÂëÊǵ¥½Úµã Redis µÄÅäÖá£

@Configuration
public class MyRedissonConfig {
    /**
     * ¶Ô Redisson µÄʹÓö¼ÊÇͨ¹ý RedissonClient ¶ÔÏó
     * @return
     * @throws IOException
     */
    @Bean(destroyMethod="shutdown") // ·þÎñÍ£Ö¹ºóµ÷Óà shutdown ·½·¨¡£
    public RedissonClient redisson() throws IOException {
        // 1.´´½¨ÅäÖÃ
        Config config = new Config();
        // ¼¯ÈºÄ£Ê½
        // config.useClusterServers().addNodeAddress("127.0.0.1:7004", "127.0.0.1:7001");
        // 2.¸ù¾Ý Config ´´½¨³ö RedissonClient ʾÀý¡£
        config.useSingleServer().setAddress("redis://127.0.0.1:6379");
        return Redisson.create(config);
    }
}

2.3 ²âÊÔÅäÖÃÀà

н¨Ò»¸öµ¥Ôª²âÊÔ·½·¨¡£

@Autowired
RedissonClient redissonClient;

@Test
public void TestRedisson() {
    System.out.println(redissonClient);
}

ÎÒÃÇÔËÐÐÕâ¸ö²âÊÔ·½·¨£¬´òÓ¡³ö redissonClient

org.redisson.Redisson@77f66138

Èý¡¢·Ö²¼Ê½¿ÉÖØÈëËø

3.1 ¿ÉÖØÈëËø²âÊÔ

»ùÓÚRedisµÄRedisson·Ö²¼Ê½¿ÉÖØÈëËøRLockJava ¶ÔÏóʵÏÖÁËjava.util.concurrent.locks.Lock½Ó¿Ú¡£Í¬Ê±»¹ÌṩÁËÒì²½£¨Async£©¡¢·´Éäʽ£¨Reactive£©ºÍRxJava2±ê×¼µÄ½Ó¿Ú¡£

RLock lock = redisson.getLock("anyLock");
// ×î³£¼ûµÄʹÓ÷½·¨
lock.lock();

ÎÒÃÇÓà passjava Õâ¸ö¿ªÔ´ÏîÄ¿²âÊÔÏ¿ÉÖØÈëËøµÄÁ½¸öµã£º

  • £¨1£©¶à¸öÏß³ÌÇÀÕ¼Ëø£¬ºóÃæËøÐèÒªµÈ´ýÂð£¿
  • £¨2£©Èç¹ûÇÀÕ¼µ½ËøµÄÏß³ÌËùÔڵķþÎñÍ£ÁË£¬Ëø»á²»»á±»ÊÍ·Å£¿

3.1.1 ÑéÖ¤Ò»£º¿ÉÖØÈëËøÊÇ×èÈûµÄÂð£¿

ΪÁËÑéÖ¤ÒÔÉÏÁ½µã£¬ÎÒдÁ˸ö demo ³ÌÐò£º´úÂëµÄÁ÷³Ì¾ÍÊÇÉèÖÃWuKong-lockËø£¬È»ºó¼ÓËø£¬´òÓ¡Ïß³Ì ID£¬µÈ´ý 10 ÃëºóÊÍ·ÅËø£¬×îºó·µ»ØÏìÓ¦£º¡°test lock ok¡±¡£

@ResponseBody
@GetMapping("test-lock")
public String TestLock() {
    // 1.»ñÈ¡Ëø£¬Ö»ÒªËøµÄÃû×ÖÒ»Ñù£¬»ñÈ¡µ½µÄËø¾ÍÊÇͬһ°ÑËø¡£
    RLock lock = redisson.getLock("WuKong-lock");

    // 2.¼ÓËø
    lock.lock();
    try {
        System.out.println("¼ÓËø³É¹¦£¬Ö´ÐкóÐø´úÂë¡£Ïß³Ì ID£º" + Thread.currentThread().getId());
        Thread.sleep(10000);
    } catch (Exception e) {
        //TODO
    } finally {
        lock.unlock();
        // 3.½âËø
        System.out.println("Finally£¬ÊÍ·ÅËø³É¹¦¡£Ïß³Ì ID£º" + Thread.currentThread().getId());
    }

    return "test lock ok";
}

ÏÈÑéÖ¤µÚÒ»¸öµã£¬ÓÃÁ½¸ö http ÇëÇóÀ´²âÊÔÇÀÕ¼Ëø¡£

ÇëÇóµÄ URL£º

http://localhost:11000/question/v1/redisson/test/test-lock

µÚÒ»¸öÏ̶߳ÔÓ¦µÄÏß³Ì ID Ϊ 86£¬10Ãëºó£¬ÊÍ·ÅËø¡£ÔÚÕâÆڼ䣬µÚ¶þ¸öÏß³ÌÐèÒªµÈ´ýËøÊÍ·Å¡£

µÚÒ»¸öÏß³ÌÊÍ·ÅËøÖ®ºó£¬µÚ¶þ¸öÏ̻߳ñÈ¡µ½ÁËËø£¬10 Ãëºó£¬ÊÍ·ÅËø¡£

»­ÁËÒ»¸öÁ÷³Ìͼ£¬°ïÖú´ó¼ÒÀí½â¡£ÈçÏÂͼËùʾ£º

  • µÚÒ»²½£ºÏß³Ì A ÔÚ 0 Ãëʱ£¬ÇÀÕ¼µ½Ëø£¬0.1 Ãëºó£¬¿ªÊ¼Ö´Ðеȴý 10 s¡£
  • µÚ¶þ²½£ºÏß³Ì B ÔÚ 0.1 Ãë³¢ÊÔÇÀÕ¼Ëø£¬Î´ÄÜÇÀµ½Ëø£¨±» A ÇÀÕ¼ÁË£©¡£
  • µÚÈý²½£ºÏß³Ì A ÔÚ 10.1 Ãëºó£¬ÊÍ·ÅËø¡£
  • µÚËIJ½£ºÏß³Ì B ÔÚ 10.1 ÃëºóÇÀÕ¼µ½Ëø£¬È»ºóµÈ´ý 10 ÃëºóÊÍ·ÅËø¡£

ÓÉ´Ë¿ÉÒԵóö½áÂÛ£¬Redisson µÄ¿ÉÖØÈëËø£¨lock£©ÊÇ×èÈûÆäËûÏ̵߳ģ¬ÐèÒªµÈ´ýÆäËûÏß³ÌÊͷŵġ£

3.1.2 ÑéÖ¤¶þ£º·þÎñÍ£ÁË£¬Ëø»áÊÍ·ÅÂð£¿

Èç¹ûÏß³Ì A ÔڵȴýµÄ¹ý³ÌÖУ¬·þÎñͻȻͣÁË£¬ÄÇôËø»áÊÍ·ÅÂð£¿Èç¹û²»ÊͷŵĻ°£¬¾Í»á³ÉΪËÀËø£¬×èÈûÁËÆäËûÏ̻߳ñÈ¡Ëø¡£

ÎÒÃÇÏÈÀ´¿´ÏÂÏß³Ì A µÄ»ñÈ¡ËøºóµÄ£¬Redis ¿Í»§¶Ë²éѯµ½µÄ½á¹û£¬ÈçÏÂͼËùʾ£º

WuKong-lock ÓÐÖµ£¬¶øÇÒ´ó¼Ò¿ÉÒÔ¿´µ½ TTL ÔÚ²»¶Ï±äС£¬ËµÃ÷ WuKong-lock ÊÇ×Ô´ø¹ýÆÚʱ¼äµÄ¡£

ͨ¹ý¹Û²ì£¬¾­¹ý 30 Ãëºó£¬WuKong-lock ¹ýÆÚÏûʧÁË¡£ËµÃ÷ Redisson ÔÚÍ£»úºó£¬Õ¼ÓõÄËø»á×Ô¶¯ÊÍ·Å¡£

ÄÇÕâÓÖÊÇʲôԭÀíÄØ£¿ÕâÀï¾ÍÒªÌáÒ»¸ö¸ÅÄîÁË£¬¿´ÃŹ·¡£

3.2 ¿´ÃŹ·Ô­Àí

Èç¹û¸ºÔð´¢´æÕâ¸ö·Ö²¼Ê½ËøµÄ Redisson ½Úµãå´»úÒԺ󣬶øÇÒÕâ¸öËøÕýºÃ´¦ÓÚËøסµÄ״̬ʱ£¬Õâ¸öËø»á³öÏÖËøËÀµÄ״̬¡£ÎªÁ˱ÜÃâÕâÖÖÇé¿öµÄ·¢Éú£¬RedissonÄÚ²¿ÌṩÁËÒ»¸ö¼à¿ØËøµÄ¿´ÃŹ·£¬ËüµÄ×÷ÓÃÊÇÔÚRedissonʵÀý±»¹Ø±ÕÇ°£¬²»¶ÏµÄÑÓ³¤ËøµÄÓÐЧÆÚ¡£

ĬÈÏÇé¿öÏ£¬¿´ÃŹ·µÄ¼ì²éËøµÄ³¬Ê±Ê±¼äÊÇ30ÃëÖÓ£¬Ò²¿ÉÒÔͨ¹ýÐÞ¸ÄConfig.lockWatchdogTimeoutÀ´ÁíÐÐÖ¸¶¨¡£

Èç¹ûÎÒÃÇδÖƶ¨ lock µÄ³¬Ê±Ê±¼ä£¬¾ÍʹÓà 30 Ãë×÷Ϊ¿´ÃŹ·µÄĬÈÏʱ¼ä¡£Ö»ÒªÕ¼Ëø³É¹¦£¬¾Í»áÆô¶¯Ò»¸ö¶¨Ê±ÈÎÎñ£ºÃ¿¸ô 10 ÃëÖØиøËøÉèÖùýÆÚµÄʱ¼ä£¬¹ýÆÚʱ¼äΪ 30 Ãë¡£

ÈçÏÂͼËùʾ£º

µ±·þÎñÆ÷å´»úºó£¬ÒòΪËøµÄÓÐЧÆÚÊÇ 30 Ã룬ËùÒÔ»áÔÚ 30 ÃëÄÚ×Ô¶¯½âËø¡££¨30ÃëµÈÓÚå´»ú֮ǰµÄËøÕ¼ÓÃʱ¼ä+ºóÐøËøÕ¼ÓõÄʱ¼ä£©¡£

ÈçÏÂͼËùʾ£º

3.3 ÉèÖÃËø¹ýÆÚʱ¼ä

ÎÒÃÇÒ²¿ÉÒÔͨ¹ý¸øËøÉèÖùýÆÚʱ¼ä£¬ÈÃÆä×Ô¶¯½âËø¡£

ÈçÏÂËùʾ£¬ÉèÖÃËø 8 Ãëºó×Ô¶¯¹ýÆÚ¡£

lock.lock(8, TimeUnit.SECONDS);

Èç¹ûÒµÎñÖ´ÐÐʱ¼ä³¬¹ý 8 Ã룬ÊÖ¶¯ÊÍ·ÅËø½«»á±¨´í£¬ÈçÏÂͼËùʾ£º

ËùÒÔÎÒÃÇÈç¹ûÉèÖÃÁËËøµÄ×Ô¶¯¹ýÆÚʱ¼ä£¬ÔòÖ´ÐÐÒµÎñµÄʱ¼äÒ»¶¨ÒªÐ¡ÓÚËøµÄ×Ô¶¯¹ýÆÚʱ¼ä£¬·ñÔò¾Í»á±¨´í¡£

ËÄ¡¢ÍõÕß·½°¸

ÉÏһƪÎÒ½²½âÁË·Ö²¼Ê½ËøµÄÎåÖÖ·½°¸£º¡¶´ÓÇàÍ­µ½×êʯµÄÑݽø·½°¸¡·£¬ÕâһƪÖ÷ÒªÊǽ²½âÈçºÎÓà Redisson ÔÚ Spring Boot ÏîÄ¿ÖÐʵÏÖ·Ö²¼Ê½ËøµÄ·½°¸¡£

ÒòΪ Redisson ·Ç³£Ç¿´ó£¬ÊµÏÖ·Ö²¼Ê½ËøµÄ·½°¸·Ç³£¼ò½à£¬ËùÒÔ³Æ×÷ÍõÕß·½°¸¡£

Ô­ÀíͼÈçÏ£º

´úÂëÈçÏÂËùʾ£º

// 1.ÉèÖ÷ֲ¼Ê½Ëø
RLock lock = redisson.getLock("lock");
// 2.Õ¼ÓÃËø
lock.lock();
// 3.Ö´ÐÐÒµÎñ
...
// 4.ÊÍ·ÅËø
lock.unlock();

ºÍ֮ǰ Redis µÄ·½°¸Ïà±È£¬¼ò½àºÜ¶à¡£

Îå¡¢·Ö²¼Ê½¶ÁдËø

»ùÓÚ Redis µÄ Redisson ·Ö²¼Ê½¿ÉÖØÈë¶ÁдËøRReadWriteLock Java¶ÔÏóʵÏÖÁËjava.util.concurrent.locks.ReadWriteLock½Ó¿Ú¡£ÆäÖжÁËøºÍдËø¶¼¼Ì³ÐÁË RLock½Ó¿Ú¡£

дËøÊÇÒ»¸öÅÄËûËø£¨»¥³âËø£©£¬¶ÁËøÊÇÒ»¸ö¹²ÏíËø¡£

  • ¶ÁËø + ¶ÁËø£ºÏ൱ÓÚû¼ÓËø£¬¿ÉÒÔ²¢·¢¶Á¡£
  • ¶ÁËø + дËø£ºÐ´ËøÐèÒªµÈ´ý¶ÁËøÊÍ·ÅËø¡£
  • дËø + дËø£º»¥³â£¬ÐèÒªµÈ´ý¶Ô·½µÄËøÊÍ·Å¡£
  • дËø + ¶ÁËø£º¶ÁËøÐèÒªµÈ´ýдËøÊÍ·Å¡£

ʾÀý´úÂëÈçÏ£º

RReadWriteLock rwlock = redisson.getReadWriteLock("anyRWLock");
// ×î³£¼ûµÄʹÓ÷½·¨
rwlock.readLock().lock();
// »ò
rwlock.writeLock().lock();

ÁíÍâRedisson»¹Í¨¹ý¼ÓËøµÄ·½·¨ÌṩÁËleaseTimeµÄ²ÎÊýÀ´Ö¸¶¨¼ÓËøµÄʱ¼ä¡£³¬¹ýÕâ¸öʱ¼äºóËø±ã×Ô¶¯½â¿ªÁË¡£

// 10ÃëÖÓÒÔºó×Ô¶¯½âËø
// ÎÞÐèµ÷ÓÃunlock·½·¨ÊÖ¶¯½âËø
rwlock.readLock().lock(10, TimeUnit.SECONDS);
// »ò
rwlock.writeLock().lock(10, TimeUnit.SECONDS);

// ³¢ÊÔ¼ÓËø£¬×î¶àµÈ´ý100Ã룬ÉÏËøÒÔºó10Ãë×Ô¶¯½âËø
boolean res = rwlock.readLock().tryLock(100, 10, TimeUnit.SECONDS);
// »ò
boolean res = rwlock.writeLock().tryLock(100, 10, TimeUnit.SECONDS);
...
lock.unlock();

Áù¡¢·Ö²¼Ê½ÐźÅÁ¿

»ùÓÚRedisµÄRedissonµÄ·Ö²¼Ê½ÐźÅÁ¿£¨Semaphore£©Java¶ÔÏóRSemaphore²ÉÓÃÁËÓëjava.util.concurrent.SemaphoreÏàËƵĽӿںÍÓ÷¨¡£Í¬Ê±»¹ÌṩÁËÒì²½£¨Async£©¡¢·´Éäʽ£¨Reactive£©ºÍRxJava2±ê×¼µÄ½Ó¿Ú¡£

¹ØÓÚÐźÅÁ¿µÄʹÓôó¼Ò¿ÉÒÔÏëÏóÒ»ÏÂÕâ¸ö³¡¾°£¬ÓÐÈý¸öÍ£³µÎ»£¬µ±Èý¸öÍ£³µÎ»ÂúÁ˺ó£¬ÆäËû³µ¾Í²»Í£ÁË¡£¿ÉÒ԰ѳµÎ»±È×÷Ðźţ¬ÏÖÔÚÓÐÈý¸öÐźţ¬Í£Ò»´Î³µ£¬ÓõôÒ»¸öÐźţ¬³µÀ뿪¾ÍÊÇÊÍ·ÅÒ»¸öÐźš£

ÎÒÃÇÓà Redisson À´ÑÝʾÉÏÊöÍ£³µÎ»µÄ³¡¾°¡£

Ïȶ¨ÒåÒ»¸öÕ¼ÓÃÍ£³µÎ»µÄ·½·¨£º

/**
* Í£³µ£¬Õ¼ÓÃÍ£³µÎ»
* ×ܹ² 3 ¸ö³µÎ»
*/
@ResponseBody
@RequestMapping("park")
public String park() throws InterruptedException {
  // »ñÈ¡ÐźÅÁ¿£¨Í£³µ³¡£©
  RSemaphore park = redisson.getSemaphore("park");
  // »ñÈ¡Ò»¸öÐźţ¨Í£³µÎ»£©
  park.acquire();

  return "OK";
}

ÔÙ¶¨ÒåÒ»¸öÀ뿪³µÎ»µÄ·½·¨£º

/**
 * ÊͷųµÎ»
 * ×ܹ² 3 ¸ö³µÎ»
 */
@ResponseBody
@RequestMapping("leave")
public String leave() throws InterruptedException {
    // »ñÈ¡ÐźÅÁ¿£¨Í£³µ³¡£©
    RSemaphore park = redisson.getSemaphore("park");
    // ÊÍ·ÅÒ»¸öÐźţ¨Í£³µÎ»£©
    park.release();

    return "OK";
}

ΪÁ˼ò±ã£¬ÎÒÓà Redis ¿Í»§¶ËÌí¼ÓÁËÒ»¸ö key£º¡°park¡±£¬ÖµµÈÓÚ 3£¬´ú±íÐźÅÁ¿Îª park£¬×ܹ²ÓÐÈý¸öÖµ¡£

È»ºóÓà postman ·¢ËÍ park ÇëÇóÕ¼ÓÃÒ»¸öÍ£³µÎ»¡£

È»ºóÔÚ redis ¿Í»§¶Ë²é¿´ park µÄÖµ£¬·¢ÏÖÒѾ­¸ÄΪ 2 ÁË¡£¼ÌÐøµ÷ÓÃÁ½´Î£¬·¢ÏÖ park µÄµÈÓÚ 0£¬µ±µ÷ÓõÚËĴεÄʱºò£¬»á·¢ÏÖÇëÇóÒ»Ö±´¦ÓڵȴýÖУ¬ËµÃ÷³µÎ»²»¹»ÁË¡£Èç¹ûÏëÒª²»×èÈû£¬¿ÉÒÔÓà tryAcquire »ò tryAcquireAsync¡£

ÎÒÃÇÔÙµ÷ÓÃÀ뿪³µÎ»µÄ·½·¨£¬park µÄÖµ±äΪÁË 1£¬´ú±í³µÎ»Ê£Óà 1 ¸ö¡£

×¢Ò⣺¶à´ÎÖ´ÐÐÊÍ·ÅÐźÅÁ¿²Ù×÷£¬Ê£ÓàÐźÅÁ¿»áÒ»Ö±Ôö¼Ó£¬¶ø²»Êǵ½ 3 ºó¾Í·â¶¥ÁË¡£

ÆäËû·Ö²¼Ê½Ëø£º

  • ¹«Æ½Ëø£¨Fair Lock£©
  • ÁªËø£¨MultiLock£©
  • ºìËø£¨RedLock£©
  • ¶ÁдËø£¨ReadWriteLock£©
  • ¿É¹ýÆÚÐÔÐźÅÁ¿£¨PermitExpirableSemaphore£©
  • ±ÕËø£¨CountDownLatch£©

»¹ÓÐÆäËû·Ö²¼Ê½Ëø¾Í²»ÔÚ±¾ÆªÕ¹¿ªÁË£¬¸ÐÐËȤµÄͬѧ¿ÉÒԲ鿴¹Ù·½Îĵµ¡£

²Î¿¼×ÊÁÏ£º

https://github.com/redisson/redisson


±¾Õ¾²¿·ÖÄÚÈÝתÔØÓÚÍøÂ磬°æȨ¹éÔ­×÷ÕßËùÓУ¬×ªÔØ֮ĿµÄÔÚÓÚ´«²¥¸ü¶àÓÅÐã¼¼ÊõÄÚÈÝ£¬ÈçÓÐÇÖȨÇëÁªÏµQQ/΢ÐÅ£º153890879ɾ³ý£¬Ð»Ð»£¡

ÍƼöͼÎÄ

  • ÖÜÅÅÐÐ
  • ÔÂÅÅÐÐ
  • ×ÜÅÅÐÐ

Ëæ»úÍƼö