ÉÏƪ½²½âÁËÈçºÎÓà 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 µÄÔÀí¡£
Èç¹ûÄã֮ǰÊÇÔÚÓà Redis µÄ»°£¬ÄÇʹÓà Redisson µÄ»°½«»áÊ°빦±¶£¬Redisson ÌṩÁËʹÓà RedisµÄ×î¼òµ¥ºÍ×î±ã½ÝµÄ·½·¨¡£
RedissonµÄ×ÚÖ¼ÊÇ´Ù½øʹÓÃÕß¶Ô Redis µÄ¹Ø×¢·ÖÀ루Separation of Concern£©£¬´Ó¶øÈÃʹÓÃÕßÄܹ»½«¾«Á¦¸ü¼¯ÖеطÅÔÚ´¦ÀíÒµÎñÂß¼ÉÏ¡£
Redisson ÊÇÒ»¸öÔÚ Redis µÄ»ù´¡ÉÏʵÏÖµÄ Java פÄÚ´æÊý¾ÝÍø¸ñ£¨In-Memory Data Grid£©¡£
Spring Boot ÕûºÏ Redisson ÓÐÁ½ÖÖ·½°¸£º
±¾Æª½éÉÜÈçºÎÓóÌÐò»¯µÄ·½Ê½ÕûºÏ Redisson¡£
ÔÚ 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>
ÏÂÃæµÄ´úÂëÊǵ¥½Úµã 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); } }
н¨Ò»¸öµ¥Ôª²âÊÔ·½·¨¡£
@Autowired RedissonClient redissonClient; @Test public void TestRedisson() { System.out.println(redissonClient); }
ÎÒÃÇÔËÐÐÕâ¸ö²âÊÔ·½·¨£¬´òÓ¡³ö redissonClient
org.redisson.Redisson@77f66138
»ùÓÚRedisµÄRedisson·Ö²¼Ê½¿ÉÖØÈëËøRLock
Java ¶ÔÏóʵÏÖÁËjava.util.concurrent.locks.Lock
½Ó¿Ú¡£Í¬Ê±»¹ÌṩÁËÒì²½£¨Async£©¡¢·´Éäʽ£¨Reactive£©ºÍRxJava2±ê×¼µÄ½Ó¿Ú¡£
RLock lock = redisson.getLock("anyLock"); // ×î³£¼ûµÄʹÓ÷½·¨ lock.lock();
ÎÒÃÇÓà passjava Õâ¸ö¿ªÔ´ÏîÄ¿²âÊÔÏ¿ÉÖØÈëËøµÄÁ½¸öµã£º
ΪÁËÑéÖ¤ÒÔÉÏÁ½µã£¬ÎÒдÁ˸ö 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 Ãëºó£¬ÊÍ·ÅËø¡£
»ÁËÒ»¸öÁ÷³Ìͼ£¬°ïÖú´ó¼ÒÀí½â¡£ÈçÏÂͼËùʾ£º
ÓÉ´Ë¿ÉÒԵóö½áÂÛ£¬Redisson µÄ¿ÉÖØÈëËø£¨lock£©ÊÇ×èÈûÆäËûÏ̵߳ģ¬ÐèÒªµÈ´ýÆäËûÏß³ÌÊͷŵġ£
Èç¹ûÏß³Ì A ÔڵȴýµÄ¹ý³ÌÖУ¬·þÎñͻȻͣÁË£¬ÄÇôËø»áÊÍ·ÅÂð£¿Èç¹û²»ÊͷŵĻ°£¬¾Í»á³ÉΪËÀËø£¬×èÈûÁËÆäËûÏ̻߳ñÈ¡Ëø¡£
ÎÒÃÇÏÈÀ´¿´ÏÂÏß³Ì A µÄ»ñÈ¡ËøºóµÄ£¬Redis ¿Í»§¶Ë²éѯµ½µÄ½á¹û£¬ÈçÏÂͼËùʾ£º
WuKong-lock ÓÐÖµ£¬¶øÇÒ´ó¼Ò¿ÉÒÔ¿´µ½ TTL ÔÚ²»¶Ï±äС£¬ËµÃ÷ WuKong-lock ÊÇ×Ô´ø¹ýÆÚʱ¼äµÄ¡£
ͨ¹ý¹Û²ì£¬¾¹ý 30 Ãëºó£¬WuKong-lock ¹ýÆÚÏûʧÁË¡£ËµÃ÷ Redisson ÔÚÍ£»úºó£¬Õ¼ÓõÄËø»á×Ô¶¯ÊÍ·Å¡£
ÄÇÕâÓÖÊÇʲôÔÀíÄØ£¿ÕâÀï¾ÍÒªÌáÒ»¸ö¸ÅÄîÁË£¬¿´ÃŹ·
¡£
Èç¹û¸ºÔð´¢´æÕâ¸ö·Ö²¼Ê½ËøµÄ Redisson ½Úµãå´»úÒԺ󣬶øÇÒÕâ¸öËøÕýºÃ´¦ÓÚËøסµÄ״̬ʱ£¬Õâ¸öËø»á³öÏÖËøËÀµÄ״̬¡£ÎªÁ˱ÜÃâÕâÖÖÇé¿öµÄ·¢Éú£¬RedissonÄÚ²¿ÌṩÁËÒ»¸ö¼à¿ØËøµÄ¿´ÃŹ·
£¬ËüµÄ×÷ÓÃÊÇÔÚRedissonʵÀý±»¹Ø±ÕÇ°£¬²»¶ÏµÄÑÓ³¤ËøµÄÓÐЧÆÚ¡£
ĬÈÏÇé¿öÏ£¬¿´ÃŹ·µÄ¼ì²éËøµÄ³¬Ê±Ê±¼äÊÇ30ÃëÖÓ£¬Ò²¿ÉÒÔͨ¹ýÐÞ¸ÄConfig.lockWatchdogTimeoutÀ´ÁíÐÐÖ¸¶¨¡£
Èç¹ûÎÒÃÇδÖƶ¨ lock µÄ³¬Ê±Ê±¼ä£¬¾ÍʹÓà 30 Ãë×÷Ϊ¿´ÃŹ·µÄĬÈÏʱ¼ä¡£Ö»ÒªÕ¼Ëø³É¹¦£¬¾Í»áÆô¶¯Ò»¸ö¶¨Ê±ÈÎÎñ
£ºÃ¿¸ô 10 ÃëÖØиøËøÉèÖùýÆÚµÄʱ¼ä£¬¹ýÆÚʱ¼äΪ 30 Ãë¡£
ÈçÏÂͼËùʾ£º
µ±·þÎñÆ÷å´»úºó£¬ÒòΪËøµÄÓÐЧÆÚÊÇ 30 Ã룬ËùÒÔ»áÔÚ 30 ÃëÄÚ×Ô¶¯½âËø¡££¨30ÃëµÈÓÚå´»ú֮ǰµÄËøÕ¼ÓÃʱ¼ä+ºóÐøËøÕ¼ÓõÄʱ¼ä£©¡£
ÈçÏÂͼËùʾ£º
ÎÒÃÇÒ²¿ÉÒÔͨ¹ý¸øËøÉèÖùýÆÚʱ¼ä£¬ÈÃÆä×Ô¶¯½âËø¡£
ÈçÏÂËùʾ£¬ÉèÖÃËø 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 ºó¾Í·â¶¥ÁË¡£
ÆäËû·Ö²¼Ê½Ëø£º
»¹ÓÐÆäËû·Ö²¼Ê½Ëø¾Í²»ÔÚ±¾ÆªÕ¹¿ªÁË£¬¸ÐÐËȤµÄͬѧ¿ÉÒԲ鿴¹Ù·½Îĵµ¡£
²Î¿¼×ÊÁÏ£º
ÓÎÏ·Êг¡µÄÈȶÈÒѾ²»ÑÔ¶øÓ÷£¬Ëæ×ÅÃñÖÚÉú»îˮƽµÄÌáÉý£¬´ó¼Ò¶ÔÓÚ¾«ÉñÓéÀÖÉú»îµÄ...
À´Ô´ | °¢Àï·ÉÌìCIOѧÌÃ΢ÐŹ«ÖںŠ½ðÈÚÊý×Ö»¯×ªÐ͹ý³ÌÖУ¬Êг¡µÄϸ΢±ä»¯£¬¿Í»§...
×î½ü£¬ÔÚΪ Coco ÓÅ»¯·Ö²ã¼Ü¹¹Ö®Ê±£¬ÎÒÏÝÈëÁ˸÷ÖÖ¾ö²ßÀ§ÄÑÖ®ÖС£ËùÒÔÎÒͨ¹ý²»¶Ï...
±¾ÎÄתÔØ×Ô¹«ÖںŶÁоÊõ(ID£ºAI_Discovery) Èç¹ûÄã¼´½«ÒªÃæÁÙ´óÐͿƼ¼¹«Ë¾µÄ¼¼Êõ...
¼ÆËãµÄÏÂÒ»²½·¢Õ¹ÊÇʲô£¬½«ÈçºÎÓ°Ïì×éÖ¯µÄÕ½ÂÔ?ר¼ÒÔ¤²âÁ˱ßÔµ¼ÆËãÔÚ2021ÄêµÄ·¢...
ÓëÆÕͨµÄIDC»ú·¿»ò·þÎñÆ÷³§ÉÌÏà±È£¬°¢ÀïÔÆÌṩµÄÔÆ·þÎñÆ÷ECS¾ßÓи߿ÉÓÃÐÔ¡¢°²È«...
¿ªÔ´ RPC ¿ò¼ÜÓÐÄÄЩÄØ?Ò»ÀàÊǸúijÖÖÌض¨ÓïÑÔƽ̨°ó¶¨µÄ£¬ÁíÒ»ÀàÊÇÓëÓïÑÔÎ޹ؼ´...
Ò»¡¢±³¾° ? ÎÒÃǴ󲿷ÖÈ˵ıà³ÌÏ°¹ß¶¼ÊÇÏßÐÔ±à³Ì,ËùνÏßÐÔ±à³Ì¾ÍÊÇÒ»¸öÇëÇóÉæ¼°...
Ò»¡¢Êý¾ÝÖÐ̨ÊÇÕæµÄÈÈ ÔÚ2018Äê֮ǰ¿ÉÄÜÖ»ÓÐÒ»ÉÙ²¿·ÖÈËÔÚ̸ÖÐ̨£¬´Ó2018ÄêÏ°ëÄê...
ΪÁËʹÉìËõ×é×Ô¶¯¼ÓÈëµÄʵÀý×Ô¶¯²¿ÊðÓ¦Óã¬ÄúÐèÒª´´½¨Ë½ÓоµÏñ£¬È·±£¸Ã¾µÏñÉÏÓÐ...