{"id":201830,"date":"2025-05-10T08:39:23","date_gmt":"2025-05-10T00:39:23","guid":{"rendered":"https:\/\/server.hk\/cnblog\/201830\/"},"modified":"2025-05-10T08:39:23","modified_gmt":"2025-05-10T00:39:23","slug":"redisson%e5%88%86%e5%b8%83%e5%bc%8f%e9%94%81%e4%b9%8b%e5%8a%a0%e8%a7%a3%e9%94%81%e8%af%a6%e8%a7%a3","status":"publish","type":"post","link":"https:\/\/server.hk\/cnblog\/201830\/","title":{"rendered":"Redisson\u5206\u5e03\u5f0f\u9501\u4e4b\u52a0\u89e3\u9501\u8be6\u89e3"},"content":{"rendered":"<p><b><\/b> <\/p>\n<h1>Redisson\u5206\u5e03\u5f0f\u9501\u4e4b\u52a0\u89e3\u9501\u8be6\u89e3<\/h1>\n<p><span style=\"cursor: pointer\"><i><\/i>\u6536\u85cf<\/span> <\/p>\n<p>\u79ef\u7d2f\u77e5\u8bc6\uff0c\u80dc\u8fc7\u79ef\u84c4\u91d1\u94f6\uff01\u6bd5\u7adf\u5728\u6570\u636e\u5e93\u5f00\u53d1\u7684\u8fc7\u7a0b\u4e2d\uff0c\u4f1a\u9047\u5230\u5404\u79cd\u5404\u6837\u7684\u95ee\u9898\uff0c\u5f80\u5f80\u90fd\u662f\u4e00\u4e9b\u7ec6\u8282\u77e5\u8bc6\u70b9\u8fd8\u6ca1\u6709\u638c\u63e1\u597d\u800c\u5bfc\u81f4\u7684\uff0c\u56e0\u6b64\u57fa\u7840\u77e5\u8bc6\u70b9\u7684\u79ef\u7d2f\u662f\u5f88\u91cd\u8981\u7684\u3002\u4e0b\u9762\u672c\u6587\u300aRedisson\u5206\u5e03\u5f0f\u9501\u4e4b\u52a0\u89e3\u9501\u8be6\u89e3\u300b\uff0c\u5c31\u5e26\u5927\u5bb6\u8bb2\u89e3\u4e00\u4e0b\u9501\u3001Redisson\u5206\u5e03\u5f0f\u3001\u52a0\u89e3\u9501\u77e5\u8bc6\u70b9\uff0c\u82e5\u662f\u4f60\u5bf9\u672c\u6587\u611f\u5174\u8da3\uff0c\u6216\u8005\u662f\u60f3\u641e\u61c2\u5176\u4e2d\u67d0\u4e2a\u77e5\u8bc6\u70b9\uff0c\u5c31\u8bf7\u4f60\u7ee7\u7eed\u5f80\u4e0b\u770b\u5427~<\/p>\n<h2>\u5f15\u8a00<\/h2>\n<p>2023\u7684\u91d1\u4e09\u94f6\u56db\u6765\u7684\u6ca1\u60f3\u8c61\u4e2d\u90a3\u4e48\u6fc0\u70c8\uff0c\u4e00\u4e2a\u670b\u53cb\u524d\u6bb5\u65f6\u95f4\u6295\u4e86\u51e0\u5341\u5bb6\uff0c\u591a\u6570\u77f3\u6c89\u5927\u6d77\uff0c\u597d\u4e0d\u5bb9\u6613\u7b49\u6765\u9762\u8bd5\u673a\u4f1a\uff0c\u5c31\u6070\u597d\u88ab\u95ee\u9053\u9879\u76ee\u4e2d\u5173\u4e8e\u5206\u5e03\u5f0f\u9501\u7684\u5e94\u7528\uff0c\u540e\u6d89\u53caRedisson\u5b9e\u73b0\u5206\u5e03\u5f0f\u9501\u7684\u539f\u7406\uff0c\u7b54\u4e0d\u4e0a\u6765\u3002<\/p>\n<h2>\u9501\u7684\u53ef\u91cd\u5165\u6027<\/h2>\n<p>\u6211\u4eec\u90fd\u77e5\u9053\uff0cJava\u4e2dsynchronized\u548clock\u90fd\u652f\u6301\u53ef\u91cd\u5165\uff0csynchronized\u7684\u9501\u5173\u8054\u4e00\u4e2a\u7ebf\u7a0b\u6301\u6709\u8005\u548c\u4e00\u4e2a\u8ba1\u6570\u5668\u3002\u5f53\u4e00\u4e2a\u7ebf\u7a0b\u8bf7\u6c42\u6210\u529f\u540e\uff0cJVM\u4f1a\u8bb0\u4e0b\u6301\u6709\u9501\u7684\u7ebf\u7a0b\uff0c\u5e76\u5c06\u8ba1\u6570\u5668\u8ba1\u4e3a1\u3002\u6b64\u65f6\u5176\u4ed6\u7ebf\u7a0b\u8bf7\u6c42\u8be5\u9501\uff0c\u5219\u5fc5\u987b\u7b49\u5f85\u3002\u800c\u8be5\u6301\u6709\u9501\u7684\u7ebf\u7a0b\u5982\u679c\u518d\u6b21\u8bf7\u6c42\u8fd9\u4e2a\u9501\uff0c\u5c31\u53ef\u4ee5\u518d\u6b21\u62ff\u5230\u8fd9\u4e2a\u9501\uff0c\u540c\u65f6\u8ba1\u6570\u5668\u4f1a\u9012\u589e\u3002\u5f53\u7ebf\u7a0b\u9000\u51fa\u4e00\u4e2asynchronized\u65b9\u6cd5\/\u5757\u65f6\uff0c\u8ba1\u6570\u5668\u4f1a\u9012\u51cf\uff0c\u5982\u679c\u8ba1\u6570\u5668\u4e3a0\u5219\u91ca\u653e\u8be5\u9501\uff1b\u5728ReentrantLock\u4e2d\uff0c\u5e95\u5c42\u7684 AQS \u5bf9\u5e94\u7684state \u540c\u6b65\u72b6\u6001\u503c\u8868\u793a\u7ebf\u7a0b\u83b7\u53d6\u8be5\u9501\u7684\u53ef\u91cd\u5165\u6b21\u6570\uff0c\u901a\u8fc7CAS\u65b9\u5f0f\u8fdb\u884c\u8bbe\u7f6e\uff0c\u5728\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0cstate\u7684\u503c\u4e3a0 \u8868\u793a\u5f53\u524d\u9501\u6ca1\u6709\u88ab\u4efb\u4f55\u7ebf\u7a0b\u6301\u6709\uff0c\u539f\u7406\u7c7b\u4f3c\u3002\u6240\u4ee5\u5982\u679c\u60f3\u8981\u5b9e\u73b0\u53ef\u91cd\u5165\u6027\uff0c\u53ef\u80fd\u987b\u6709\u4e00\u4e2a\u8ba1\u6570\u5668\u6765\u63a7\u5236\u91cd\u5165\u6b21\u6570\uff0c\u5b9e\u9645Redisson\u786e\u5b9e\u662f\u8fd9\u4e48\u505a\u7684\u3002<\/p>\n<p>\u597d\u7684\u6211\u4eec\u901a\u8fc7Redisson\u5ba2\u6237\u7aef\u8fdb\u884c\u8bbe\u7f6e\uff0c\u5e76\u5faa\u73af3\u6b21\uff0c\u6a21\u62df\u9501\u91cd\u5165\uff1a000<\/p>\n<pre>for(int i = 0; i \n<p>\u8fde\u63a5Redis\u5ba2\u6237\u7aef\u8fdb\u884c\u67e5\u770b\uff1a<\/p>\n<p style=\"text-align:center\"><img decoding=\"async\" src=\"https:\/\/www.17golang.com\/uploads\/20230513\/1683952931645f1523d94d1.jpg1683952931645f1523d94e1.jpg\" class=\"aligncenter\"><\/p>\n<p>\u53ef\u4ee5\u770b\u5230\uff0c\u6211\u4eec\u8bbe\u7f6e\u7684\u5206\u5e03\u5f0f\u9501\u662f\u5b58\u5728\u4e00\u4e2ahash\u7ed3\u6784\u4e2d\uff0cvalue\u770b\u8d77\u6765\u662f\u5faa\u73af\u7684\u6b21\u65703\uff0ckey\u5c31\u4e0d\u600e\u4e48\u8ba4\u8bc6\u4e86\uff0c\u90a3\u8fd9\u4e2akey\u662f\u600e\u4e48\u8bbe\u7f6e\u8fdb\u53bb\u7684\u5462\uff0c\u53e6\u5916\u4e3a\u4ec0\u4e48\u8981\u8bbe\u7f6e\u6210\u4e3aHash\u7c7b\u578b\u5462\uff1f<\/p>\n<h2>\u52a0\u9501<\/h2>\n<p>\u6211\u4eec\u5148\u6765\u770b\u770b\u666e\u901a\u7684\u5206\u5e03\u5f0f\u9501\u7684\u4e0a\u9501\u6d41\u7a0b\uff1a<\/p>\n<p style=\"text-align:center\"><img decoding=\"async\" src=\"https:\/\/www.17golang.com\/uploads\/20230513\/1683952932645f1524285b7.jpg1683952932645f1524285c6.png\" class=\"aligncenter\"><\/p>\n<p>\u8bf4\u660e\uff1a<\/p>\n<\/pre>\n<ul>\n<li>\u5ba2\u6237\u7aef\u5728\u8fdb\u884c\u52a0\u9501\u65f6\uff0c\u4f1a\u6821\u9a8c\u5982\u679c\u4e1a\u52a1\u4e0a\u6ca1\u6709\u8bbe\u7f6e\u6301\u6709\u9501\u65f6\u957fleaseTime\uff0c\u4f1a\u542f\u52a8\u770b\u95e8\u72d7\u6765\u6bcf\u969410s\u8fdb\u884c\u7eed\u547d\uff0c\u5426\u5219\u5c31\u76f4\u63a5\u4ee5leaseTime\u4f5c\u4e3a\u6301\u6709\u7684\u65f6\u957f\uff1b<\/li>\n<li>\u5e76\u53d1\u573a\u666f\u4e0b\uff0c\u5982\u679c\u5ba2\u6237\u7aef1\u9501\u8fd8\u672a\u91ca\u653e\uff0c\u5ba2\u6237\u7aef2\u5c1d\u8bd5\u83b7\u53d6\uff0c\u52a0\u9501\u5fc5\u7136\u5931\u8d25\uff0c\u7136\u540e\u4f1a\u901a\u8fc7\u53d1\u5e03\u8ba2\u9605\u6a21\u5f0f\u6765\u8ba2\u9605Key\u7684\u91ca\u653e\u901a\u77e5\uff0c\u5e76\u7ee7\u7eed\u8fdb\u5165\u540e\u7eed\u7684\u62a2\u9501\u6d41\u7a0b\u3002<\/li>\n<\/ul>\n<pre>public boolean tryLock(long waitTime, long leaseTime, TimeUnit unit) throws InterruptedException {\n      long time = unit.toMillis(waitTime);\n      long current = System.currentTimeMillis();\n      long threadId = Thread.currentThread().getId();\n      Long ttl = this.tryAcquire(waitTime, leaseTime, unit, threadId);\n      if (ttl == null) {\n         return true;\n      } else {\n         \/\/ \u8ba2\u9605\u5206\u5e03\u5f0fKey\u5bf9\u5e94\u7684\u6d88\u606f\uff0c\u76d1\u542c\u5176\u5b83\u9501\u6301\u6709\u8005\u91ca\u653e\uff0c\u9501\u6ca1\u6709\u91ca\u653e\u7684\u65f6\u5019\u5219\u4f1a\u7b49\u5f85\uff0c\u76f4\u5230\u9501\u91ca\u653e\u7684\u65f6\u5019\u4f1a\u6267\u884c\u4e0b\u9762\u7684while\u5faa\u73af\n         CompletableFuture subscribeFuture = this.subscribe(threadId);\n         subscribeFuture.get(time, TimeUnit.MILLISECONDS);\n         try {\n            do {\n               \/\/ \u5c1d\u8bd5\u83b7\u53d6\u9501\n               ttl = this.tryAcquire(waitTime, leaseTime, unit, threadId);\n               \/\/ \u7ade\u4e89\u83b7\u53d6\u9501\u6210\u529f\uff0c\u9000\u51fa\u5faa\u73af\uff0c\u4e0d\u518d\u7ade\u4e89\u3002\n               if (ttl == null) {\n                  return true;\n               }\n               \/\/ \u5229\u7528\u4fe1\u53f7\u91cf\u673a\u5236\u963b\u585e\u5f53\u524d\u7ebf\u7a0b\u76f8\u5e94\u65f6\u95f4\uff0c\u4e4b\u540e\u518d\u91cd\u65b0\u83b7\u53d6\u9501\n               if (ttl &gt;= 0L &amp;&amp; ttl  0L);\n         } finally {\n            \/\/ \u7ade\u4e89\u9501\u6210\u529f\u540e\uff0c\u53d6\u6d88\u8ba2\u9605\u8be5\u7ebf\u7a0bId\u4e8b\u4ef6\n            this.unsubscribe((RedissonLockEntry)this.commandExecutor.getNow(subscribeFuture), threadId);\n         }\n      }\n   }\n}\n<\/pre>\n<pre>RFuture\n   \n     tryAcquireAsync(long leaseTime, TimeUnit unit, final long threadId) {\n        \/\/ \u5982\u679c\u8bbe\u7f6e\u4e86\u6301\u6709\u9501\u7684\u65f6\u957f\uff0c\u76f4\u63a5\u8fdb\u884c\u5c1d\u8bd5\u52a0\u9501\u64cd\u4f5c\n         if (leaseTime != -1L) {\n            return this.tryLockInnerAsync(leaseTime, unit, threadId, RedisCommands.EVAL_LONG);\n        } else {\n            \/\/ \u672a\u8bbe\u7f6e\u52a0\u9501\u65f6\u957f\uff0c\u5728\u52a0\u9501\u6210\u529f\u540e\uff0c\u542f\u52a8\u7eed\u671f\u4efb\u52a1\uff0c\u521d\u59cb\u9ed8\u8ba4\u6301\u6709\u9501\u65f6\u95f4\u662f30s\n            RFuture\n    \n      ttlRemainingFuture = this.tryLockInnerAsync(this.commandExecutor.getConnectionManager().getCfg().getLockWatchdogTimeout(), TimeUnit.MILLISECONDS, threadId, RedisCommands.EVAL_LONG); ttlRemainingFuture.addListener(new FutureListener\n     \n      () { public void operationComplete(Future\n      \n        future) throws Exception { if (future.isSuccess()) { Long ttlRemaining = (Long)future.getNow(); if (ttlRemaining == null) { RedissonLock.this.scheduleExpirationRenewal(threadId); } } } }); return ttlRemainingFuture; } } \n      \n     \n    \n   <\/pre>\n<p>\u6211\u4eec\u90fd\u77e5\u9053Redis\u6267\u884cLua\u811a\u672c\u5177\u6709\u539f\u5b50\u6027\uff0c\u6240\u4ee5\u5728\u5c1d\u8bd5\u52a0\u9501\u7684\u4e0b\u5c42\uff0cRedis\u4e3b\u8981\u6267\u884c\u4e86\u4e00\u6bb5\u590d\u6742\u7684lua\u811a\u672c\uff1a<\/p>\n<pre>-- \u4e0d\u5b58\u5728\u8be5key\u65f6\nif (redis.call('exists', KEYS[1]) == 0) then\n      -- \u65b0\u589e\u8be5\u9501\u5e76\u4e14hash\u4e2d\u8be5\u7ebf\u7a0bid\u5bf9\u5e94\u7684count\u7f6e1\nredis.call('hincrby', KEYS[1], ARGV[2], 1);\n-- \u8bbe\u7f6e\u8fc7\u671f\u65f6\u95f4\nredis.call('pexpire', KEYS[1], ARGV[1]);\nreturn nil;\nend;\n-- \u5b58\u5728\u8be5key \u5e76\u4e14 hash\u4e2d\u7ebf\u7a0bid\u7684key\u4e5f\u5b58\u5728\nif (redis.call('hexists', KEYS[1], ARGV[2]) == 1) then\n      -- \u7ebf\u7a0b\u91cd\u5165\u6b21\u6570++\nredis.call('hincrby', KEYS[1], ARGV[2], 1);\nredis.call('pexpire', KEYS[1], ARGV[1]);\nreturn nil;\nend;\nreturn redis.call('pttl', KEYS[1]);\n<\/pre>\n<p>\u53c2\u6570\u8bf4\u660e\uff1a<\/p>\n<p>KEYS[1]\uff1a\u5bf9\u5e94\u6211\u4eec\u8bbe\u7f6e\u7684\u5206\u5e03\u5f0fkey\uff0c\u5373\uff1adistributed:lock:distribute_key<\/p>\n<p>ARGV[1]\uff1a\u4e1a\u52a1\u81ea\u5b9a\u4e49\u7684\u52a0\u9501\u65f6\u957f\u6216\u8005\u9ed8\u8ba4\u768430s\uff1b<\/p>\n<p>ARGV[2]\uff1a \u5177\u4f53\u7684\u5ba2\u6237\u7aef\u521d\u59cb\u5316\u8fde\u63a5UUID+\u7ebf\u7a0bID\uff1a 9d8f0907-1165-47d2-8983-1e130b07ad0c:1<\/p>\n<p>\u6211\u4eec\u4ece\u4e0a\u9762\u7684\u811a\u672c\u4e2d\u53ef\u4ee5\u770b\u51fa\u6838\u5fc3\u903b\u8f91\u5176\u5b9e\u4e0d\u96be\uff1a<\/p>\n<ul>\n<li>\u5982\u679c\u5206\u5e03\u5f0f\u9501Key\u672a\u88ab\u4efb\u4f55\u7aef\u6301\u6709\uff0c\u76f4\u63a5\u6839\u636e\u201c\u5ba2\u6237\u7aef\u8fde\u63a5ID+\u7ebf\u7a0bID\u201d \u8fdb\u884c\u521d\u59cb\u5316\u8bbe\u7f6e\uff0c\u5e76\u8bbe\u7f6e\u91cd\u5165\u6b21\u6570\u4e3a1\uff0c\u5e76\u8bbe\u7f6eKey\u7684\u8fc7\u671f\u65f6\u95f4\uff1b<\/li>\n<li>\u5426\u5219\u91cd\u5165\u6b21\u6570+1\uff0c\u5e76\u91cd\u7f6e\u8fc7\u671f\u65f6\u95f4\uff1b<\/li>\n<\/ul>\n<h2>\u9501\u7eed\u547d<\/h2>\n<p>\u63a5\u4e0b\u6765\u770b\u770bscheduleExpirationRenewal\u7eed\u547d\u662f\u600e\u4e48\u505a\u7684\u5462\uff1f<\/p>\n<pre>private void scheduleExpirationRenewal(final long threadId) {\n   if (!expirationRenewalMap.containsKey(this.getEntryName())) {\n      Timeout task = this.commandExecutor.getConnectionManager().newTimeout(new TimerTask() {\n         public void run(Timeout timeout) throws Exception {\n            \/\/ \u6267\u884c\u7eed\u547d\u64cd\u4f5c\n            RFuture\n   \n     future = RedissonLock.this.renewExpirationAsync(threadId);\n            future.addListener(new FutureListener\n    \n     () { public void operationComplete(Future\n     \n       future) throws Exception { RedissonLock.expirationRenewalMap.remove(RedissonLock.this.getEntryName()); ... \/\/ \u7eed\u547d\u6210\u529f\uff0c\u7ee7\u7eed if ((Boolean)future.getNow()) { RedissonLock.this.scheduleExpirationRenewal(threadId); } } }); } }, this.internalLockLeaseTime \/ 3L, TimeUnit.MILLISECONDS); } } \n     \n    \n   <\/pre>\n<p>Tip\u5c0f\u77e5\u8bc6\u70b9\uff1a<\/p>\n<ul>\n<li>\u7eed\u671f\u662f\u7528\u7684\u4ec0\u4e48\u5b9a\u65f6\u4efb\u52a1\u6267\u884c\u7684\uff1f<br \/>Redisson\u7528netty\u7684HashedWheelTimer\u505a\u547d\u4ee4\u91cd\u8bd5\u673a\u5236\uff0c\u539f\u56e0\u5728\u4e8e\u4e00\u6761redis\u547d\u4ee4\u7684\u6267\u884c\u4e0d\u8bba\u6210\u529f\u6216\u8005\u5931\u8d25\u8017\u65f6\u90fd\u5f88\u77ed\uff0c\u800cHashedWheelTimer\u662f\u5355\u7ebf\u7a0b\u7684\uff0c\u7cfb\u7edf\u6027\u80fd\u5f00\u9500\u5c0f\u3002<\/li>\n<\/ul>\n<p>\u800c\u5728\u4e0a\u9762\u7684renewExpirationAsync\u4e2d\u7eed\u547d\u64cd\u4f5c\u7684\u6267\u884c\u6838\u5fc3Lua\u811a\u672c\u8981\u505a\u7684\u4e8b\u60c5\u4e5f\u975e\u5e38\u7684\u7b80\u5355\uff0c\u5c31\u662f\u7ed9\u8fd9\u4e2aKey\u7684\u8fc7\u671f\u65f6\u95f4\u91cd\u65b0\u8bbe\u7f6e\u4e3a\u6307\u5b9a\u768430s.<\/p>\n<pre>if (redis.call('hexists', KEYS[1], ARGV[2]) == 1) then\n    redis.call('pexpire', KEYS[1], ARGV[1]);\n    return 1;\nend;\nreturn 0;\n<\/pre>\n<h2>\u91ca\u653e\u9501<\/h2>\n<p>\u91ca\u653e\u9501\u4e3b\u8981\u662f\u9664\u4e86\u89e3\u9501\u672c\u7701\uff0c\u53e6\u5916\u8fd8\u8981\u8003\u8651\u5230\u5982\u679c\u5b58\u5728\u7eed\u671f\u7684\u60c5\u51b5\uff0c\u8981\u5c06\u7eed\u671f\u4efb\u52a1\u5220\u9664\uff1a<\/p>\n<pre>public RFuture\n   \n     unlockAsync(long threadId) {\n   \/\/ \u89e3\u9501\n   RFuture\n    \n      future = this.unlockInnerAsync(threadId); CompletionStage\n     \n       f = future.handle((opStatus, e) -&gt; { \/\/ \u89e3\u9664\u7eed\u671f this.cancelExpirationRenewal(threadId); ... }); return new CompletableFutureWrapper(f); } \n     \n    \n   <\/pre>\n<p>\u5728unlockInnerAsync\u5185\u90e8\uff0cRedisson\u91ca\u653e\u9501\u5176\u5b9e\u6838\u5fc3\u4e5f\u662f\u6267\u884c\u4e86\u5982\u4e0b\u4e00\u6bb5\u6838\u5fc3Lua\u811a\u672c\uff1a<\/p>\n<pre>    \/\/ \u6821\u9a8c\u662f\u5426\u5b58\u5728\n    if (redis.call('hexists', KEYS[1], ARGV[3]) == 0) then\n      return nil;\n      end;\n    \/\/ \u83b7\u53d6\u52a0\u9501\u6b21\u6570\uff0c\u6821\u9a8c\u662f\u5426\u4e3a\u91cd\u5165\u9501\n    local counter = redis.call('hincrby', KEYS[1], ARGV[3], -1);\n    \/\/ \u5982\u679c\u4e3a\u91cd\u5165\u9501\uff0c\u91cd\u7f6e\u8fc7\u671f\u65f6\u95f4\uff0c\u9501\u672c\u8eab\u4e0d\u91ca\u653e\n    if (counter &gt; 0) then\n      redis.call('pexpire', KEYS[1], ARGV[2]);\n      return 0;\n   \/\/ \u5220\u9664Key\n    else redis.call('del', KEYS[1]);\n      \/\/ \u901a\u77e5\u963b\u585e\u7684\u5ba2\u6237\u7aef\u53ef\u4ee5\u62a2\u9501\u5566\n      redis.call('publish', KEYS[2], ARGV[1]);\n      return 1;\n      end;\n      return nil;\n<\/pre>\n<p>\u5176\u4e2d\uff1a<\/p>\n<p>KEYS[1]: \u5206\u5e03\u5f0f\u9501<br \/>KEYS[2]: redisson_lock_channel:{\u5206\u5e03\u5f0f\u9501} \u53d1\u5e03\u8ba2\u9605\u6d88\u606f\u7684\u7ba1\u9053\u540d\u79f0<br \/>ARGV[1]: \u53d1\u5e03\u7684\u6d88\u606f\u5185\u5bb9<br \/>ARGV[2]: \u9501\u7684\u8fc7\u671f\u65f6\u95f4<br \/>ARGV[3]: \u7ebf\u7a0bID\u6807\u8bc6\u540d\u79f0<\/p>\n<p>\u5176\u5b83\u95ee\u9898<\/p>\n<ul>\n<li>\u7ea2\u9501\u8fd9\u4e48\u706b\uff0c\u4f46\u771f\u7684\u9760\u8c31\u4e48?<\/li>\n<li>Redisson\u516c\u5e73\u9501\u662f\u4ec0\u4e48\u60c5\u51b5\uff1f<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Redisson\u5206\u5e03\u5f0f\u9501\u4e4b\u52a0\u89e3\u9501&#46;&#46;&#46;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[101],"tags":[],"class_list":["post-201830","post","type-post","status-publish","format-standard","hentry","category-database"],"_links":{"self":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/posts\/201830","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/comments?post=201830"}],"version-history":[{"count":0,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/posts\/201830\/revisions"}],"wp:attachment":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/media?parent=201830"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/categories?post=201830"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/tags?post=201830"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}