{"id":1181,"date":"2025-06-01T21:58:04","date_gmt":"2025-06-01T13:58:04","guid":{"rendered":"https:\/\/eve2333.top\/?p=1181"},"modified":"2025-06-16T13:14:26","modified_gmt":"2025-06-16T05:14:26","slug":"saas%e7%9f%ad%e9%93%be%e6%8e%a5%e7%b3%bb%e7%bb%9f-%e6%96%b0%e6%89%8b%e4%bb%8e%e9%9b%b6%e5%ad%a6%e4%b9%a0-5-%e7%9f%ad%e9%93%be%e6%8e%a5%e7%ae%a1%e7%90%86%e4%b8%8a","status":"publish","type":"post","link":"https:\/\/eve2333.top\/?p=1181","title":{"rendered":"SaaS\u77ed\u94fe\u63a5\u7cfb\u7edf-\u65b0\u624b\u4ece\u96f6\u5b66\u4e60 5 -\u77ed\u94fe\u63a5\u7ba1\u7406(\u4e0a"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">\u7b2c01\u8282\uff1a\u77ed\u94fe\u63a5\u6a21\u5757\u529f\u80fd\u5206\u6790<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"O3CeM\">\u529f\u80fd\u5206\u6790<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u77ed\u94fe\u63a5\u8df3\u8f6c\u539f\u7406<\/li>\n\n\n\n<li>\u521b\u5efa\u77ed\u94fe\u63a5\u8868<\/li>\n\n\n\n<li>\u65b0\u589e\u77ed\u94fe\u63a5<\/li>\n\n\n\n<li>Host\u6dfb\u52a0\u57df\u540d\u6620\u5c04<\/li>\n\n\n\n<li>\u5206\u9875\u67e5\u8be2\u77ed\u94fe\u63a5\u96c6\u5408<\/li>\n\n\n\n<li>\u7f16\u8f91\u77ed\u94fe\u63a5<\/li>\n\n\n\n<li>\u5c06\u77ed\u94fe\u63a5\u5220\u9664\uff08\u56de\u6536\u7ad9\uff09<\/li>\n<\/ul>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" height=\"133\" width=\"463\" src=\"https:\/\/i-blog.csdnimg.cn\/img_convert\/6dbedebf56a07240630d4c6e1cac6f68.png\" alt=\"\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"IruVX\">\u7b2c02\u8282\uff1a\u77ed\u94fe\u63a5\u8df3\u8f6c\u539f\u59cb\u94fe\u63a5\u539f\u7406 &nbsp;<\/h2>\n\n\n\n<p>\u6bd4\u5982\u8bf4\u4f60\u5728\u67d0\u5b9d\u6216\u8005\u67d0\u4e1c\u4e0a\u9762\u53bb\u8bbf\u95ee\u4ed6\u4eec\u7684\u5546\u5bb6\uff0c\u6bd4\u5982\u8bf4\u8981\u505a\u6d3b\u52a8\u4e86\uff0c\u4ed6\u4f1a\u7ed9\u4f60\u53d1\u8fd9\u79cd\u8425\u9500\u77ed\u4fe1\u5bf9\u5427\uff1f\u4e0a\u9762\u6709\u4e2a\u4ec0\u4e48\u201c\u6233\u4e00\u4e0b\u201d\u90a3\u79cd\u94fe\u63a5\u5bf9\u5427\uff1f\u8fd9\u79cd\u7684\u8bdd\u6211\u4eec\u70b9\u5b8c\u8fd9\u4e2a\u94fe\u63a5\uff0c\u4ed6\u4eec\u4f1a\u8df3\u8f6c\u5230\u5bf9\u5e94\u7684\u4e00\u4e2a\u539f\u59cb\u7f51\u5740\u3002\u5927\u5bb6\u53ef\u80fd\u4f1a\u95ee\uff0c\u6211\u4eec\u4e3a\u4ec0\u4e48\u8981\u7528\u8fd9\u79cd\u77ed\u94fe\u63a5\u5462\uff1f\u6211\u76f4\u63a5\u628a\u539f\u6765\u7684\u7f51\u7ad9\u94fe\u63a5\u590d\u5236\u8fc7\u53bb\u4e0d\u5c31\u884c\u4e86\uff1f<\/p>\n\n\n\n<p>\u5927\u5bb6\u53ef\u80fd\u4e0d\u77e5\u9053\uff0c\u7c7b\u4f3c\u4e8e\u6211\u4eec\u8fd9\u79cd\u77ed\u4fe1\u6216\u8005\u5fae\u535a\uff0c\u5b83\u7684\u5185\u5bb9\u957f\u5ea6\u662f\u6709\u9650\u5236\u7684\u3002\u5982\u679c\u8bf4\u4f60\u628a\u8fd9\u79cd\u539f\u59cb\u94fe\u63a5\u76f4\u63a5\u590d\u5236\u4e0a\u53bb\uff0c\u5b83\u4f1a\u975e\u5e38\u957f\uff0c\u8fd9\u6837\u7684\u8bdd\u4f60\u672c\u6765\u60f3\u6253\u4e00\u4e9b\u5b57\uff0c\u4f60\u5c31\u5f97\u7f29\u77ed\uff0c\u8fdc\u4e0d\u5982\u8fd9\u79cd\u77ed\u94fe\u7684\u6548\u679c\u8981\u597d\u3002\u7136\u540e\u5176\u6b21\u7684\u8bdd\uff0c\u4f60\u50cf\u8fd9\u79cd\u77ed\u4fe1\uff0c\u5b83\u7684\u957f\u5ea6\u548c\u5b83\u7684\u4ed8\u8d39\u662f\u4ea7\u751f\u76f4\u63a5\u5173\u7cfb\u7684\u3002\u4e00\u822c\u6765\u8bf4\uff0c70\u4e2a\u5b57\u4ee5\u5185\u662f\u6309\u4e00\u6761\u77ed\u4fe1\u6765\u7b97\u7684\u3002\u5047\u5982\u4f60\u4e00\u6761\u77ed\u4fe1\u8d85\u8fc7\u4e8670\u4e2a\u5b57\uff0c\u6bcf\u8d85\u8fc769\u4e2a\u5b57\u5c31\u4f1a\u6309\u4e24\u6761\u3001\u4e09\u6761\u4e00\u76f4\u5f80\u4e0a\u53e0\u52a0\u3002\u76f8\u5f53\u4e8e\u8d85\u8fc770\u5b57\u4e4b\u540e\uff0c\u6bcf69\u4e2a\u5b57\u5c31\u7b97\u4f5c\u4e00\u6761\u3002\u5927\u5bb6\u77e5\u9053\u4e86\u5427\uff1f\u5982\u679c\u8bf4\u4f60\u7528\u90a3\u79cd\u5f88\u957f\u7684\u94fe\u63a5\uff0c\u4f60\u8fd9\u4e2a\u77ed\u4fe1\u7684\u8d39\u7528\u4e0d\u5c31\u8d85\u4e86\u5417\uff1f\u6240\u4ee5\u6211\u4eec\u7528\u77ed\u94fe\u63a5\u8f6c\u6362\u4e00\u4e0b\uff0c\u4f60\u7684\u8d39\u7528\u4ee5\u53ca\u4f60\u80fd\u6253\u7684\u5b57\u80af\u5b9a\u5c31\u66f4\u591a\u4e86\u3002<\/p>\n\n\n\n<p>\u6211\u4eec\u70b9\u4e00\u4e0b\u77ed\u94fe\u63a5\uff0c\u5b83\u5c31\u4f1a\u8df3\u8f6c\u5230\u6211\u4eec\u7684\u539f\u59cb\u94fe\u63a5\uff0c\u5b83\u5bf9\u5e94\u7684\u5e95\u5c42\u539f\u7406\u662f\u4ec0\u4e48\u5462\uff1f\u6211\u4eec\u590d\u5236\u4e00\u4e0b\uff0c\u7136\u540e\u6309 F12 \u8bbf\u95ee\u4e00\u4e0b\u3002\u8df3\u8fc7\u6765\u4e86\uff0c\u8fd9\u4e2a\u65f6\u5019\u8fd9\u8fb9\u662f\u6211\u4eec\u7b2c\u4e00\u4e2a\u8bbf\u95ee\u7684\u539f\u59cb\u94fe\u63a5\uff0c\u201cleafefxe\u201d\u5bf9\u5427\uff1f\u8fd9\u4e2a\u662f\u6211\u4eec\u7684\u77ed\u94fe\u63a5\u3002\u7136\u540e\u770b\u5230\u6ca1\u6709\uff1fHTTP \u72b6\u6001\u7801\u662f 302\uff0c\u4e00\u822c\u4e09\u5f00\u5934\u7684\u90fd\u662f\u91cd\u5b9a\u5411\u7684\u72b6\u6001\u7801\u3002<\/p>\n\n\n\n<p>302 \u4f60\u770b\u5b83\u505a\u4e86\u4ec0\u4e48\uff0c\u5b83\u53c8\u7d27\u63a5\u7740\u8bbf\u95ee\u4e86\u6211\u4eec\u5bf9\u5e94\u7684\u539f\u59cb\u94fe\u63a5\uff0c\u7136\u540e\u72b6\u6001\u7801\u53d8\u6210\u4e86 200 \u4e86\uff0c\u5bf9\u5427\uff1f\u8fd9\u6837\u7684\u8bdd\u6211\u4eec\u53ef\u4ee5\u5f97\u51fa\u4e00\u4e2a\u7ed3\u8bba\uff1a\u9996\u5148\u4ed6\u8bbf\u95ee\u4e86\u4e00\u4e0b\u77ed\u94fe\u63a5\u5730\u5740\uff0c\u7136\u540e\u901a\u8fc7\u8fd9\u4e2a\u77ed\u94fe\u63a5\u8df3\u8f6c\u5230\u4e86\u76ee\u6807\u5730\u5740\u3002<\/p>\n\n\n\n<p>\u6211\u4eec\u6765\u603b\u7ed3\u4e00\u4e0b\u8fd9\u4e2a\u539f\u7406\uff0c\u6211\u4eec\u753b\u4e00\u5f20\u56fe\u3002\u6211\u4eec\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u7ed8\u56fe\uff1a\u77ed\u94fe\u63a5\u7ba1\u7406\uff0c\u521b\u5efa\u3002\u6211\u4eec\u5148\u628a\u8fd9\u4e2a\u7f51\u7edc\u53bb\u6389\uff0c\u7136\u540e\u9996\u5148\u7528\u6237\u2014\u2014\u5c31\u4e0d\u8bf4\u201c\u4e0d\u7528\u6237\u4e86\u201d\uff0c\u76f4\u63a5\u662f\u7528\u6237\u8bbf\u95ee\u6d4f\u89c8\u5668\uff0c\u5bf9\u4e0d\u5bf9\uff1f<\/p>\n\n\n\n<p>\u7136\u540e\u901a\u8fc7\u6d4f\u89c8\u5668\u53bb\u8bbf\u95ee\u4ec0\u4e48\u5462\uff1f\u7b49\u51e0\u4e2a\u8bcd\u5bf9\u5427\uff1f\u6709\u4e9b\u60c5\u51b5\u4e0b\u662f\u76f4\u63a5\u7528 Nginx \u518d\u642d\u914d\u4e00\u4e2a\u5bf9\u5e94\u7684\u7ba1\u7406\u5e73\u53f0\u76f4\u63a5\u5c31\u505a\u4e86\uff0c\u4f46\u662f\u6211\u4eec\u8fd9\u8fb9\u4e0d\u662f\u8fd9\u4e48\u505a\u7684\uff0c\u6211\u4eec\u662f\u76f4\u63a5\u5bf9\u63a5\u5230\u6211\u4eec\u7684\u5fae\u670d\u52a1\u91cc\u9762\u53bb\uff0c\u7136\u540e\u8df3\u8f6c\u5230\u6211\u4eec\u7684\u77ed\u94fe\u63a5\u670d\u52a1\u96c6\u7fa4\u3002\u7136\u540e\u8fd9\u91cc\u628a\u96c6\u7fa4\u7ed9\u62c9\u8d77\u6765\uff0c\u7136\u540e\u79fb\u5230\u6700\u540e\u3002\u7136\u540e\u901a\u8fc7\u77ed\u94fe\u63a5\u670d\u52a1\uff0c\u8df3\u8f6c\u5230\u76ee\u6807\u7f51\u7ad9\u3002\u5728\u8df3\u8f6c\u76ee\u6807\u7f51\u7ad9\u4e4b\u524d\uff0c\u6211\u4eec\u8981\u505a\u4e00\u4e9b\u4ec0\u4e48\u4e8b\u60c5\u5462\uff1f\u76d1\u63a7\u548c\u91c7\u96c6\u76f8\u5173\u4fe1\u606f\u3002<\/p>\n\n\n\n<p>\u9996\u5148\u8fd9\u4e9b\u6570\u636e\u662f\u5f88\u91cd\u8981\u7684\uff0c\u5982\u679c\u6211\u4eec\u505a\u8fd9\u4e9b\u8df3\u8f6c\u4f46\u6ca1\u6709\u76d1\u63a7\uff0c\u53ea\u662f\u4e00\u4e2a\u7b80\u5355\u7684\u8df3\u8f6c\uff0c\u90a3\u5176\u5b9e\u6ca1\u6709\u4ec0\u4e48\u7279\u522b\u5927\u7684\u4ef7\u503c\u3002\u6240\u4ee5\u8bf4\u6211\u4eec\u8fd9\u91cc\u9762\u8981\u505a\u76d1\u63a7\uff0c\u91c7\u96c6\u76f8\u5173\u7684\u4fe1\u606f\u3002\u4e0d\u8fc7\u8fd9\u4e2a\u7528\u6237\u57fa\u672c\u4e0a\u662f\u770b\u4e0d\u5230\u7684\uff0c\u7528\u6237\u5bf9\u8fd9\u4e2a\u662f\u6ca1\u6709\u611f\u77e5\u7684\uff0c\u6240\u4ee5\u6211\u4eec\u5728\u6d41\u7a0b\u4e0a\u52a0\u4e00\u4e2a\u865a\u7ebf\uff0c\u8868\u793a\u91c7\u96c6\u4e00\u4e9b\u76f8\u5173\u4fe1\u606f\u3002OK\uff0c\u90a3\u95ee\u9898\u6765\u4e86\uff0c\u5728\u8df3\u8f6c\u76ee\u6807\u7f51\u7ad9\u4e4b\u524d\uff0c\u6211\u4eec\u662f\u4e0d\u662f\u8981\u5148\u83b7\u53d6\u5230\u5bf9\u5e94\u7684\u539f\u59cb\u94fe\u63a5\u5462\uff1f\u4f60\u600e\u4e48\u83b7\u53d6\uff1f\u4f60\u603b\u4e0d\u80fd\u76f4\u63a5\u8c03\u6570\u636e\u5e93\u5bf9\u4e0d\u5bf9\uff1f\u5b83\u4e00\u822c\u7684\u505a\u6cd5\u662f\u4ec0\u4e48\u5462\uff1f\u6211\u4eec\u4f1a\u518d\u52a0\u4e00\u5c42\u3002\u7528\u6237\u8bbf\u95ee\uff0c\u901a\u8fc7 Redis \u83b7\u53d6\u76ee\u6807\u5730\u5740\u3002\u8bbf\u95ee Redis\uff0c\u83b7\u53d6\u76ee\u6807\u5730\u5740\uff0c\u7136\u540e\u83b7\u53d6\u5b8c\u76ee\u6807\u5730\u5740\u4e4b\u540e\uff0c\u5e72\u4ec0\u4e48\uff1f\u62ff\u5230\u4e4b\u540e\u53bb\u8df3\u8f6c\u5230\u76ee\u6807\u7f51\u7ad9\u3002<\/p>\n\n\n\n<p>\u8fd9\u6837\u7684\u8bdd\u5176\u5b9e\u5c31\u662f\u4e00\u4e2a\u6bd4\u8f83\u5408\u7406\u7684\u7cfb\u7edf\u8bbe\u8ba1\u4e86\u3002<\/p>\n\n\n\n<p>\u7136\u540e\u5176\u5b9e\u8fd9\u8fb9\u8fd8\u6709\u4e00\u4e9b\u60c5\u51b5\uff0c\u6211\u4eec\u4e0d\u53ef\u80fd\u628a\u6240\u6709\u7684\u77ed\u94fe\u63a5\u90fd\u7edf\u4e00\u653e\u5230 Redis \u91cc\u9762\u53bb\uff0c\u56e0\u4e3a\u4f60\u6709\u4e9b\u94fe\u63a5\u8bbf\u95ee\u4e4b\u540e\u5176\u5b9e\u5f88\u957f\u65f6\u95f4\u5c31\u4e0d\u4f1a\u518d\u8bbf\u95ee\u4e86\u3002\u6bd4\u5982\u4eca\u5e74\u662f\u516d\u4e00\u513f\u7ae5\u8282\u505a\u4e2a\u6d3b\u52a8\uff0c\u53ef\u80fd\u4e5f\u5c31\u516d\u4e00\u9ad8\u5cf0\u671f\u7528\uff0c\u5230\u4e03\u6708\u4efd\u5b83\u5c31\u4e0d\u7528\u4e86\uff0c\u540e\u7eed\u4e5f\u4e0d\u7528\u4e86\u3002<\/p>\n\n\n\n<p>\u8fd9\u5c31\u6d89\u53ca\u5230\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u6570\u636e\u7684\u8fc7\u671f\u4ee5\u53ca\u4e0e\u6570\u636e\u5e93\u4e4b\u95f4\u7684\u540c\u6b65\u95ee\u9898\u3002\u4e0d\u8fc7\u8fd9\u4e0d\u662f\u6211\u4eec\u73b0\u5728\u8bb2\u7684\u91cd\u70b9\uff0c\u7b49\u5230\u6211\u4eec\u8bb2\u5230 Redis \u7684\u8df3\u8f6c\u90a3\u4e00\u5757\u7684\u65f6\u5019\uff0c\u6211\u4f1a\u8ddf\u5927\u5bb6\u8be6\u7ec6\u8bf4\u660e\u3002<\/p>\n\n\n\n<p>\u5927\u5bb6\u73b0\u5728\u53ea\u9700\u8981\u77e5\u9053\u6211\u4eec\u73b0\u5728\u8fd9\u4e2a\u8df3\u8f6c\u7684\u539f\u7406\u5c31\u53ef\u4ee5\u4e86\u3002\u7136\u540e\u6211\u4eec\u901a\u8fc7 302 \u8df3\u8f6c<\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" height=\"194\" width=\"552\" src=\"https:\/\/i-blog.csdnimg.cn\/img_convert\/d9ce2daff6cd18093a0a4ddbfc7d01f4.png\" alt=\"\"><\/p>\n\n\n\n<p id=\"ub75a6066\">\u4e00\u822c\u4ee5 3xx \u5f00\u5934\u7684\u4ee3\u8868\u91cd\u5b9a\u5411\uff0c\u8868\u793a\u7f51\u9875\u53d1\u751f\u4e86\u8f6c\u79fb\uff0c\u9700\u8981\u91cd\u5b9a\u5411\u5230\u5bf9\u5e94\u7684\u5730\u5740\u4e2d\u53bb\uff0c\u4e24\u8005\u533a\u522b\u662f\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>301\uff1a\u8868\u793a\u6c38\u4e45\u6027\u8f6c\u79fb\uff08Permanently Moved\uff09<br>\u4ec0\u4e48\u662f\u6c38\u4e45\u6027\u91cd\u5b9a\u5411\u5462\uff1f\u4e3e\u4e2a\u4f8b\u5b50\uff0c\u5728\u6d4f\u89c8\u5668\u4e0a\u8bbf\u95ee\u67d0\u4e2a URL \u7684\u65f6\u5019\uff0c\u5982\u679c\u662f 301 \u8df3\u8f6c\uff0c\u5b83\u53ea\u4f1a\u7b2c\u4e00\u6b21\u53bb\u8c03\u7528\u4f60\u7684\u540e\u7aef\u77ed\u94fe\u63a5\u670d\u52a1\u3002\u8c03\u7528\u4e4b\u540e\uff0c\u6d4f\u89c8\u5668\u5c31\u4f1a\u628a\u8fd9\u4e2a\u8df3\u8f6c\u7f13\u5b58\u4e0b\u6765\u3002<br>\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u4f60\u7b2c\u4e00\u6b21\u8bbf\u95ee\u7684\u65f6\u5019\uff0c\u5b83\u4f1a\u53bb\u8bf7\u6c42\u4f60\u7684\u77ed\u94fe\u63a5\u670d\u52a1\u96c6\u7fa4\uff0c\u83b7\u53d6\u5bf9\u5e94\u7684\u76ee\u6807\u5730\u5740\u3002\u4f46\u662f\u4e00\u65e6\u7f13\u5b58\u751f\u6548\uff0c\u7b2c\u4e8c\u6b21\u8bbf\u95ee\u7684\u65f6\u5019\uff0c\u5b83\u5c31\u4e0d\u4f1a\u518d\u8bf7\u6c42\u4f60\u7684\u540e\u7aef\u670d\u52a1\u4e86\uff0c\u56e0\u4e3a\u5b83\u5df2\u7ecf\u77e5\u9053\u8fd9\u662f\u6c38\u4e45\u6027\u7684\u8df3\u8f6c\u4e86\u3002<\/li>\n\n\n\n<li>302\uff1a\u8868\u793a\u4e34\u65f6\u6027\u8f6c\u79fb\uff08Temporarily Moved\uff09<br>\u5c31\u662f\u4e0d\u7ba1\u7528\u6237\u8bbf\u95ee\u591a\u5c11\u6b21\u8fd9\u4e2a\u77ed\u94fe\u63a5\uff0c\u6bcf\u6b21\u90fd\u4f1a\u5411\u540e\u7aef\u53d1\u8d77\u8bf7\u6c42\uff0c\u53bb\u83b7\u53d6\u5bf9\u5e94\u7684\u76ee\u6807\u5730\u5740\u3002<br>301\u53ea\u8bbf\u95ee\u77ed\u94fe\u63a5\u4e00\u6b21\uff0c\u4ee5\u540e\u90fd\u76f4\u63a5\u8df3\u8f6c\u5230\u539f\u94fe\u63a5\u3002\u4e0d\u80fd\u91c7\u96c6\u7528\u6237\u4fe1\u606f\uff0c\u6240\u4ee5\u4f7f\u7528302<\/li>\n<\/ul>\n\n\n\n<p>\u5bf9\u4e8e\u4e92\u8054\u7f51\u5e94\u7528\u6765\u8bf4\uff0c\u4ece\u6570\u636e\u8d28\u91cf\u548c\u7528\u6237\u884c\u4e3a\u5206\u6790\u7684\u89d2\u5ea6\u6765\u770b\uff0c\u5168\u91cf\u7684\u6570\u636e\u662f\u975e\u5e38\u91cd\u8981\u7684\u3002\u867d\u7136 302 \u5e26\u6765\u7684\u670d\u52a1\u5668\u538b\u529b\u4f1a\u6bd4 301 \u5927\u4e00\u4e9b\uff0c\u4f46\u6211\u4eec\u5e76\u4e0d\u6015\u8fd9\u79cd\u538b\u529b\u3002\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u52a0\u7f13\u5b58\u3001\u52a0\u673a\u5668\u3001\u63d0\u5347\u914d\u7f6e\u6765\u89e3\u51b3\u8fd9\u4e9b\u95ee\u9898\u3002\u4f46\u7528\u6237\u7684\u884c\u4e3a\u6570\u636e\u4e00\u5b9a\u8981\u5168\u90e8\u62ff\u5230\uff0c\u8fd9\u624d\u662f\u6211\u4eec\u77ed\u94fe\u63a5\u8df3\u8f6c\u7cfb\u7edf\u7684\u6838\u5fc3\u4ef7\u503c\u6240\u5728\u3002&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u7b2c03\u8282\uff1a\u521b\u5efa\u77ed\u94fe\u63a5\u6570\u636e\u5e93\u8868<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"UzxKZ\">\u77ed\u94fe\u63a5\u8868\u7ed3\u6784<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE TABLE `t_link` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',\n  `domain` varchar(128) DEFAULT NULL COMMENT '\u57df\u540d',\n  `short_uri` varchar(8) DEFAULT NULL COMMENT '\u77ed\u94fe\u63a5',\n  `full_short_url` varchar(128) DEFAULT NULL COMMENT '\u5b8c\u6574\u77ed\u94fe\u63a5',\n  `origin_url` varchar(1024) DEFAULT NULL COMMENT '\u539f\u59cb\u94fe\u63a5',\n\t`click_num` int(11) DEFAULT 0 COMMENT '\u70b9\u51fb\u91cf',\n\t`gid` varchar(32) DEFAULT NULL COMMENT '\u5206\u7ec4\u6807\u8bc6',\n\t`enable_status` tinyint(1) DEFAULT NULL COMMENT '\u542f\u7528\u6807\u8bc6 1\uff1a\u672a\u542f\u7528 0\uff1a\u5df2\u542f\u7528',\n\t`created_type` tinyint(1) DEFAULT NULL COMMENT '\u521b\u5efa\u7c7b\u578b 0\uff1a\u63a7\u5236\u53f0 1\uff1a\u63a5\u53e3',\n\t`valid_date_type` tinyint(1) DEFAULT NULL COMMENT '\u6709\u6548\u671f\u7c7b\u578b 0\uff1a\u6c38\u4e45\u6709\u6548 1\uff1a\u7528\u6237\u81ea\u5b9a\u4e49',\n\t`valid_date` datetime DEFAULT NULL COMMENT '\u6709\u6548\u671f',\n\t`describe` varchar(1024) DEFAULT NULL COMMENT '\u63cf\u8ff0',\n  `create_time` datetime DEFAULT NULL COMMENT '\u521b\u5efa\u65f6\u95f4',\n  `update_time` datetime DEFAULT NULL COMMENT '\u4fee\u6539\u65f6\u95f4',\n  `del_flag` tinyint(1) DEFAULT NULL COMMENT '\u5220\u9664\u6807\u8bc6 0\uff1a\u672a\u5220\u9664 1\uff1a\u5df2\u5220\u9664',\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `idx_unique_full_short_url` (`full_short_url`) USING BTREE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;<\/code><\/pre>\n\n\n\n<p>\u6211\u4eec\u4f5c\u4e3a\u4e00\u4e2aSaaS\u7684\u4e00\u79cd\u77ed\u94fe\u63a5\u5e73\u53f0&nbsp;\uff0c\u90a3\u80af\u5b9a\u662f\u652f\u6301\u5728\u63a7\u5236\u53f0\u4e0a\u521b\u5efa\uff0c\u5176\u6b21\u6211\u4eec\u4e5f\u8981\u652f\u6301\u522b\u4eba\u901a\u8fc7\u63a5\u53e3\u7684\u5f62\u5f0f\u53bb\u521b\u5efa\uff0c\u56e0\u6b64create_type&nbsp;<\/p>\n\n\n\n<p id=\"u9183d4d7\">\u77ed\u94fe\u63a5\u552f\u4e00\uff1f<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5168\u5c40\u552f\u4e00\uff1a\u5355\u4e00\u77ed\u94fe\u63a5\u5728\u6240\u6709\u57df\u540d\u4e0b\u552f\u4e00\uff0c\u5168\u5e73\u53f0\u552f\u4e00\u3002<\/li>\n\n\n\n<li>\u57df\u540d\u4e0b\u552f\u4e00\uff1a\u5355\u4e00\u77ed\u94fe\u63a5\u4ec5\u4fdd\u8bc1\u57df\u540d\u4e0b\u552f\u4e00\u3002<\/li>\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>URI\u3001URL\u548cURN\u533a\u522b URI \u6307\u7684\u662f\u4e00\u4e2a\u8d44\u6e90 URL \u7528\u5730\u5740\u5b9a\u4f4d\u4e00\u4e2a\u8d44\u6e90\uff1b URN \u7528\u540d\u79f0\u5b9a\u4f4d\u4e00\u4e2a\u8d44\u6e90\u3002 \u4e3e\u4e2a\u4f8b\u5b50\uff1a \u53bb\u5bfb\u627e\u4e00\u4e2a\u5177\u4f53\u7684\u4eba\uff08URI\uff09\uff1b\u5982\u679c\u7528\u5730\u5740\uff1aXX\u7701XX\u5e02XX\u533a...XX\u5355\u5143XX\u5ba4\u7684\u4e3b\u4eba \u5c31\u662fURL\uff1b\u5982\u679c\u7528\u8eab\u4efd\u8bc1\u53f7+\u540d\u5b57\u53bb\u627e\u5c31\u662fURN\uff08\u8eab\u4efd\u8bc1\u53f7+\u540d\u5b57 \u65e0\u6cd5\u786e\u8ba4\u8d44\u6e90\u7684\u5730\u5740\uff09 \u3002 \u5728Java\u7c7b\u5e93\u4e2d\uff0cURI\u7c7b\u4e0d\u5305\u542b\u4efb\u4f55\u8bbf\u95ee\u8d44\u6e90\u7684\u65b9\u6cd5\uff0c\u53ea\u80fd\u6807\u8bc6\u8d44\u6e90\u3002URL\u7c7b\u53ef\u4ee5\u8bbf\u95ee\u8d44\u6e90\uff0c\u53ef\u4ee5\u83b7\u53d6\u6307\u5b9a\u8d44\u6e90\u7684\u6d41\u4fe1\u606f\u3002<\/p>\n\n\n\n<p>\u539f\u6587\uff1a<a href=\"https:\/\/www.jianshu.com\/p\/09ac6fc0f8cb\" target=\"_blank\"  rel=\"nofollow\" >URI\u3001 URL \u548c URN \u7684\u533a\u522b - \u7b80\u4e66<\/a><\/p>\n<\/blockquote>\n\n\n\n<p id=\"ueabd1561\">\u77ed\u94fe\u63a5\uff1a\/abcdef<\/p>\n\n\n\n<p id=\"u28c82edd\">a.com\/abcdef<\/p>\n\n\n\n<p id=\"u560fe5c9\">b.com\/abcdef<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><s>\u5728\u6240\u6709\u57df\u540d\u4e0b\u552f\u4e00\uff0c\u5168\u5e73\u53f0\u552f\u4e00\uff0c\u90a3\u4e5f\u5c31\u76f8\u5f53\u4e8e\u4e0d\u7ba1\u4f60\u662f\u54ea\u4e2a\u57df\u540d\uff0c\u6bd4\u5982\u8bf4\u4f60\u662f a.com \u4e0b\u9762\uff0c\u4f60\u548c b.com \u4e0b\u9762\uff0c\u5b83\u4eec\u4e0d\u80fd\u6709\u76f8\u540c\u7684\u77ed\u94fe\u63a5\u3002\u5982\u679c\u5168\u5c40\u552f\u4e00\u7684\u8bdd\uff0c\u8fd9\u4e24\u4e2a\u57df\u540d\u4e0b\u5c31\u4e0d\u80fd\u540c\u65f6\u5b58\u5728\u76f8\u540c\u7684\u77ed\u94fe\u63a5\u3002<\/s><\/p>\n\n\n\n<p><s>\u4f46\u5982\u679c\u53ea\u662f\u201c\u57df\u540d\u4e0b\u552f\u4e00\u201d\u7684\u8bdd\uff0c\u5c31\u8868\u793a\u8fd9\u4e2a\u77ed\u94fe\u63a5\u53ea\u5728\u5f53\u524d\u57df\u540d\u4e0b\u662f\u552f\u4e00\u7684\uff0c\u4e0d\u540c\u57df\u540d\u4e4b\u95f4\u53ef\u4ee5\u91cd\u590d\u4f7f\u7528\u3002\u6bd4\u5982 a.com \u4e0b\u6709\u4e00\u4e2a\u77ed\u94fe\u63a5\u662f <code>abcdef<\/code>\uff0c\u8df3\u8f6c\u5230\u67d0\u4e2a\u76ee\u6807\u9875\u9762\u3002\u5982\u679c\u662f\u5168\u5c40\u552f\u4e00\uff0c\u90a3\u4e48\u53ea\u8981 a.com \u4e0b\u5df2\u7ecf\u6709\u4e86\u8fd9\u4e2a\u77ed\u94fe\u63a5\uff0cb.com \u5c31\u4e0d\u80fd\u518d\u4f7f\u7528 <code>abcdef<\/code> \u4e86\uff1b\u4f46\u5982\u679c\u662f\u201c\u57df\u540d\u4e0b\u552f\u4e00\u201d\uff0c\u90a3\u4e48 b.com \u662f\u53ef\u4ee5\u7528\u8fd9\u4e2a <code>abcdef<\/code> \u7684\u3002<\/s><\/p>\n\n\n\n<p><s>\u76f8\u6bd4\u8f83\u6765\u8bf4\uff0c\u201c\u57df\u540d\u4e0b\u552f\u4e00\u201d\u5176\u5b9e\u662f\u66f4\u597d\u7684\u9009\u62e9\uff0c\u5bf9\u5427\uff1f\u56e0\u4e3a\u4f60\u8fd9\u4e2a <code>abcdef<\/code> \u5728\u4e0d\u540c\u7684\u8bed\u4e49\u4e0b\uff0c\u53ef\u80fd\u4ee3\u8868\u4e0d\u540c\u7684\u542b\u4e49\uff0c\u5728\u4e0d\u540c\u7684\u57df\u540d\u4e0b\u4e5f\u4e0d\u4f1a\u51b2\u7a81\u3002<\/s><\/p>\n\n\n\n<p><s>\u6240\u4ee5\u6211\u4eec\u8981\u4fdd\u8bc1\u7684\u662f\u201c\u57df\u540d\u4e0b\u552f\u4e00\u201d\u3002\u90a3\u8fd9\u6837\u7684\u8bdd\u6211\u4eec\u8be5\u600e\u4e48\u529e\u5462\uff1f\u5c31\u4e0d\u80fd\u518d\u62ff\u77ed\u94fe\u63a5\u672c\u8eab\u4f5c\u4e3a\u552f\u4e00\u7684\u7d22\u5f15\u4e86\u3002\u6211\u4eec\u9700\u8981\u5e72\u4ec0\u4e48\uff1f\u8981\u7528\u5b8c\u6574\u7684\u77ed\u94fe\u63a5\u5730\u5740\u6765\u5f53\u4f5c\u552f\u4e00\u7d22\u5f15\u3002<\/s><\/p>\n\n\n\n<p><s>\u5b8c\u6574\u7684\u77ed\u94fe\u63a5\u5730\u5740\u5e94\u8be5\u5305\u62ec\uff1a\u57df\u540d + \u77ed\u94fe\u8def\u5f84\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u8fd9\u4e24\u4e2a\u7ec4\u5408\u5728\u4e00\u8d77\u624d\u662f\u552f\u4e00\u7684\u3002\u4f8b\u5982\u6211\u4eec\u52a0\u4e0a\u4e00\u4e2a <code>x-queue-1.0<\/code>\uff0c\u7136\u540e\u662f <code>four-shot-1.0<\/code>\uff0c\u63a5\u7740\u662f <code>bc<\/code>\uff0c\u7136\u540e\u662f\u4e00\u4e2a <code>four-shot-1.0<\/code>\u3002\u8fd9\u6837\uff0c\u6211\u4eec\u7684\u77ed\u94fe\u63a5\u8868\u7ed3\u6784\u5c31\u521b\u5efa\u5b8c\u6210\u4e86\u3002<\/s><\/p>\n\n\n\n<p><s>\u6211\u4eec\u518d\u6765\u68b3\u7406\u4e00\u4e0b\uff1a\u4e00\u6761\u6b63\u5e38\u7684\u77ed\u94fe\u63a5\u8bb0\u5f55\u5e94\u8be5\u662f\u957f\u8fd9\u6837\u7684\u3002<\/s><\/p>\n\n\n\n<p><s>\u7248\u672c\u5b57\u6bb5\u6211\u4eec\u53ef\u4ee5\u8bbe\u7f6e\u4e3a HTTP \u6216 HTTPS\uff0c\u4f8b\u5982\u6211\u4eec\u4e4b\u524d\u4e70\u7684\u4e00\u4e2a\u57df\u540d\u53ef\u80fd\u662f <code>nurl.ink<\/code>\u3002<\/s><\/p>\n\n\n\n<p><s>\u597d\uff0c\u6bd4\u5982\u6211\u4eec\u8bbf\u95ee <code>\/123456<\/code>\uff0c\u90a3\u5b8c\u6574\u7684\u77ed\u94fe\u63a5\u5730\u5740\u5c31\u662f <code>https:\/\/nurl.ink\/123456 <\/code>\u3002\u8fd9\u4e2a\u65f6\u5019\u5b83\u5c31\u4f1a\u8df3\u8f6c\u5230\u539f\u59cb\u94fe\u63a5\u5bf9\u5e94\u7684\u5730\u5740\u3002<\/s><\/p>\n\n\n\n<p><s>\u70b9\u51fb\u6b21\u6570\u8fd9\u4e2a\u5b57\u6bb5\u662f\u6bd4\u8f83\u7075\u6d3b\u7684\uff0c\u5b83\u662f\u4f1a\u53d8\u5316\u7684\uff0c\u4e0d\u662f\u4e00\u6210\u4e0d\u53d8\u7684\u3002\u6211\u4eec\u5728\u8bbe\u8ba1\u7684\u65f6\u5019\u4e5f\u8981\u8003\u8651\u5230\u5b83\u7684\u5b9e\u65f6\u66f4\u65b0\u95ee\u9898\u3002<\/s><\/p>\n\n\n\n<p><s>\u7136\u540e\u6211\u4eec\u8bf4\u4e00\u4e0b Giddy\uff08\u5e94\u4e3a Redis\uff09\uff0c\u8fd9\u91cc\u5bf9\u63a5\u7684\u90e8\u5206\u4e5f\u6709\u8bb2\u7a76\u3002\u6bd4\u5982\u8bf4\uff0c\u5982\u679c\u4f60\u662f\u9ed8\u8ba4\u5206\u7ec4\uff0c\u56e0\u4e3a\u6211\u4eec\u8fdb\u5165\u8fd9\u4e2a SaaS \u5e73\u53f0\u7684\u65f6\u5019\uff0c\u5e76\u4e0d\u5f3a\u5236\u7528\u6237\u4e00\u5b9a\u8981\u53bb\u521b\u5efa\u5206\u7ec4\uff0c\u4ed6\u53ef\u4ee5\u9009\u62e9\u9ed8\u8ba4\u5206\u7ec4\u3002<\/s><\/p>\n\n\n\n<p><s>\u6211\u4eec\u60f3\u4e00\u4e0b\uff0c\u9ed8\u8ba4\u5206\u7ec4\u7684\u5355\u8bcd\u600e\u4e48\u62fc\u6765\u7740\uff1f\u662f default \u5bf9\u5427\uff1f\u6211\u4eec\u5728\u7cfb\u7edf\u91cc\u52a0\u4e00\u4e2a default \u5b57\u6bb5\uff0c\u5982\u679c\u4e0d\u586b\uff0c\u7cfb\u7edf\u4e5f\u4f1a\u81ea\u52a8\u5206\u914d\u5230\u9ed8\u8ba4\u5206\u7ec4\u91cc\u3002<\/s><\/p>\n\n\n\n<p><s>\u5b89\u5168\u7b56\u7565\u3001CSP\uff08\u5185\u5bb9\u5b89\u5168\u7b56\u7565\uff09\u8fd9\u4e9b\u662f\u6211\u4eec\u624b\u52a8\u521b\u5efa\u65f6\u624d\u4f1a\u6709\u7684\u914d\u7f6e\u9879\u3002\u6709\u6548\u671f\u7c7b\u578b\u6211\u4eec\u4e5f\u53ef\u4ee5\u8bbe\u4e3a\u201c\u6c38\u4e45\u6709\u6548\u201d\uff0c\u8fd9\u90e8\u5206\u6682\u65f6\u5148\u7a7a\u7740\u3002<\/s><\/p>\n\n\n\n<p><s>\u6d4b\u8bd5\u77ed\u94fe\u63a5\u6211\u4eec\u4e5f\u53ef\u4ee5\u5148\u521b\u5efa\u4e00\u4e2a\u770b\u770b\u6548\u679c\u3002\u521b\u5efa\u65f6\u95f4\u6211\u4eec\u53ef\u4ee5\u76f4\u63a5\u8d4b\u9ed8\u8ba4\u503c\uff0c\u4e3a\u4ec0\u4e48\u6ca1\u8bbe\u7f6e\u6210\u529f\uff1fdefault \u8fd9\u91cc\u600e\u4e48\u6ca1\u751f\u6548\uff1f\u597d\u5947\u602a\uff0c\u7b97\u4e86\uff0c\u8fd9\u4e2a\u95ee\u9898\u4e0d\u91cd\u8981\uff0c\u56de\u5934\u6211\u81ea\u5df1\u518d\u68c0\u67e5\u4e00\u4e0b\u3002<\/s><\/p>\n\n\n\n<p><s>\u8fd9\u6837\u7684\u8bdd\u5176\u5b9e\u5c31\u53ef\u4ee5\u4e86\u3002\u4f7f\u7528\u7684\u539f\u7406\u5c31\u662f\u5f53\u6211\u4eec\u8bbf\u95ee <code>\/123456<\/code> \u7684\u65f6\u5019\uff0c\u5b83\u5c31\u4f1a\u8df3\u8f6c\u5230\u6211\u4eec\u9884\u5148\u8bbe\u5b9a\u597d\u7684\u90a3\u4e2a\u539f\u59cb\u94fe\u63a5\u5730\u5740\uff0c\u8fd9\u5c31\u662f\u6211\u4eec\u671f\u671b\u7684\u6548\u679c\u3002<\/s><\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"OQala\">\u7b2c04\u8282\uff1a\u65b0\u589e\u77ed\u94fe\u63a5\uff08\u4e0a\uff09<\/h2>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" height=\"173\" width=\"590\" src=\"https:\/\/i-blog.csdnimg.cn\/img_convert\/a502ed681a5815aef2dc9434f72be778.png\" alt=\"\"><\/p>\n\n\n\n<p>\u4e00\u79cd\u72ec\u7279\u7684hash\u7b97\u6cd5\uff0c<\/p>\n\n\n\n<p id=\"ucb126f35\">\u5047\u8bbe\u6211\u4eec\u4f7f\u7528\u7684\u662f 26 \u4e2a\u5b57\u6bcd\u7684\u5927\u5c0f\u5199\uff0c\u52a0\u4e0a 10 \u4e2a\u6570\u5b57\uff0c\u90a3\u4e48\u5bf9\u4e8e\u77ed\u94fe\u63a5\u53ef\u4ee5\u8868\u793a\u7684\u6700\u5927\u7ec4\u5408\u6570\u91cf\u4e3a\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>N = 4\uff0c\u7ec4\u5408\u6570\u4e3a 62 ^ 4 = 14_776_336\uff0c1477 \u4e07\u5de6\u53f3<\/li>\n\n\n\n<li>N = 5\uff0c\u7ec4\u5408\u6570\u4e3a 62 ^ 5 = 916_132_832\uff0c9.16 \u4ebf\u5de6\u53f3<\/li>\n\n\n\n<li>N = 6\uff0c\u7ec4\u5408\u6570\u4e3a 62 ^ 6 = 56_800_235_584\uff0c568 \u4ebf\u5de6\u53f3<\/li>\n<\/ul>\n\n\n\n<p id=\"u04a6ca78\">\u751f\u6210\u77ed\u94fe\u63a5\u7684\u65f6\u5019\uff0c\u53ea\u9700\u8981\u751f\u6210\u4e00\u4e2a\u552f\u4e00\u7684 10 \u8fdb\u5236\u6570\uff0c\u7136\u540e\u518d\u57fa\u4e8e\u6b64 10 \u8fdb\u5236\u6570\u8f6c\u6362\u4e3a 62 \u8fdb\u5236\u6570\u5373\u53ef\u3002&nbsp;<\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" height=\"566\" width=\"568\" src=\"https:\/\/i-blog.csdnimg.cn\/img_convert\/529067331ba60b1b1d05eecd218b44c4.png\" alt=\"\"><\/p>\n\n\n\n<p>&nbsp;\u5b83\u4e0d\u53ea\u662f\u80fd\u5728\u63a7\u5236\u53f0\u4e0a\u53bb\u521b\u5efa\uff0c\u5b83\u53ef\u4ee5\u7ed9\u4e00\u4e2a\u7ed9\u4f60\u4e00\u4e2aAPI\u7684\u4e00\u4e2aTOKEN\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u63a5\u53e3\u53bb\u751f\u6210\uff0c\u5e94\u5bf9\u8fd9\u79cd\u6d77\u91cf\u7684\u5e76\u53d1\u573a\u666f\u4e0d\u80fd\u5199\u5230\u540e\u7aefadmin\u4e86\uff0c\u5728project\u4e2d\u65b0\u5efatoolkit\u8f6f\u4ef6\u5305\uff0c\u4e0b\u9762\u6587\u4ef6<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">package com.nageoffer.shortlink.project.toolkit;\n\nimport cn.hutool.core.lang.hash.MurmurHash;\n\n\/**\n * HASH \u5de5\u5177\u7c7b\n *\/\npublic class HashUtil {\n\n    private static final char[] CHARS = new char[]{\n            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',\n            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',\n            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'\n    };\n\n    private static final int SIZE = CHARS.length;\n\n    private static String convertDecToBase62(long num) {\n        StringBuilder sb = new StringBuilder();\n        while (num &gt; 0) {\n            int i = (int) (num % SIZE);\n            sb.append(CHARS[i]);\n            num \/= SIZE;\n        }\n        return sb.reverse().toString();\n    }\n\n    public static String hashToBase62(String str) {\n        int i = MurmurHash.hash32(str);\n        long num = i &lt; 0 ? Integer.MAX_VALUE - (long) i : i;\n        return convertDecToBase62(num);\n    }\n}<\/pre>\n\n\n\n<p>\u8bb0\u5f97\u5728pom\u4e2d\u6ce8\u5165hutool \uff0c\u628aadmin.pom\u7684\u5168\u8fc7\u6765\u7b97\u529b\uff0c\u57fa\u672c\u4e0a\u90fd\u6709\u7528\u5230<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&lt;dependency&gt;\n    &lt;groupId&gt;cn.hutool&lt;\/groupId&gt;\n    &lt;artifactId&gt;hutool-all&lt;\/artifactId&gt;\n&lt;\/dependency&gt;<\/pre>\n\n\n\n<p>&nbsp;\u63a5\u4e0b\u6765\u521b\u5efa\u5bf9\u5e94\u77ed\u94fe\u63a5\u7684\u65b0\u589e\u65b9\u6cd5\uff0c\u5728dao\u4e2d\u521b\u5efaLinkDO<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.nageoffer.shortlink.project.dao.entiry;\n\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport lombok.Data;\n\nimport java.util.Date;\n\n@TableName(\"t_link\")\n@Data\npublic class LinkDO {\n\n    \/**\n     * id\n     *\/\n    private Long id;\n\n    \/**\n     * \u57df\u540d\n     *\/\n    private String domain;\n\n    \/**\n     * \u77ed\u94fe\u63a5\n     *\/\n    private String shortUri;\n\n    \/**\n     * \u5b8c\u6574\u77ed\u94fe\u63a5\n     *\/\n    private String fullShortUrl;\n\n    \/**\n     * \u539f\u59cb\u94fe\u63a5\n     *\/\n    private String originUrl;\n\n    \/**\n     * \u70b9\u51fb\u91cf\n     *\/\n    private Integer clickNum;\n\n    \/**\n     * \u5206\u7ec4\u6807\u8bc6\n     *\/\n    private String gid;\n\n    \/**\n     * \u542f\u7528\u6807\u8bc6 0\uff1a\u672a\u542f\u7528 1\uff1a\u5df2\u542f\u7528\n     *\/\n    private int enableStatus;\n\n    \/**\n     * \u521b\u5efa\u7c7b\u578b 0\uff1a\u63a7\u5236\u53f0 1\uff1a\u63a5\u53e3\n     *\/\n    private int createdType;\n\n    \/**\n     * \u6709\u6548\u671f\u7c7b\u578b 0\uff1a\u6c38\u4e45\u6709\u6548 1\uff1a\u7528\u6237\u81ea\u5b9a\u4e49\n     *\/\n    private int validDateType;\n\n    \/**\n     * \u6709\u6548\u671f\n     *\/\n    private Date validDate;\n\n    \/**\n     * \u63cf\u8ff0\n     *\/\n    private String describe;\n\n    \/**\n     * \u521b\u5efa\u65f6\u95f4\n     *\/\n    private Date createTime;\n\n    \/**\n     * \u4fee\u6539\u65f6\u95f4\n     *\/\n    private Date updateTime;\n\n    \/**\n     * \u5220\u9664\u6807\u8bc6 0\uff1a\u672a\u5220\u9664 1\uff1a\u5df2\u5220\u9664\n     *\/\n    private Integer delFlag;\n}<\/code><\/pre>\n\n\n\n<p>&nbsp;\u63a5\u7740\u521b\u5efa\u4e00\u7cfb\u5217\u7684controller\uff0cmapper\uff0cservice\u548cimpl<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">package com.nageoffer.shortlink.project.dao.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.nageoffer.shortlink.project.dao.entiry.ShortLinkDO;\n\npublic interface ShortLinkMapper extends BaseMapper&lt;ShortLinkDO&gt; {\n}\n<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">package com.nageoffer.shortlink.project.service.impl;\n\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport com.nageoffer.shortlink.project.dao.entiry.ShortLinkDO;\nimport com.nageoffer.shortlink.project.dao.mapper.ShortLinkMapper;\nimport com.nageoffer.shortlink.project.service.ShortLinkService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.stereotype.Service;\n\n\/**\n * \u77ed\u94fe\u63a5\u63a5\u53e3\u5b9e\u73b0\u5c42\n *\/\n@Slf4j\n@Service\npublic class ShortLinkServiceImpl extends ServiceImpl&lt;ShortLinkMapper, ShortLinkDO&gt; implements ShortLinkService {\n}\n<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">package com.nageoffer.shortlink.project.service;\n\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport com.nageoffer.shortlink.project.dao.entiry.ShortLinkDO;\n\n\/**\n * \u77ed\u94fe\u63a5\u63a5\u53e3\u5c42\n *\/\npublic interface ShortLinkService extends IService&lt;ShortLinkDO&gt; {\n}\n<\/pre>\n\n\n\n<p>&nbsp;\u521b\u5efa\u5fc5\u8981\u7684\u542f\u52a8\u9879\uff0c\u5982\u5728com.nageoffer.shortlink.project\u521b\u5efa\u542f\u52a8\u9879<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">package com.nageoffer.shortlink.project;\n\nimport org.mybatis.spring.annotation.MapperScan;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\n@MapperScan(\"com.nageoffer.shortlink.project.dao.mapper\")\npublic class ShortLinkApplication {\n    public static void main(String[] args) {\n        SpringApplication.run(ShortLinkApplication.class, args);\n    }\n}\n<\/pre>\n\n\n\n<p>&nbsp;\u6682\u65f6\u4e0d\u5206\u5e93\u5206\u8868\u4e86\uff0capplication.yaml\u5982\u4e0b<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">server:\n  port: 8001\nspring:\n    datasource:\n      password: root\n      username: root\n      url: jdbc:mysql:\/\/127.0.0.1:3306\/link?useUnicode=true&amp;characterEncoding=UTF-8&amp;rewriteBatchedStatements=true&amp;allowMultiQueries=true&amp;serverTimezone=Asia\/Shanghai\n      driver-class-name: com.mysql.cj.jdbc.Driver\n      hikari:\n        connection-test-query: select 1\n        connection-timeout: 20000\n        idle-timeout: 300000\n        maximum-pool-size: 5\n        minimum-idle: 5\n    data:\n      redis:\n        host: 192.168.111.130\n        password: 123321\n        port: 6379<\/pre>\n\n\n\n<p>&nbsp;\u8fd9\u91cc\u4e3a\u4e86\u9002\u914dcontroller\uff0c\u628aadmin\u7684controller\u90fd\u52a0\u4e86\u4e00\u4e2aadmin\/\uff0c\u8fd9\u4e5f\u662f\u4f60apifox\u63a5\u53e3\u4e3a\u4ec0\u4e48\u662f\u90a3\u6837\u7684<\/p>\n\n\n\n<p>&nbsp;\u5c06convention\u548cdatabase\u5bfc\u5165\u5176\u4e2d\uff0c\u5176\u5b9e\u4f60\u505a\u62bd\u8c61\u7684\u8bdd\u5176\u5b9e\u6ca1\u6709\u592a\u5927\u7684\u5fc5\u8981\uff0c\u76f4\u63a5\u590d\u5236\u8fc7\u5c31\u884c\u4e86\uff0c\u8bb0\u5f97\u8c03\u4e0bimport<\/p>\n\n\n\n<p>\u5f88\u591a\u53c2\u6570\uff0c\u56e0\u6b64\u518d\u6b21\u5b9a\u4e49\u8fd4\u56de\u4f53\uff0c\u5728dto\u4e0b\u5b9a\u4e49req\u548cresp\u4e24\u4e2a\u6587\u4ef6\u5939\uff0creq\u4e0bShortLinkCreateReqDTO\u6587\u4ef6\u5982\u4e0b<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">package com.nageoffer.shortlink.project.dto.req;\n\nimport lombok.Data;\nimport org.apache.shardingsphere.sharding.exception.syntax.UnsupportedUpdatingShardingValueException;\n\nimport java.util.Date;\n\n\/**\n * \u77ed\u94fe\u63a5\u521b\u5efa\u8bf7\u6c42\u5bf9\u8c61\n *\/\n@Data\npublic class ShortLinkCreateReqDTO {\n    \/**\n     * \u57df\u540d\n     *\/\n    private String domain;\n    \/**\n     * \u539f\u59cb\u94fe\u63a5\n     *\/\n    private String originUrl;\n    \/**\n     * \u5206\u7ec4\u6807\u8bc6\n     *\/\n    private String gid;\n    \/**\n     * \u521b\u5efa\u7c7b\u578b\uff1a0\u63a5\u53e3\u521b\u5efa\uff0c1\u63a7\u5236\u53f0\u521b\u5efa\n     *\/\n    private Integer createType;\n    \/**\n     * \u6709\u6548\u671f\u7c7b\u578b\uff1a0\u6c38\u4e45\u6709\u6548\uff0c1\u81ea\u5b9a\u4e49\n     *\/\n    private Integer validDateType;\n    \/**\n     * \u6709\u6548\u671f\n     *\/\n    private Date validDate;\n    \/**\n     * \u63cf\u8ff0\n     *\/\n    private String describe;\n}\n<\/pre>\n\n\n\n<p>&nbsp;controller\u91cc\u9762\u7684\u65b9\u6cd5\u8fd4\u56de\u4ec0\u4e48\u5462\uff1f\u662f\u5206\u7ec4\u4fe1\u606f\uff0c\u56e0\u6b64\u5728resp\u4e2d\u521b\u5efaShortLinkCreateRespDTO<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">package com.nageoffer.shortlink.project.dto.resp;\n\nimport lombok.Data;\n\n@Data\npublic class ShortLinkCreateRespDTO {\n    \/**\n     * \u5206\u7ec4\u4fe1\u606f\n     *\/\n    private String gid;\n    \/**\n     * \u539f\u59cb\u94fe\u63a5\n     *\/\n    private String originUrl;\n    \/**\n     * \u77ed\u94fe\u63a5\n     *\/\n    private String fullShortUrl;\n\n}\n<\/pre>\n\n\n\n<p>&nbsp;controller\u5c42\u5982\u4e0b<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">package com.nageoffer.shortlink.project.controller;\n\nimport com.nageoffer.shortlink.project.common.convention.result.Result;\nimport com.nageoffer.shortlink.project.common.convention.result.Results;\nimport com.nageoffer.shortlink.project.dao.entiry.ShortLinkDO;\nimport com.nageoffer.shortlink.project.dto.req.ShortLinkCreateReqDTO;\nimport com.nageoffer.shortlink.project.dto.resp.ShortLinkCreateRespDTO;\nimport com.nageoffer.shortlink.project.service.ShortLinkService;\nimport lombok.RequiredArgsConstructor;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RestController;\n\n\/**\n * \u77ed\u94fe\u63a5\u63a7\u5236\u5c42\n *\/\n@RestController\n@RequiredArgsConstructor\npublic class ShortLinkController {\n    private final ShortLinkService shortLinkService;\n\n    \/**\n     * \u521b\u5efa\u77ed\u94fe\u63a5\n     *\/\n    @PostMapping(\"\/api\/short-link\/v1\/create\")\n    public Result&lt;ShortLinkCreateRespDTO&gt; createShort(@RequestBody ShortLinkCreateReqDTO requestParam) {\n        return Results.success( shortLinkService.createShort(requestParam));\n    }\n}<\/pre>\n\n\n\n<p>\u63a5\u7740\u5b8c\u5584service\u548cimpl<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">package com.nageoffer.shortlink.project.service;\n\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport com.nageoffer.shortlink.project.dao.entiry.ShortLinkDO;\nimport com.nageoffer.shortlink.project.dto.req.ShortLinkCreateReqDTO;\nimport com.nageoffer.shortlink.project.dto.resp.ShortLinkCreateRespDTO;\n\n\/**\n * \u77ed\u94fe\u63a5\u63a5\u53e3\u5c42\n *\/\npublic interface ShortLinkService extends IService&lt;ShortLinkDO&gt; {\n    \/**\n     *  \u521b\u5efa\u77ed\u94fe\u63a5\n     * @param requestParam \u521b\u5efa\u77ed\u94fe\u63a5\u8bf7\u6c42\u53c2\u6570\n     * @return \u77ed\u94fe\u63a5\u521b\u5efa\u6d88\u606f\n     *\/\n    ShortLinkCreateRespDTO createShortLink(ShortLinkCreateReqDTO requestParam);\n}\n<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">package com.nageoffer.shortlink.project.service.impl;\n\nimport cn.hutool.core.bean.BeanUtil;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport com.nageoffer.shortlink.project.dao.entiry.ShortLinkDO;\nimport com.nageoffer.shortlink.project.dao.mapper.ShortLinkMapper;\nimport com.nageoffer.shortlink.project.dto.req.ShortLinkCreateReqDTO;\nimport com.nageoffer.shortlink.project.dto.resp.ShortLinkCreateRespDTO;\nimport com.nageoffer.shortlink.project.service.ShortLinkService;\nimport com.nageoffer.shortlink.project.toolkit.HashUtil;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.stereotype.Service;\n\n\/**\n * \u77ed\u94fe\u63a5\u63a5\u53e3\u5b9e\u73b0\u5c42\n *\/\n@Slf4j\n@Service\npublic class ShortLinkServiceImpl extends ServiceImpl&lt;ShortLinkMapper, ShortLinkDO&gt; implements ShortLinkService {\n\n    @Override\n    public ShortLinkCreateRespDTO createShortLink(ShortLinkCreateReqDTO requestParam) {\n        ShortLinkDO shortLinkDO= BeanUtil.toBean(requestParam, ShortLinkDO.class);\n        String shortLinkSuffix =generateSuffix(requestParam);\n        shortLinkDO.setFullShortUrl(requestParam.getDomain() +\"\/\"+ shortLinkSuffix);\n        baseMapper.insert(shortLinkDO);\n        return ShortLinkCreateRespDTO.builder()\n                .fullShortUrl(shortLinkDO.getFullShortUrl())\n                .gid(requestParam.getGid())\n                .build();\n    }\n    private String generateSuffix(ShortLinkCreateReqDTO requestParam) {\n        String originUrl=requestParam.getOriginUrl();\n        return HashUtil.hashToBase62(originUrl);\n    }\n}<\/pre>\n\n\n\n<p>\u7ed9ShortLinkCreateRespDTO\u6dfb\u52a0\u8fd9\u4e2a@Data @Builder @NoArgsConstructor @AllArgsConstructor<\/p>\n\n\n\n<p>&nbsp;describe\u662f\u5173\u952e\u5b57\uff0c\u4f60\u9700\u8981\u5c06ShortLinkDO\u4fee\u6539\u5982\u4e0b<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">package com.nageoffer.shortlink.project.dao.entiry;\n\nimport com.baomidou.mybatisplus.annotation.TableField;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.nageoffer.shortlink.project.common.database.BaseDO;\nimport lombok.Data;\n\nimport java.util.Date;\n\n\/**\n * \u77ed\u94fe\u63a5\u5b9e\u4f53\n *\/\n@TableName(\"t_link\")\n@Data\npublic class ShortLinkDO extends BaseDO {\n\n    \/**\n     * id\n     *\/\n    private Long id;\n\n    \/**\n     * \u57df\u540d\n     *\/\n    private String domain;\n\n    \/**\n     * \u77ed\u94fe\u63a5\n     *\/\n    private String shortUri;\n\n    \/**\n     * \u5b8c\u6574\u77ed\u94fe\u63a5\n     *\/\n    private String fullShortUrl;\n\n    \/**\n     * \u539f\u59cb\u94fe\u63a5\n     *\/\n    private String originUrl;\n\n    \/**\n     * \u70b9\u51fb\u91cf\n     *\/\n    private Integer clickNum;\n\n    \/**\n     * \u5206\u7ec4\u6807\u8bc6\n     *\/\n    private String gid;\n\n    \/**\n     * \u542f\u7528\u6807\u8bc6 0\uff1a\u672a\u542f\u7528 1\uff1a\u5df2\u542f\u7528\n     *\/\n    private int enableStatus;\n\n    \/**\n     * \u521b\u5efa\u7c7b\u578b 0\uff1a\u63a7\u5236\u53f0 1\uff1a\u63a5\u53e3\n     *\/\n    private int createdType;\n\n    \/**\n     * \u6709\u6548\u671f\u7c7b\u578b 0\uff1a\u6c38\u4e45\u6709\u6548 1\uff1a\u7528\u6237\u81ea\u5b9a\u4e49\n     *\/\n    private int validDateType;\n\n    \/**\n     * \u6709\u6548\u671f\n     *\/\n    private Date validDate;\n\n    \/**\n     * \u63cf\u8ff0\n     *\/\n    @TableField(\"`describe`\")\n    private String describe;\n}<\/pre>\n\n\n\n<p>\u540c\u6837\u7684\u5728project\u4e0b\u65b0\u5efa\u4e00\u4e2a\u5305config\uff0c\u91cc\u9762<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">package com.nageoffer.shortlink.project.config;\nimport com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;\nimport org.apache.ibatis.reflection.MetaObject;\nimport org.springframework.stereotype.Component;\n\nimport java.util.Date;\n\n@Component\npublic class MyMetaObjectHandler implements MetaObjectHandler {\n    @Override\n    public void insertFill(MetaObject metaObject) {\n        strictInsertFill(metaObject, \"createTime\", Date::new, Date.class);\n        strictInsertFill(metaObject, \"updateTime\", Date::new, Date.class);\n        strictInsertFill(metaObject, \"delFlag\", () -&gt; 0, Integer.class);\n    }\n\n    @Override\n    public void updateFill(MetaObject metaObject) {\n        strictInsertFill(metaObject, \"updateTime\", Date::new, Date.class);\n    }\n}\n<\/pre>\n\n\n\n<p>\u6d4b\u8bd5\u5982\u4e0b\uff0c\u8bf4\u660esuccess\u4e86<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n    \"domain\": \"http:\/\/baidu.com\",\n    \"originUrl\": \"https:\/\/likely-battle.net\/\",\n    \"gid\": \"93\",\n    \"createdType\": 1,\n    \"validDateType\": 1,\n    \"validDate\": \"\",\n    \"describe\": \"\u554a\u7c73\u6d74\u8bf4\u7684\u9053\u7406\"\n}\n\n{\n    \"code\": \"0\",\n    \"message\": null,\n    \"data\": {\n        \"gid\": \"93\",\n        \"originUrl\": null,\n        \"fullShortUrl\": \"http:\/\/baidu.com\/bLbGX\"\n    },\n    \"requestId\": null,\n    \"success\": true\n}<\/code><\/pre>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" height=\"40\" width=\"688\" src=\"https:\/\/i-blog.csdnimg.cn\/direct\/03c748451c7a4c83bf3cc8a65c2f7b58.png\" alt=\"\"><\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>1.\u8fd9\u91cc\u8f6c\u6362\u621062\u8fdb\u5236\u4e00\u5b9a\u80fd\u4fdd\u8bc1\u751f\u6210\u7684\u77ed\u94fe\u63a5\u662f6\u4f4d\u7684\u5417\uff1f<\/p>\n\n\n\n<p>\u7b54\uff1a\u6211\u8bd5\u4e86\uff0c\u4e0d\u4e00\u5b9a\uff0c\u53ef\u80fd\u662f5\u4f4d\uff0c\u4f46\u662f\u5f71\u54cd\u4e0d\u5927\uff0c\u8fd9\u4e2a\u6ca1\u5f71\u54cd\uff0c\u5c31\u662f[0,62^6]\u533a\u95f4\u5185<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u4ee3\u7801\u903b\u8f91 <\/strong>\uff1a<code>convertDecToBase62<\/code> \u65b9\u6cd5\u5c06\u54c8\u5e0c\u503c\u8f6c\u6362\u4e3a62\u8fdb\u5236\u5b57\u7b26\u4e32\uff0c\u4f46\u672a\u5f3a\u5236\u8865\u4f4d\uff08\u5982\u8865\u524d\u5bfc\u96f6\uff09\u3002<\/li>\n\n\n\n<li><strong>\u6570\u503c\u8303\u56f4 <\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li>62^5 \u2248 9.16\u4ebf\uff0c62^6 \u2248 568\u4ebf\u3002<\/li>\n\n\n\n<li><code>MurmurHash32<\/code> \u751f\u6210\u768432\u4f4d\u6574\u6570\u8303\u56f4\u4e3a [0, 4,294,967,295]\uff08\u53730\u5230\u7ea643\u4ebf\uff09\uff0c\u56e0\u6b64\uff1a\n<ul class=\"wp-block-list\">\n<li>\u5f53\u54c8\u5e0c\u503c &lt; 62^5\uff089.16\u4ebf\uff09\u65f6\uff0c\u751f\u6210\u7684\u5b57\u7b26\u4e32\u957f\u5ea6\u4e3a5\u4f4d\u6216\u66f4\u77ed\u3002<\/li>\n\n\n\n<li>\u5f53\u54c8\u5e0c\u503c \u2265 62^5 \u65f6\uff0c\u751f\u6210\u7684\u5b57\u7b26\u4e32\u957f\u5ea6\u4e3a6\u4f4d\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u7ed3\u8bba <\/strong>\uff1a\u751f\u6210\u7684\u77ed\u94fe\u63a5\u957f\u5ea6\u4e0d\u56fa\u5b9a\uff085\u4f4d\u62166\u4f4d\uff09\uff0c\u4f46\u603b\u7ec4\u5408\u7a7a\u95f4\u4ecd\u8986\u76d6 [0, 568\u4ebf]\uff0c\u4e0d\u5f71\u54cd\u529f\u80fd\u3002<\/li>\n<\/ul>\n\n\n\n<p>2.\u597d\u50cf\u8fd9\u4e2aMurmurHash.hash32\u662f\u628a\u5b57\u7b26\u4e32\u53d6hash\u53d8\u621032\u4f4d\u7684\u6570\u5b57\uff0c\u4e5f\u5c31\u662f8\u4f4d16\u8fdb\u5236\uff0c\u603b\u517142\u4ebf\uff0c\u53d8\u621062\u8fdb\u4e4b\u540e\u4e5f\u53ea\u80fd\u662f\u8fd942\u4ebf\uff0c\u611f\u89c9\u5230\u4e0d\u4e86500\u591a\u4ebf\uff0c\u9664\u975e\u7528hash64\u7b97\u6cd5\uff0c\u800c\u4e14\u80fd\u591f\u4fdd\u8bc1\u4e00\u5b9a\u751f\u62106\u4f4d\u5417\uff1f\u5982\u679c\u53d6hash\u4e4b\u540e\u7684\u5341\u8fdb\u5236\u6570\u5c0f\u4e8e9\u4ebf\u7684\u8bdd\u5e94\u8be5\u5c31\u53ea\u67095\u4f4d\u6216\u8005\u66f4\u5c11\u4e86\uff0c\u4e0d\u77e5\u9053\u8fd9\u4e2a\u7b97\u6cd5\u7684\u5177\u4f53\u7ec6\u8282\u53ef\u80fd\u9700\u8981\u518d\u770b\u770b\uff1f<\/p>\n\n\n\n<p>\u7b54\uff1a\u786e\u5b9e\u3002\u90a3\u53ef\u4ee5\u591a\u4e00\u4f4d\uff0c\u5982\u679c\u4e0d\u52306\u4f4d\u5c31\u8865\u5145\uff1f\u6bd4\u5982\/acsqx\u3001\/\/\/cax\u8fd9\u79cd\uff1f42\u4ebf\u91cc\u9762\u53ea\u67099\u4ebf\u53ef\u80fd\u8fbe\u4e0d\u52306\u4f4d\uff0c\u5c31\u8fd9\u6837\u8865\u5145\u4e00\u4e0b\uff1f<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>MurmurHash32\u7684\u9650\u5236 <\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li>\u8f93\u51fa\u4e3a32\u4f4d\u6574\u6570\uff08\u8303\u56f4 [0, 43\u4ebf]\uff09\uff0c\u8fdc\u5c0f\u4e8e62^6\uff08568\u4ebf\uff09\u3002<\/li>\n\n\n\n<li>\u56e0\u6b64\uff0c\u751f\u6210\u7684\u77ed\u94fe\u63a5\u7ec4\u5408\u6570\u53d7\u9650\u4e8e\u54c8\u5e0c\u503c\u7684\u8f93\u51fa\u7a7a\u95f4\uff08\u4ec5\u7ea643\u4ebf\uff09\uff0c\u65e0\u6cd5\u8986\u76d6\u6240\u670962^6\u7684\u53ef\u80fd\u503c\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u51b2\u7a81\u98ce\u9669 <\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li>\u6839\u636e<strong>\u9e3d\u5de2\u539f\u7406 <\/strong>\uff0c\u5f53\u751f\u6210\u7684\u77ed\u94fe\u63a5\u6570\u91cf\u8d85\u8fc743\u4ebf\u65f6\uff0c\u5fc5\u7136\u53d1\u751f\u54c8\u5e0c\u51b2\u7a81\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u89e3\u51b3\u65b9\u6848 <\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li>\u4f7f\u752864\u4f4d\u54c8\u5e0c\u7b97\u6cd5\uff08\u5982 <code>MurmurHash64<\/code>\uff09\u6269\u5c55\u8f93\u51fa\u7a7a\u95f4\u81f3 [0, 1.8\u00d710^19]\uff0c\u663e\u8457\u964d\u4f4e\u51b2\u7a81\u6982\u7387\u3002<\/li>\n\n\n\n<li>\u6216\u5bf9\u77ed\u94fe\u63a5\u4e0d\u8db36\u4f4d\u7684\u90e8\u5206\u8865\u524d\u5bfc\u5b57\u7b26\uff08\u5982 <code>0<\/code> \u6216 <code>A<\/code>\uff09\u4ee5\u7edf\u4e00\u957f\u5ea6\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>3.\u8fd9\u91cc\u4f7f\u7528\u751f\u621032\u4f4d\u7684MurmurHash\u7b97\u6cd5\uff0c\u5176\u5b9e\u5b8c\u6210\u8fbe\u4e0d\u52306^62\u8fd9\u4e48\u591a\u79cd\u60c5\u51b5\u3002\u6570\u636e\u91cf\u4e00\u5927\uff0c\u5f88\u5bb9\u6613\u51b2\u7a81\uff1f<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u51b2\u7a81\u6982\u7387 <\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li>\u6839\u636e<strong>\u751f\u65e5\u6096\u8bba <\/strong>\uff0c\u5f53\u751f\u6210\u7ea677,000\u4e2a\u77ed\u94fe\u63a5\u65f6\uff0c\u51b2\u7a81\u6982\u7387\u5df2\u9ad8\u8fbe50%\uff08\u8ba1\u7b97\u516c\u5f0f\uff1a\u221a(2^32) \u2248 65536\uff09\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u5b9e\u9645\u573a\u666f\u5f71\u54cd <\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li>\u82e5\u7cfb\u7edf\u9700\u652f\u6301\u6d77\u91cf\u77ed\u94fe\u63a5\uff08\u598210\u4ebf+\uff09\uff0cMurmurHash32\u7684\u51b2\u7a81\u6982\u7387\u5c06\u4e0d\u53ef\u63a5\u53d7\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u6539\u8fdb\u5efa\u8bae <\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li>\u4f7f\u7528\u5f3a\u54c8\u5e0c\u7b97\u6cd5\uff08\u5982 SHA-256\uff09\u621664\u4f4dMurmurHash\uff0c\u5e76\u7ed3\u5408\u76d0\u503c\uff08Salt\uff09\u589e\u5f3a\u552f\u4e00\u6027\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>4.\u751f\u62106\u4f4d\u77ed\u94fe\u63a5\u7684\u903b\u8f91\uff1a\u5148\u5c06\u539f\u59cb\u94fe\u63a5\u901a\u8fc7MurmurHash.hash32()\u65b9\u6cd5\u751f\u6210\u4e00\u4e2a32\u4f4d\u7684\u6574\u5f62\uff08\u6700\u592740\u591a\u4ebf\uff0c\u6700\u5c0f10\u4ebf\uff09\uff0c\u800c62\u76845\u6b21\u65b9\u4e3a9\u4ebf\u591a\uff0c\u6240\u4ee5\u53ef\u4ee5\u751f\u62106\u4f4d\u77ed\u94fe\u63a5\uff0c\u800c\u6bcf\u4e00\u4f4d\u67090\u52309\u3001a\u5230z\u3001A\u5230Z\uff0c62\u4e2d\u60c5\u51b5\uff0c\u6240\u4ee5\u53ef\u4ee5\u751f\u6210\u7684\u77ed\u94fe\u63a5\u670962^6\u7ea6500\u591a\u4ebf\u4e07<\/p>\n\n\n\n<p>\u7b54\uff1a\u6700\u5c0f\u4e0d\u5e94\u8be5\u662f0\u5417\uff1f\u4e3a\u4ec0\u4e48\u6700\u5c0f\u662f10\u4ebf\uff0c\u6ca1\u6709\u6700\u5c0f10\u4ebf\u8fd9\u4e2a\u8bf4\u6cd5\u554a\uff0c\u6700\u5c0f\u5c31\u662f0\uff1b<\/p>\n\n\n\n<p><strong>\u274c \u9519\u8bef<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u54c8\u5e0c\u503c\u8303\u56f4 <\/strong>\uff1a<code>MurmurHash32<\/code> \u7684\u8f93\u51fa\u8303\u56f4\u4e3a [0, 43\u4ebf]\uff0c\u6700\u5c0f\u503c\u4e3a <code>0<\/code>\uff0c\u800c\u975e10\u4ebf\u3002<\/li>\n\n\n\n<li><strong>\u7528\u6237\u8bef\u89e3 <\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li>\u7528\u6237\u53ef\u80fd\u6df7\u6dc6\u4e86\u201c\u6700\u5927\u503c43\u4ebf\u201d\u4e0e\u201c\u6700\u5c0f\u503c\u975e\u96f6\u201d\uff0c\u4f46\u54c8\u5e0c\u503c\u53ef\u4ee5\u53d6\u5230 <code>0<\/code>\uff08\u4f8b\u5982\u8f93\u5165\u7a7a\u5b57\u7b26\u4e32\u65f6\uff09\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>int hash = MurmurHash.hash32(\"\"); \/\/ \u8fd4\u56de0<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1\" height=\"1\" src=\"https:\/\/eve2333.top\/wp-content\/uploads\/2025\/06\/1749305228-image-3.gif\" alt=\"\" class=\"wp-image-1185\" title=\"\u70b9\u51fb\u5e76\u62d6\u62fd\u4ee5\u79fb\u52a8\"\/><\/figure>\n\n\n\n<p>5.\u5173\u4e8e\u77ed\u94fe\u63a5\u4f4d\u6570\u7684\u7406\u89e3\uff1a\u751f\u6210\u7684\u77ed\u94fe\u63a5\u4e2d\uff0c\u4e0d\u5c11\u4e8e3\/4\u7684\u4e3a6\u4f4d\u6570\uff0c\u56e0\u4e3a2^30 &gt; 62^5\uff1b\u63a5\u8fd1\u4e8e100%\u7684\u77ed\u94fe\u63a5\u5927\u4e8e\u7b49\u4e8e5\u4f4d\u6570\uff0c\u56e0\u4e3a2^24 &gt; 62^4\uff0c\u81f3\u4e8e\u80fd\u4e0d\u80fd\u751f\u62107\u4f4d\u6570\uff0c\u56e0\u4e3a2^32 &lt; 62^6\uff0c\u6240\u4ee5\u662f\u80af\u5b9a\u4e0d\u884c\u7684\u3002 \u5173\u4e8e\u80fd\u751f\u6210\u591a\u5c11\u4e0d\u91cd\u590d\u7684\u77ed\u94fe\u63a5\u7684\u7406\u89e3\uff1anum\u7684\u53d6\u503c\u51b3\u5b9a\u4e86\u77ed\u94fe\u63a5\u4e0d\u91cd\u590d\u7684\u6570\u91cf\uff0cnum\u53ea\u67092^32\u4e2a\u503c\uff0c\u8fdc\u6ca1\u6709\u8fbe\u523062^6\uff0c\u6240\u4ee5\u6570\u636e\u91cf\u4e00\u65e6\u8d85\u8fc7\u4e862^32\u5fc5\u7136\u4f1a\u51fa\u73b0\u91cd\u590d\u7684\u77ed\u94fe\u63a5\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u4f4d\u6570\u5206\u5e03 <\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li>62^4 \u2248 13,367,494\uff08\u7ea61300\u4e07\uff09\uff0c2^24 \u2248 16,777,216 \u2192 \u7ea61600\u4e07\u54c8\u5e0c\u503c\u4f1a\u751f\u62105\u4f4d\u77ed\u94fe\u63a5\u3002<\/li>\n\n\n\n<li>62^5 \u2248 9.16\u4ebf\uff0c2^32 \u2248 43\u4ebf \u2192 \u7ea643\u4ebf\u54c8\u5e0c\u503c\u4e2d\uff0c\u4ec5\u6709\u7ea634\u4ebf\u4f1a\u751f\u62106\u4f4d\u77ed\u94fe\u63a5\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u51b2\u7a81\u4e0a\u9650 <\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li>\u54c8\u5e0c\u7a7a\u95f4\u4e3a2^32\uff0c\u56e0\u6b64\u6700\u591a\u751f\u6210\u7ea643\u4ebf\u4e2a\u552f\u4e00\u77ed\u94fe\u63a5\uff0c\u8d85\u8fc7\u540e\u5fc5\u7136\u51b2\u7a81\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>6.\u54c8\u5e0c\u7b97\u6cd5HashUtil\u91cc\u7684MurmurHash.hash32\u751f\u6210\u768432\u4f4dint\u6570\uff0c\u6570\u91cf\u7ea7\u5341\u4ebf\u7ea7\u522b\uff0c\u8fd8\u662f\u6ee1\u6709\u53ef\u80fd\u4ea7\u751f\u54c8\u5e0c\u51b2\u7a81\uff0c\u53ef\u4ee5\u8003\u8651\u62d3\u5c55\u4e3aMurmurHash.hash64\u5427\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>MurmurHash64\u7684\u4f18\u52bf <\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li>\u8f93\u51fa\u4e3a64\u4f4d\u6574\u6570\uff08\u8303\u56f4 [0, 1.8\u00d710^19]\uff09\uff0c\u8fdc\u8d8562^6\uff08568\u4ebf\uff09\uff0c\u53ef\u8986\u76d6\u6240\u67096\u4f4d62\u8fdb\u5236\u7ec4\u5408\u3002<\/li>\n\n\n\n<li>\u51b2\u7a81\u6982\u7387\u964d\u81f3\u6781\u4f4e\u6c34\u5e73\uff08\u9700\u751f\u6210\u7ea6300\u4ebf\u4e2a\u77ed\u94fe\u63a5\u65f6\uff0c\u51b2\u7a81\u6982\u7387\u624d\u8fbe50%\uff09\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>long num = Math.abs(MurmurHash.hash64(str)); \/\/ \u53d6\u7edd\u5bf9\u503c\u907f\u514d\u8d1f\u6570<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1\" height=\"1\" src=\"https:\/\/eve2333.top\/wp-content\/uploads\/2025\/06\/1749305228-image-1.gif\" alt=\"\" class=\"wp-image-1182\" title=\"\u70b9\u51fb\u5e76\u62d6\u62fd\u4ee5\u79fb\u52a8\"\/><\/figure>\n\n\n\n<p>7.\u8fd9\u91cc\u751f\u6210HashUtil\u7684\u65b9\u6cd5\u662f\u9519\u7684\uff0cconvertDecToBase62\u53c2\u6570\u53d6\u503c\u8303\u56f4\u624d20\u591a\u4ebf\u5bf9\u5e94\u768462\u8fdb\u5236\u6570\u4e5f\u53ea\u6709\u8fd9\u4e48\u591a\uff0c500\u591a\u4ebf\u7684\u603b\u6570\u662f\u5efa\u7acb\u57286\u4f4d\u968f\u673a\u768462\u8fdb\u5236\u6570<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u6838\u5fc3\u95ee\u9898 <\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li><code>MurmurHash32<\/code> \u7684\u8f93\u51fa\u7a7a\u95f4\uff0843\u4ebf\uff09 &lt; 62^6\uff08568\u4ebf\uff09\uff0c\u56e0\u6b64\u65e0\u6cd5\u751f\u6210\u6240\u6709\u53ef\u80fd\u76846\u4f4d62\u8fdb\u5236\u77ed\u94fe\u63a5\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u540e\u679c <\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li>\u77ed\u94fe\u63a5\u7684\u7406\u8bba\u4e0a\u9650\u4e3a43\u4ebf\uff0c\u800c\u975e568\u4ebf\u3002<\/li>\n\n\n\n<li>\u67d0\u4e9b6\u4f4d\u77ed\u94fe\u63a5\u6c38\u8fdc\u65e0\u6cd5\u751f\u6210\uff08\u5982\u8d85\u8fc743\u4ebf\u7684\u54c8\u5e0c\u503c\u4e0d\u5b58\u5728\uff09\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u89e3\u51b3\u65b9\u6848 <\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li>\u6539\u752864\u4f4d\u54c8\u5e0c\u7b97\u6cd5\uff0c\u6216\u4f7f\u7528\u96ea\u82b1\u7b97\u6cd5\uff08Snowflake\uff09\u751f\u6210\u552f\u4e00ID\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">\u7b2c05\u8282\uff1a\u65b0\u589e\u77ed\u94fe\u63a5\uff08\u4e2d\uff09<\/h2>\n\n\n\n<p>\u7b2c\u4e00\u70b9\u5c31\u662f\u77ed\u94fe\u63a5\u7684\u4e0d\u53ef\u91cd\u590d\u4ee5\u53ca\u77ed\u94fe\u63a5\u7684\u6570\u636e\u5e93\u4e2d\u7684\u552f\u4e00\uff0c\u8fd8\u6709\u5173\u4e8e\u6211\u4eec\u77ed\u94fe\u63a5\u7684\u9632\u7f13\u5b58\u7a7f\u900f\uff0c \u6211\u4eec\u80fd\u5728sql\u4e2d\u67e5\u51fa\u6765\u5bf9\u4e0d\u5bf9\uff1f\u90a3\u5982\u679c\u8bf4\u6211\u7ed9\u5b83\u8bbe\u7f6e\u6210\u5927\u5199\uff0c\u7406\u8bba\u4e0a\u4ed6\u5e94\u8be5\u67e5\u4e0d\u51fa\u6765\uff0c\u4f46\u662f\u4ed6\u67e5\u51fa\u6765\u4e86\uff0c\u8fd9\u662f\u56e0\u4e3amysql\u5b83\u7684\u8fd9\u79cdutf-8mb4\u7684\u8fd9\u79cd\u5b57\u7b26\u7f16\u7801\u96c6\u5b83\u662f\u5ffd\u7565\u5927\u5c0f\u5199\u7684\uff0c\u4f46\u662f\u4f60\u60f3\u6211\u4eec\u80fd\u5728\u6b63\u5e38\u7684\u77ed\u94fe\u63a5\u4f7f\u7528\u8fc7\u7a0b\u5f53\u4e2d\uff0c\u6211\u4eec\u80af\u5b9a\u662f\u8981\u533a\u5206\u5927\u5c0f\u5199\u7684\u5982\u679c\u8bf4\uff0c\u5927\u5c0f\u5199\u4e0d\u533a\u5206\u5c31\u76f4\u63a5\u635f\u4e86\u6211\u4eec\u5f88\u5927\u4e00\u90e8\u5206\u7684\u8fd9\u79cd\u5c31\u662f\u53ef\u4f7f\u7528\u7684\u8fd9\u79cd\u6982\u7387\u5bf9\u4e0d\u5bf9\uff1f<\/p>\n\n\n\n<p>\u8fd9\u6837\u7684\u8bdd\u5176\u5b9e\u5f88\u7b80\u5355\uff0c\u6211\u4eec\u76f4\u63a5\u5e72\u4ec0\u4e48\uff1f\u4e00\u4e2a\u7ed9\u5b83\u6539\u4e00\u4e0b\u5b57\u7b26\u7f16\u7801\u673a\u5c31\u597d\u4e86\uff0cutf-8\uff0cutf-8_bin\u6211\u4eec\u67e5\u4e0d\u5230\u4e86\uff0c\u8fd9\u6837\u5c31\u89e3\u51b3\u4e86\u5947\u5947\u602a\u602a\u7684\u77e5\u8bc6\uff0c\u53c8\u52a0\u4e86\u4e00\u70b9\u53ef\u4ee5\u76f4\u63a5\u6539\uff0c\u6216\u8005<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>alter table `t_link`\nmodify column `short_uri` varchar(8) character set utf8 collate utf8_bin;<\/code><\/pre>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" height=\"15\" src=\"blob:https:\/\/eve2333.top\/21174108-4d7a-4965-a046-c11406afe3f5\" width=\"15\"><\/p>\n\n\n\n<p>\u6211\u4eec\u770b\u5230impl\u7684\u4ee3\u7801\uff0c\u8fd9\u91cc\u662f\u5b58\u5728\u51b2\u7a81\u7684\u554a\uff0c\u56e0\u4e3a\u4f60\u7528hash \u53bb\u6a21\u521b\u5efa\u77ed\u94fe\u63a5\uff0c\u4e00\u5b9a\u4f1a\u5b58\u5728\u51b2\u7a81\u7684\u53ef\u80fd\u6027\uff0c<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">package com.nageoffer.shortlink.project.service.impl;\n\nimport cn.hutool.core.bean.BeanUtil;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.baomidou.mybatisplus.core.toolkit.Wrappers;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport com.nageoffer.shortlink.project.common.convention.exception.ServiceException;\nimport com.nageoffer.shortlink.project.config.RBloomFilterConfiguration;\nimport com.nageoffer.shortlink.project.dao.entiry.ShortLinkDO;\nimport com.nageoffer.shortlink.project.dao.mapper.ShortLinkMapper;\nimport com.nageoffer.shortlink.project.dto.req.ShortLinkCreateReqDTO;\nimport com.nageoffer.shortlink.project.dto.resp.ShortLinkCreateRespDTO;\nimport com.nageoffer.shortlink.project.service.ShortLinkService;\nimport com.nageoffer.shortlink.project.toolkit.HashUtil;\nimport lombok.RequiredArgsConstructor;\nimport lombok.extern.slf4j.Slf4j;\nimport org.redisson.api.RBloomFilter;\nimport org.springframework.stereotype.Service;\n\n\/**\n * \u77ed\u94fe\u63a5\u63a5\u53e3\u5b9e\u73b0\u5c42\n *\/\n@Slf4j\n@Service\n@RequiredArgsConstructor\npublic class ShortLinkServiceImpl extends ServiceImpl&lt;ShortLinkMapper, ShortLinkDO&gt; implements ShortLinkService {\n\n    private final RBloomFilter&lt;String&gt; shortUriCreateCachePenetrationBloomFilter;\n\n    @Override\n    public ShortLinkCreateRespDTO createShortLink(ShortLinkCreateReqDTO requestParam) {\n        ShortLinkDO shortLinkDO = BeanUtil.toBean(requestParam, ShortLinkDO.class);\n        String shortLinkSuffix = generateSuffix(requestParam);\n        shortLinkDO.setShortUri(shortLinkSuffix);\n        shortLinkDO.setEnableStatus(0);\n        shortLinkDO.setFullShortUrl(requestParam.getDomain() + \"\/\" + shortLinkSuffix);\n        baseMapper.insert(shortLinkDO);\n        return ShortLinkCreateRespDTO.builder()\n                .fullShortUrl(shortLinkDO.getFullShortUrl())\n                .gid(requestParam.getGid())\n                .build();\n    }\n\n    private String generateSuffix(ShortLinkCreateReqDTO requestParam) {\n\n        \/*\u53bb\u91cd\u8bd5\uff0c\u5148\u7ed9\u5b83get\u4e00\u4e2a\u539f\u59cb\u7684\u4e00\u4e2a\u94fe\u63a5\uff0c\u7136\u540e\u6211\u4eec\u8981\u5b9a\u4e49\u4e00\u4e2a\u81ea\u5b9a\u4e49\u751f\u6210\u6b21\u6570*\/\n        int customGenerateCount = 0;\n        String shortUri;\n        while (true) {\n            \/*\u6838\u5fc3\u7406\u5ff5\u662f\u5982\u679c\u51b2\u7a81\u7684\u5c31\u4e00\u76f4\u751f\u6210\uff0c\u4f46\u662f\u5982\u679c\u8bf4\u4ed6\u4e00\u76f4\u751f\u6210\u975e\u5e38\u975e\u5e38\u5c0f\u7684\u6982\u7387\u4f1a\u9020\u6210\u6b7b\u5faa\u73af\n             * \u5bf9\u6211\u4eec\u6570\u636e\u5e93\u7684\u538b\u529b\u4f1a\u6bd4\u8f83\u5927\uff0c\u56e0\u6b64\u8981\u7ed9\u4ed6\u8bbe\u7f6e\u4e00\u4e2a\u5927\u7684\u4e00\u4e2a\u91cd\u8bd5\u6b21\u6570*\/\n            if (customGenerateCount &gt; 10) {\n                throw new ServiceException(\"\u77ed\u94fe\u63a5\u9891\u7e41\u751f\u6210\uff0c\u8bf7\u7a0d\u540e\u518d\u8bd5\");\n            }\n            String originUrl = requestParam.getOriginUrl();\n            shortUri = HashUtil.hashToBase62(originUrl);\n            \/* \u7b2c\u4e00\u79cd\u65b9\u6848\u5c31\u662f\u53bb\u67e5\u8be2*\/\n            LambdaQueryWrapper&lt;ShortLinkDO&gt; queryWrapper = Wrappers.lambdaQuery(ShortLinkDO.class)\n                    .eq(ShortLinkDO::getFullShortUrl, requestParam.getDomain() + \"\/\" + shortUri);\n            \/*\u6211\u9891\u7e41\u5730\u53bb\u8bbf\u95ee\u4f60\u7684\u8fd9\u4e2a\u6570\u636e\u5e93\u663e\u7136\u625b\u4e0d\u4f4f\uff0cso\u8981\u52a0\u4e00\u5c42\u5206\u5e03\u5f0f\u9501\uff0c\u4f46\u662f\u5b83\u80af\u5b9a\u4f1a\u6709\u6027\u80fd\u635f\u8017\n             * \u800c\u4e14\u4f60\u90fd\u67e5\u8be2\u6570\u636e\u5e93\u4e86\uff0c\u600e\u4e48\u53ef\u80fd\u4f1a\u652f\u6301\u6d77\u91cf\u5e76\u53d1\u5462\uff0c\u56e0\u6b64\u7f13\u5b58\u548csql\u9694\u79bb\u5f00\uff0c\u90a3\u4e48\u7528\u4ec0\u4e48\u7f13\u5b58\u67b6\u6784\u652f\u6301\u53bb\u505a\u8fd9\u79cd\u5224\u7a7a\u6216\u8005\u5224\u91cd\u5462\uff1f\n             * string\u548chash\uff0clist\u90fd\u6709\u95ee\u9898\uff0c\u8981\u4e48\u5c31\u662f\u4f60\u4e00\u4e2ahash\u91cc\u9762\u5b58\u7684\u6570\u636e\u91cf\u8fc7\u5927\u4ea7\u751f\u5927key\u95ee\u9898\n             * \u5b57\u7b26\u4e32\u53c8\u5bb9\u91cf\u8fc7\u5927\uff0c\u4e8e\u662f\u662f\u5e03\u9686\u8fc7\u6ee4\u5668\u5224\u65ad\u4e00\u4e0b*\/\n            ShortLinkDO shortLinkDO = baseMapper.selectOne(queryWrapper);\n            if (shortLinkDO == null) {\n                break;\n            }\n            customGenerateCount++;\n\n        }\n        return shortUri;\n    }\n}\n<\/pre>\n\n\n\n<p>\u4ececonfig\u590d\u5236RBloomFilterConfiguration\u5230\u8fd9\u91cc<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">package com.nageoffer.shortlink.project.config;\n\nimport org.redisson.api.RBloomFilter;\nimport org.redisson.api.RedissonClient;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n\/**\n * \u5e03\u9686\u8fc7\u6ee4\u5668\u914d\u7f6e\n *\/\n@Configuration\npublic class RBloomFilterConfiguration {\n\n    \/**\n     * \u9632\u6b62\u77ed\u94fe\u63a5\u521b\u5efa\u67e5\u8be2\u6570\u636e\u5e93\u7684\u5e03\u9686\u8fc7\u6ee4\u5668\n     *\/\n    @Bean\n    public RBloomFilter&lt;String&gt; shortUriCreateCachePenetrationBloomFilter(RedissonClient redissonClient) {\n        RBloomFilter&lt;String&gt; cachePenetrationBloomFilter = redissonClient.getBloomFilter(\"userRegisterCachePenetrationBloomFilter\");\n        cachePenetrationBloomFilter.tryInit(100000000L, 0.001);\n        return cachePenetrationBloomFilter;\n    }\n}<\/pre>\n\n\n\n<p>\u5982\u679c\u662f\u5e03\u9686\u8fc7\u6ee4\u5668\u5df2\u7ecf\u975e\u5e38\u5927\u4e86\uff0c\u5047\u5982\u6211\u5e03\u9686\u8fc7\u6ee4\u5668\u8bbe\u7f6e\u4e861\u4ebf\u7684\u5143\u7d20\uff0c\u5df2\u7ecf\u6709\u63a5\u8fd11\u4ebf\u7684\u8fd9\u4e2a\u6570\u636e\u4e86\u5c31\u4f1a\u7ecf\u5e38\u8bef\u5224\uff0c\u600e\u4e48\u89e3\u51b3\uff1f\u6682\u672a\u56de\u7b54\uff0c\u4e0b\u9762\u662f\u5e03\u9686\u8fc7\u6ee4\u5668\u662f\u5b9e\u73b0\u65b9\u6848<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">private String generateSuffix(ShortLinkCreateReqDTO requestParam) {\n\n    \/*\u53bb\u91cd\u8bd5\uff0c\u5148\u7ed9\u5b83get\u4e00\u4e2a\u539f\u59cb\u7684\u4e00\u4e2a\u94fe\u63a5\uff0c\u7136\u540e\u6211\u4eec\u8981\u5b9a\u4e49\u4e00\u4e2a\u81ea\u5b9a\u4e49\u751f\u6210\u6b21\u6570*\/\n    int customGenerateCount = 0;\n    String shortUri;\n    while (true) {\n        if (customGenerateCount &gt; 10) {\n            throw new ServiceException(\"\u77ed\u94fe\u63a5\u9891\u7e41\u751f\u6210\uff0c\u8bf7\u7a0d\u540e\u518d\u8bd5\");\n        }\n        String originUrl = requestParam.getOriginUrl();\n        shortUri = HashUtil.hashToBase62(originUrl);\n        if (!shortUriCreateCachePenetrationBloomFilter.contains(requestParam.getDomain() + \"\/\"+ shortUri)) {\n            break;\n        }\n        customGenerateCount++;\n\n    }\n    return shortUri;\n}<\/pre>\n\n\n\n<p>\u8bef\u5224\u540e\u5728createShortLink\u4e2d\u7684insert\u4e2d \u4e00\u5b9a\u4f1a\u62a5\u9519\uff0c\u6211\u4eec\u627f\u63a5\u8fd9\u4e2a\u5373\u53ef<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.nageoffer.shortlink.project.service.impl;\n\nimport cn.hutool.core.bean.BeanUtil;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.baomidou.mybatisplus.core.toolkit.Wrappers;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport com.nageoffer.shortlink.project.common.convention.exception.ServiceException;\nimport com.nageoffer.shortlink.project.config.RBloomFilterConfiguration;\nimport com.nageoffer.shortlink.project.dao.entiry.ShortLinkDO;\nimport com.nageoffer.shortlink.project.dao.mapper.ShortLinkMapper;\nimport com.nageoffer.shortlink.project.dto.req.ShortLinkCreateReqDTO;\nimport com.nageoffer.shortlink.project.dto.resp.ShortLinkCreateRespDTO;\nimport com.nageoffer.shortlink.project.service.ShortLinkService;\nimport com.nageoffer.shortlink.project.toolkit.HashUtil;\nimport lombok.RequiredArgsConstructor;\nimport lombok.extern.slf4j.Slf4j;\nimport org.redisson.api.RBloomFilter;\nimport org.springframework.dao.DuplicateKeyException;\nimport org.springframework.stereotype.Service;\n\n\/**\n * \u77ed\u94fe\u63a5\u63a5\u53e3\u5b9e\u73b0\u5c42\n *\/\n@Slf4j\n@Service\n@RequiredArgsConstructor\npublic class ShortLinkServiceImpl extends ServiceImpl&lt;ShortLinkMapper, ShortLinkDO&gt; implements ShortLinkService {\n\n    private final RBloomFilter&lt;String&gt; shortUriCreateCachePenetrationBloomFilter;\n\n    @Override\n    public ShortLinkCreateRespDTO createShortLink(ShortLinkCreateReqDTO requestParam) {\n        ShortLinkDO shortLinkDO = BeanUtil.toBean(requestParam, ShortLinkDO.class);\n        String shortLinkSuffix = generateSuffix(requestParam);\n        shortLinkDO.setShortUri(shortLinkSuffix);\n        String fullShortUrl = requestParam.getDomain() + \"\/\" + shortLinkSuffix;\n        shortLinkDO.setEnableStatus(0);\n        shortLinkDO.setFullShortUrl(requestParam.getDomain() + \"\/\" + shortLinkSuffix);\n        try {\n            baseMapper.insert(shortLinkDO);\n        } catch (DuplicateKeyException ex) {\n            log.warn(\"\u77ed\u94fe\u63a5\uff1a{} \u91cd\u590d\u5165\u5e93\", fullShortUrl);\n            \/\/TODO\u5df2\u7ecf\u8bef\u5224\u7684\u77ed\u94fe\u63a5\u5982\u4f55\u5904\u7406\n            \/\/\u7b2c\u4e00\u79cd\uff0c\u77ed\u94fe\u63a5\u786e\u5b9e\u771f\u5b9e\u5b58\u5728\u7f13\u5b58\n            \/\/\u7b2c\u4e8c\u79cd\uff0c\u77ed\u94fe\u63a5\u4e0d\u4e00\u5b9a\u5b58\u5728\u7f13\u5b58\u4e2d\n            throw new ServiceException(\"\u77ed\u94fe\u63a5\u751f\u6210\u91cd\u590d\");\n        }\n        shortUriCreateCachePenetrationBloomFilter.add(shortLinkSuffix);\n        return ShortLinkCreateRespDTO.builder()\n                .fullShortUrl(shortLinkDO.getFullShortUrl())\n                .gid(requestParam.getGid())\n                .build();\n    }\n\n    private String generateSuffix(ShortLinkCreateReqDTO requestParam) {\n\n        \/*\u53bb\u91cd\u8bd5\uff0c\u5148\u7ed9\u5b83get\u4e00\u4e2a\u539f\u59cb\u7684\u4e00\u4e2a\u94fe\u63a5\uff0c\u7136\u540e\u6211\u4eec\u8981\u5b9a\u4e49\u4e00\u4e2a\u81ea\u5b9a\u4e49\u751f\u6210\u6b21\u6570*\/\n        int customGenerateCount = 0;\n        String shortUri;\n        while (true) {\n            if (customGenerateCount &gt; 10) {\n                throw new ServiceException(\"\u77ed\u94fe\u63a5\u9891\u7e41\u751f\u6210\uff0c\u8bf7\u7a0d\u540e\u518d\u8bd5\");\n            }\n            String originUrl = requestParam.getOriginUrl();\n            shortUri = HashUtil.hashToBase62(originUrl);\n            if (!shortUriCreateCachePenetrationBloomFilter.contains(requestParam.getDomain() + \"\/\" + shortUri)) {\n                break;\n            }\n            customGenerateCount++;\n\n        }\n        return shortUri;\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>\u590d\u5236\u6dfb\u52a0\u4e0badmin\u7684web\u5305\uff0capifox\u6d4b\u8bd5\u8fd0\u884c<img loading=\"lazy\" decoding=\"async\" height=\"521\" width=\"681\" src=\"https:\/\/i-blog.csdnimg.cn\/direct\/63ef7dbea98a40d397c41fadb0aca56c.png\" alt=\"\"><\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>&nbsp;1.\u5224\u65ad\u5e03\u9686\u8fc7\u6ee4\u5668\u662f\u5426\u5b58\u5728\u7528\u7684\u57df\u540d\u548c shortUri\uff0c\u65b0\u589e\u65f6\u4ec5\u6dfb\u52a0 shortUri\uff0c\u662f\u4e00\u4e2a\u903b\u8f91\u9519\u8bef\uff0c\u540e\u7eed\u89c6\u9891\u5df2\u4fee\u590d\u3002\u6216\u8005\u5927\u5bb6\u65b0\u589e\u5e03\u9686\u8fc7\u6ee4\u5668\u65f6\u53ef\u4ee5\u76f4\u63a5\u65b0\u589e\u57df\u540d\u548c shortUri \u90fd\u662f\u53ef\u4ee5\u7684<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>2.\u55ef\u55ef\u3002\uff1a\u751f\u6210shortUri\u65b9\u6cd5\u4e0d\u662f\u5df2\u7ecf\u4fdd\u8bc1shortUri\u552f\u4e00\u4e86\u5417\uff1f\u4e3a\u4ec0\u4e48\u521b\u5efa\u65b9\u6cd5\u91cc\u9762\u8fd8\u8981\u53bb\u67e5\u6570\u636e\u5e93\uff1f<\/p>\n\n\n\n<p>\u751f\u6210shortUri\u65b9\u6cd5\u91cc\u9762\u7684\u662f\u57fa\u4e8e\u5de5\u5177\u7c7b\u7684\u54c8\u5e0c\u7b97\u6cd5\u751f\u6210\u7684\u77ed\u94fe\uff0c\u90a3\u4e48\u901a\u8fc7\u54c8\u5e0c\u5c31\u4f1a\u6709\u53ef\u80fd\u51fa\u73b0\u54c8\u5e0c\u51b2\u7a81\uff0c\u6240\u4ee5\u751f\u6210\u7684\u5c31\u4f1a\u6709\u91cd\u590d<\/p>\n\n\n\n<p>\u751f\u6210\u53ef\u80fd\u6709\u91cd\u590d\u6ca1\u9519\uff0c\u4f46\u662f\u4e0d\u662f\u52a0\u4e86\u4e00\u5c42\u5e03\u9686\u8fc7\u6ee4\u5668\u5224\u65ad\u5417\uff1f\u7ecf\u8fc7\u5e03\u9686\u8fc7\u6ee4\u5668\u5224\u65ad\u4e0d\u5b58\u5728\u6570\u636e\u5e93\u7684\uff0c\u90a3\u4e48\u5728\u6570\u636e\u5e93\u5c31\u4e00\u5b9a\u4e0d\u4f1a\u91cd\u590d\u554a<\/p>\n\n\n\n<p>\u7136\u540e\u5e03\u9686\u8fc7\u6ee4\u5668\u5b58\u5728\u8bef\u5224\u5462\uff0c\u5982\u679c\u6ca1\u6709\u8bef\u5224\uff0c\u90a3\u5c31\u6b63\u5e38\u8fdb\u884c\uff0c\u5982\u679c\u8bef\u5224\u4e86\uff0c\u90a3\u4e48\u8bef\u5224\u4e0d\u5b58\u5728\uff0c\u5176\u5b9e\u662f\u5b58\u5728\u7684\uff0c\u90a3\u4e48\u5c31\u53bb\u6570\u636e\u5e93\u67e5\u4e00\u4e0b\uff0c\u5c31\u4f1a\u88ab\u91cd\u590d\u5b57\u6bb5\u62e6\u622a\u5f02\u5e38\uff0c\u5982\u679c\u6ca1\u6709\u8bef\u5224\uff0c\u5c31\u6b63\u5e38\u901a\u8fc7<\/p>\n\n\n\n<p>\u5e03\u9686\u8fc7\u6ee4\u5668\u5224\u65ad\u4e0d\u5b58\u5728\u5c31\u80af\u5b9a\u4e0d\u5b58\u5728\uff0c\u5e03\u9686\u8fc7\u6ee4\u5668\u5224\u65ad\u5b58\u5728\u624d\u4f1a\u8bef\u5224\u5427<\/p>\n\n\n\n<p>\u53ef\u80fd\u662f\u505a\u4e00\u4e2a\u67e5\u6570\u636e\u7684\u4fdd\u9669\u52a8\u4f5c\u5427\uff0c\u6bd4\u5982\u524d\u7aef\u5df2\u7ecf\u505a\u4e86\u7528\u6237\u540d\u5bc6\u7801\u975e\u7a7a\u5224\u65ad\uff0c\u540e\u7aef\u4e5f\u4e00\u822c\u9700\u8981\u5224\u7a7a\u611f\u89c9\u662f\u4e00\u4e2a\u9053\u7406\uff0c\u4e2a\u4eba\u7406\u89e3<\/p>\n\n\n\n<p>\u5b58\u5728\u4e00\u79cd\u60c5\u51b5\uff0c\u77ed\u94fe\u63a5\u5165\u5e93\u6210\u529f\uff0c\u4f46\u662f\u5e76\u6ca1\u6709\u6dfb\u52a0\u5230\u5e03\u9686\u8fc7\u6ee4\u5668\u4e2d\uff08\u53ef\u80fd\u56e0\u4e3a\u8fdb\u7a0b\u6302\u6389\u7b49\u7b49\u539f\u56e0\uff0c\u7531\u4e8e\u6ca1\u52a0\u4e8b\u52a1\uff0c\u77ed\u94fe\u63a5\u5165\u5e93\u4e0d\u4f1a\u56de\u6eda\uff09\u3002\u4e5f\u5c31\u662f\u8bf4\u5b9e\u9645\u4e0a\u5165\u5e93\u4e86\uff0c\u4f46\u5e03\u9686\u8fc7\u6ee4\u5668\u663e\u793a\u77ed\u94fe\u4e0d\u5b58\u5728\uff0c\u6b64\u65f6\u518d\u6b21\u63d2\u5165\u8be5\u77ed\u94fe\u4e0d\u5c31\u8d8a\u8fc7\u5e03\u9686\u8fc7\u6ee4\u5668\uff0c\u7136\u540e\u88ab\u552f\u4e00\u7d22\u5f15\u7ed9\u62e6\u622a\u4e86\u3002 \u56e0\u4e3a\u8fd9\u79cd\u60c5\u51b5\u51fa\u73b0\u7684\u6982\u7387\u6781\u4f4e\uff0c\u6240\u4ee5\u628a\u552f\u4e00\u7d22\u5f15\u79f0\u4e3a\u515c\u5e95\u7b56\u7565\u3002 \u524d\u9762\u7ae0\u8282\u7684\u7528\u6237\u540d\u8bbe\u7f6e\u4e3a\u552f\u4e00\u7d22\u5f15\u4e5f\u662f\u540c\u6837\u7684\u9053\u7406\u3002<\/p>\n\n\n\n<p>\u603b\u7ed3\u4e00\u4e0b\u524d\u51e0\u4f4d\u7684\u56de\u590d\uff1a 1.\u5e03\u9686\u8fc7\u6ee4\u5668\u5224\u65ad\u4e0d\u5b58\u5728\uff0c\u5c31\u4e00\u5b9a\u4e0d\u5b58\u5728\uff0c\u8fd9\u4e2a\u4e0d\u4f1a\u8bef\u5224\uff1b\u5224\u65ad\u5b58\u5728\uff0c\u5b9e\u9645\u6709\u53ef\u80fd\u4e0d\u5b58\u5728\uff0c\u8fd9\u4e2a\u4f1a\u8bef\u5224\u3002 2.generateSuffix\u82e5\u6b63\u5e38\u8fd4\u56deshortUri\uff0c\u4e00\u5b9a\u662f\u4e0d\u5b58\u5728\u7f13\u5b58\u91cc\u7684(\u5982\u679c\u91cd\u590d10\u6b21\u5c31\u629b\u5f02\u5e38\u4e86)\u3002\u7136\u800cshortUri\u6709\u53ef\u80fd\u5728\u6570\u636e\u5e93\u91cc(\u51fa\u4e86\u6570\u636e\u5e93\u3001\u7f13\u5b58\u4e0d\u4e00\u81f4bug)\uff0c\u56e0\u6b64\u6570\u636e\u5e93\u91cc\u6709\u5fc5\u8981\u5f15\u5165\u552f\u4e00\u7d22\u5f15\uff0c\u8fd9\u4e2a\u662f\u515c\u5e95\u673a\u5236\u3002\u6240\u4ee5createShortLink\u91cc\u9762try, catch\u5176\u5b9e\u5c31\u662f\u52a0\u4e2a\u4fdd\u9669<\/p>\n\n\n\n<p>\u90a3\u628a\u6dfb\u52a0\u8fdb\u5e03\u9686\u8fc7\u6ee4\u5668\u7684\u8bed\u53e5\u653e\u5728\u5199\u5165\u6570\u636e\u5e93\u4e4b\u524d\uff0c\u662f\u4e0d\u662f\u5c31\u80fd\u907f\u514d\u8fd9\u4e2a\u95ee\u9898\uff1f<\/p>\n\n\n\n<p>\u4e5f\u53ef\u80fd\u662f\u5728\u9ad8\u5e76\u53d1\u7684\u573a\u666f\u4e0b\uff0c\u751f\u6210\u91cd\u590dfullShortUrl\u7684\uff0c\u4f46\u5e03\u9686\u8fc7\u6ee4\u5668\u6ca1\u6709\u53ca\u65f6\u66f4\u65b0\uff0c\u5bfc\u81f4\u6570\u636e\u6253\u5230\u4e86\u6570\u636e\u5e93\uff0c\u611f\u89c9\u662f\u5e76\u53d1\u95ee\u9898<\/p>\n\n\n\n<p>\u540c\u4e00\u4e2a\u539f\u59cb\u94fe\u63a5\u901a\u8fc7Hash\u4e4b\u540e\u4e5f\u4f1a\u4ea7\u751f\u4e0d\u540c\u7684\u77ed\u94fe\u63a5\u5427\uff0c\u8fd9\u4e00\u70b9\u600e\u4e48\u529e\u5462\uff1f<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>3.\u8fd9\u91cc\u6839\u636e\u539f\u59cb\u94fe\u63a5\u751f\u6210\u7684shortUri\u662f\u786e\u5b9a\u7684\uff0c\u4e0d\u4f1a\u56e0\u4e3a\u91cd\u8bd5\u800c\u6539\u53d8\uff0c\u8fd9\u91cc\u8981\u91cd\u8bd5\u7684\u8bdd\u611f\u89c9\u9700\u8981\u52a0\u76d0\uff0c\u4e0d\u7136\u597d\u50cf\u6ca1\u610f\u4e49\u5440<\/p>\n\n\n\n<p>\u82e5\u539f\u59cb\u94fe\u63a5\u56fa\u5b9a\uff0c<code>HashUtil.hashToBase62(originUrl)<\/code> \u751f\u6210\u7684 <code>shortUri<\/code> \u6c38\u8fdc\u76f8\u540c\uff0c\u91cd\u8bd5\u65e0\u6cd5\u89e3\u51b3\u51b2\u7a81\u3002\u5728\u54c8\u5e0c\u8ba1\u7b97\u4e2d\u52a0\u5165\u968f\u673a\u76d0\u503c\uff08\u5982\u65f6\u95f4\u6233\u6216UUID\uff09\uff0c\u786e\u4fdd\u6bcf\u6b21\u751f\u6210\u7684 <code>shortUri<\/code> \u4e0d\u540c\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>private String generateSuffix(ShortLinkCreateReqDTO requestParam) {\n    int customGenerateCount = 0;\n    String shortUri;\n    while (true) {\n        if (customGenerateCount &gt; 10) {\n            throw new ServiceException(\"\u77ed\u94fe\u63a5\u9891\u7e41\u751f\u6210\uff0c\u8bf7\u7a0d\u540e\u518d\u8bd5\");\n        }\n        String salt = UUID.randomUUID().toString(); \/\/ \u52a0\u76d0\n        String input = requestParam.getOriginUrl() + salt;\n        shortUri = HashUtil.hashToBase62(input);\n        String fullShortUrl = requestParam.getDomain() + \"\/\" + shortUri;\n        if (!shortUriCreateCachePenetrationBloomFilter.contains(fullShortUrl)) {\n            break;\n        }\n        customGenerateCount++;\n    }\n    return shortUri;\n}<\/code><\/pre>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>4.\u5e03\u9686\u8fc7\u6ee4\u5668\u7684\u8bef\u5224\u4e0d\u662f\u6307\uff0c\u7531\u4e8e\u54c8\u5e0c\u51b2\u7a81\uff0c\u5c06\u4e0d\u5b58\u5728\u4e8e\u8fc7\u6ee4\u5668\u4e2d\u7684\u5143\u7d20\uff0c\u8bef\u5224\u4e3a\u5df2\u5b58\u5728\u5417\uff1f\u4e0d\u5e94\u8be5\u6709\u5c06\u5df2\u5b58\u5728\u7684\u5f53\u6210\u4e0d\u5b58\u5728\u7684\u8fd9\u79cd\u60c5\u51b5\u554a\uff0c\u4e3a\u4ec0\u4e48\u8fd8\u8981\u5728create\uff08\uff09\u4e2d\u7684\u63d2\u5165\u5904\uff0c\u8fdb\u884c\u6821\u9a8c\u5462\uff1f<\/p>\n\n\n\n<p>\u5b58\u5728\u4e00\u79cd\u60c5\u51b5\uff0c\u77ed\u94fe\u63a5\u5165\u5e93\u6210\u529f\uff0c\u4f46\u662f\u5e76\u6ca1\u6709\u6dfb\u52a0\u5230\u5e03\u9686\u8fc7\u6ee4\u5668\u4e2d\uff08\u53ef\u80fd\u56e0\u4e3a\u8fdb\u7a0b\u6302\u6389\u7b49\u7b49\u539f\u56e0\uff0c\u7531\u4e8e\u6ca1\u52a0\u4e8b\u52a1\uff0c\u77ed\u94fe\u63a5\u5165\u5e93\u4e0d\u4f1a\u56de\u6eda\uff09\u3002\u4e5f\u5c31\u662f\u8bf4\u5b9e\u9645\u4e0a\u5165\u5e93\u4e86\uff0c\u4f46\u5e03\u9686\u8fc7\u6ee4\u5668\u663e\u793a\u77ed\u94fe\u4e0d\u5b58\u5728\uff0c\u6b64\u65f6\u518d\u6b21\u63d2\u5165\u8be5\u77ed\u94fe\u4e0d\u5c31\u8d8a\u8fc7\u5e03\u9686\u8fc7\u6ee4\u5668\uff0c\u7136\u540e\u88ab\u552f\u4e00\u7d22\u5f15\u7ed9\u62e6\u622a\u4e86\u3002 \u56e0\u4e3a\u8fd9\u79cd\u60c5\u51b5\u51fa\u73b0\u7684\u6982\u7387\u6781\u4f4e\uff0c\u6240\u4ee5\u628a\u552f\u4e00\u7d22\u5f15\u79f0\u4e3a\u515c\u5e95\u7b56\u7565\u3002 \u524d\u9762\u7ae0\u8282\u7684\u7528\u6237\u540d\u8bbe\u7f6e\u4e3a\u552f\u4e00\u7d22\u5f15\u4e5f\u662f\u540c\u6837\u7684\u9053\u7406\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u5e03\u9686\u8fc7\u6ee4\u5668\u7279\u6027 <\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li><strong>\u65e0\u5047\u9634\u6027 <\/strong>\uff1a\u82e5\u5e03\u9686\u8fc7\u6ee4\u5668\u8fd4\u56de <code>false<\/code>\uff08\u4e0d\u5b58\u5728\uff09\uff0c\u5219\u77ed\u94fe\u63a5\u4e00\u5b9a\u4e0d\u5728\u6570\u636e\u5e93\u4e2d\u3002<\/li>\n\n\n\n<li><strong>\u53ef\u80fd\u5047\u9633\u6027 <\/strong>\uff1a\u82e5\u8fd4\u56de <code>true<\/code>\uff08\u5b58\u5728\uff09\uff0c\u53ef\u80fd\u5b9e\u9645\u4e0d\u5b58\u5728\uff08\u54c8\u5e0c\u51b2\u7a81\u5bfc\u81f4\uff09\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u6570\u636e\u5e93\u515c\u5e95\u903b\u8f91 <\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li>\u5373\u4f7f\u5e03\u9686\u8fc7\u6ee4\u5668\u8bef\u5224\u4e3a\u5b58\u5728\uff0c\u4ecd\u9700\u901a\u8fc7\u6570\u636e\u5e93\u552f\u4e00\u7d22\u5f15\u62e6\u622a\u91cd\u590d\u63d2\u5165\u3002<\/li>\n\n\n\n<li>\u82e5\u77ed\u94fe\u63a5\u5df2\u5b58\u5728\u4f46\u672a\u6dfb\u52a0\u5230\u5e03\u9686\u8fc7\u6ee4\u5668\uff08\u5982\u8fdb\u7a0b\u5d29\u6e83\uff09\uff0c\u6570\u636e\u5e93\u552f\u4e00\u7d22\u5f15\u53ef\u9632\u6b62\u91cd\u590d\u751f\u6210\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>5.\u5e03\u9686\u8fc7\u6ee4\u5668\u90a3\u91ccRBloomFilter&lt;String&gt; cachePenetrationBloomFilter = redissonClient.getBloomFilter(\"shortUriCreateCachePenetrationBloomFilter\"); \u8fd9\u6bb5\u4ee3\u7801\u6ca1\u6539\uff0c\u4e0e\u7528\u6237\u6ce8\u518c\u5171\u7528\u4e86<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u7528\u6237\u6ce8\u518c\u548c\u77ed\u94fe\u63a5\u751f\u6210\u5171\u7528\u540c\u4e00\u4e2a\u5e03\u9686\u8fc7\u6ee4\u5668\uff08<code>userRegisterCachePenetrationBloomFilter<\/code>\uff09\uff0c\u53ef\u80fd\u5bfc\u81f4\u6570\u636e\u6df7\u6dc6\uff08\u5982\u77ed\u94fe\u63a5\u8bef\u5224\u4e3a\u7528\u6237\u5df2\u6ce8\u518c\uff09\u3002<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ \u4fee\u6539 RBloomFilterConfiguration\n@Bean\npublic RBloomFilter&lt;String&gt; shortUriCreateCachePenetrationBloomFilter(RedissonClient redissonClient) {\n    RBloomFilter&lt;String&gt; cachePenetrationBloomFilter = redissonClient.getBloomFilter(\"shortUriCreateCachePenetrationBloomFilter\");\n    cachePenetrationBloomFilter.tryInit(100000000L, 0.001);\n    return cachePenetrationBloomFilter;\n}\n\n@Bean\npublic RBloomFilter&lt;String&gt; userRegisterCachePenetrationBloomFilter(RedissonClient redissonClient) {\n    RBloomFilter&lt;String&gt; cachePenetrationBloomFilter = redissonClient.getBloomFilter(\"userRegisterCachePenetrationBloomFilter\");\n    cachePenetrationBloomFilter.tryInit(100000000L, 0.001);\n    return cachePenetrationBloomFilter;\n}<\/code><\/pre>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>6.\u521a\u67e5\u4e86\u4e00\u4e0b\uff1a\u6570\u636e\u5e93\u91cc\u5b57\u7b26\u96c6\u51b3\u5b9a\u4e86\u5b57\u7b26\u5982\u4f55\u5b58\u50a8\u5728\u6570\u636e\u5e93\u4e2d\uff0c\u800c\u6821\u5bf9\u96c6\u5219\u5b9a\u4e49\u4e86\u5b57\u7b26\u6bd4\u8f83\u548c\u6392\u5e8f\u7684\u89c4\u5219\uff0c\u5305\u62ec\u5927\u5c0f\u5199\u654f\u611f\u6027\u7b49\u3002utf8mb4\u662f\u4e00\u4e2a\u5b57\u7b26\u96c6\uff0c\u5b83\u652f\u6301\u5b58\u50a8\u6240\u6709\u7684Unicode\u5b57\u7b26\uff0c\u5305\u62ecemoji\u7b49\u7279\u6b8a\u5b57\u7b26\u3002\u800c\u6821\u5bf9\u96c6\u5982utf8mb4_general_ci\u548cutf8mb4_bin\u7b49\uff0c\u5176\u4e2d\u7684\"_ci\"\u540e\u7f00\u8868\u793a\u4e0d\u533a\u5206\u5927\u5c0f\u5199\uff0c\u800c\"_bin\"\u8868\u793a\u4f7f\u7528\u4e8c\u8fdb\u5236\u6bd4\u8f83\uff0c\u533a\u5206\u5927\u5c0f\u5199\u3002\u56e0\u6b64\uff0c\u9009\u62e9utf8mb4\u5b57\u7b26\u96c6\u672c\u8eab\u5e76\u4e0d\u4f1a\u5bfc\u81f4\u5ffd\u7565\u5927\u5c0f\u5199\uff0c\u5ffd\u7565\u5927\u5c0f\u5199\u662f\u7531\u6240\u9009\u7684\u6821\u5bf9\u96c6\u51b3\u5b9a\u7684\u3002<\/p>\n\n\n\n<p>7.\u603b\u7ed3\u4e00\u4e0b\uff1a \u9996\u5148\u77ed\u94fe\u63a5\u662f\u8981\u4fdd\u8bc1\u552f\u4e00\u7684\uff0c\u77ed\u94fe\u63a5\u5728\u6570\u636e\u5e93\u4e2d\u662f\u552f\u4e00\u7684\uff08\u4e0d\u540c\u7f51\u5740\u751f\u6210\u7684\u77ed\u94fe\u63a5\u4e0d\u80fd\u76f8\u540c\uff09\uff0c\u6211\u4eec\u4e0d\u80fd\u53d1\u751f\u8ba9\u540c\u4e00\u4e2a\u77ed\u94fe\u63a5\u8bbf\u95ee\u4e0d\u540c\u7684\u76ee\u6807\u7f51\u5740\u8fd9\u79cd\u95ee\u9898\uff0c\u6240\u4ee5\u8981\u67e5\u8be2\u6570\u636e\u5e93\u3002 \u6b64\u65f6\u53d1\u751f\u4e24\u4e2a\u4e2a\u95ee\u9898\uff0c1.\u53d1\u751f\u4e86\u54c8\u5e0c\u51b2\u7a81\uff0c\u4e0d\u540c\u7f51\u5740\u751f\u6210\u4e86\u76f8\u540c\u7684\u77ed\u94fe\u63a5\uff0c\u8fd9\u91cc\u91c7\u7528\u751f\u6210\u5341\u6b21\u8fd8\u91cd\u590d\u5c31\u629b\u51fa2.\u5982\u679c\u77ed\u94fe\u63a5\u5df2\u7ecf\u751f\u6210\u4e86\u8fd8\u4e00\u76f4\u6076\u610f\u751f\u6210\uff0c\u6bcf\u6b21\u90fd\u4f1a\u8bbf\u95ee\u6570\u636e\u5e93\uff0c\u6240\u4ee5\u8fd9\u91cc\u4f1a\u9020\u6210\u6570\u636e\u5e93\u538b\u529b\u3002\u91c7\u7528\u7f13\u5b58\u4e0d\u5408\u9002\uff0c\u4f1a\u5360\u7528\u5927\u91cf\u5185\u5b58\uff0c\u6240\u4ee5\u4f7f\u7528\u5e03\u9686\u8fc7\u6ee4\u5668\u3002\u5e03\u9686\u8fc7\u6ee4\u5668\u4e3a\u7a7a\u5219\u8bf4\u660e\u6ca1\u6709\u91cd\u590d\uff0c\u6b63\u5e38\u6267\u884c\uff0c\u5982\u679c\u4e0d\u4e3a\u7a7a\uff0c\u90a3\u4e48\u5c31\u629b\u51fa\u5f02\u5e38\uff0c\u4ee5\u9632\u6076\u610f\u8bf7\u6c42\u3002 \u4f46\u8fd9\u91cc\u53c8\u4f1a\u51fa\u73b0\u4e00\u4e2a\u95ee\u9898\uff0c\u5e03\u9686\u8fc7\u6ee4\u5668\u4f1a\u8bef\u5224\uff0c\u5ba2\u6237\u60f3\u8981\u751f\u6210\uff0c\u8fc7\u6ee4\u5668\u5c06\u4e0d\u5b58\u5728\u5224\u4e3a\u5df2\u5b58\u5728\uff0c\u53d1\u751f\u5f02\u5e38\uff0c\u6240\u4ee5\u6211\u4eec\u8981\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u3002<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">\u7b2c06\u8282\uff1a\u65b0\u589e\u77ed\u94fe\u63a5\uff08\u4e0b\uff09<\/h2>\n\n\n\n<p>\u65b0\u589e\u5f53\u524d\u7cfb\u7edf\u7684\u6beb\u79d2\u6570\uff0c\u7ed9originurl\u52a0\u4e00\u4e0b\uff0c\u7136\u540ehashtobase62<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">originUrl+=System.currentTimeMillis();<\/pre>\n\n\n\n<p>&nbsp;\u5982\u679c\u8bf4\u662f\u8bef\u5224\u8be5\u600e\u4e48\u529e\uff1f\u53bb\u6570\u636e\u5e93\u67e5\u4e00\u4e0b\uff0c\u867d\u7136\u8bf4\u4ece\u6570\u636e\u5e93\u67e5\u6709\u4e00\u5b9a\u7684\u98ce\u9669\uff0c\u9ad8\u5e76\u53d1\u53bb\u67e5\u53ef\u80fd\u5c31\u6302\u4e86\uff0c\u4f46\u662f<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">try {\n    baseMapper.insert(shortLinkDO);\n} catch (DuplicateKeyException ex) {\n    LambdaQueryWrapper&lt;ShortLinkDO&gt; queryWrapper = Wrappers.lambdaQuery(ShortLinkDO.class)\n            .eq(ShortLinkDO::getFullShortUrl, fullShortUrl);\n    ShortLinkDO hasShortLinkDO = baseMapper.selectOne(queryWrapper);\n    if (hasShortLinkDO != null) {\n        log.warn(\"\u77ed\u94fe\u63a5\uff1a{} \u91cd\u590d\u5165\u5e93\", fullShortUrl);\n        throw new ServiceException(\"\u77ed\u94fe\u63a5\u751f\u6210\u91cd\u590d\");\n    }\n}<\/pre>\n\n\n\n<p>\u5982\u679c\u8bf4\u6211\u4e00\u76f4\u53bb\u653b\u51fb\u4f60\u7684\u8fd9\u4e2a\u6570\u636e\u5e93&nbsp;\u5982\u4f55\u9632\uff1f\u4ed6\u8bef\u5224\u7684\u524d\u63d0\u662f\u6211\u4eec\u5e03\u9686\u8fc7\u6ee4\u5668\u5bb9\u91cf\u5df2\u7ecf\u57fa\u672c\u4e0a\u63a5\u8fd1\u6ee1\u4e86\uff0c\u8fd9\u6837\u7684\u8bdd\u5b83\u7684\u8bef\u5224\u51e0\u7387\u662f\u5f88\u5927\u7684\uff0c\u5982\u679c\u8bf4\u5b83\u4e0d\u662f\u63a5\u8fd1\u6ee1\u4e86\uff0c\u5b83\u7684\u8bef\u5224\u51e0\u7387\u975e\u5e38\u5c0f\u3002\u7136\u540e\u4ed6\u5076\u5c14\u8bf7\u6c42\u4e00\u6b21\u6570\u636e\u5e93\u662f\u6ca1\u6709\u95ee\u9898\u7684\u3002\u61c2\u6211\u610f\u601d\u5427\uff1f\u7136\u540e\u5728\u90a3\u57fa\u4e8e\u8fd9\u79cd\u573a\u666f\u4e0b\uff0c\u6211\u4eec\u7684\u6d41\u7a0b\u5230\u5e95\u5c31\u53d8\u6210\u4ec0\u4e48\u6837\u5b50\u4e86\u5462\uff1f\u6211\u7ed9\u5927\u5bb6\u53bb\u753b\u4e00\u4e2a\u56fe\uff0c\u7136\u540e\u53bb\u7528\u6237\u53bb\u521b\u5efa\u77ed\u94fe\u63a5\u3002\u9996\u5148\u6211\u4eec\u8981\u5148\u7ed9\u4ed6\u5e72\u4ec0\u4e48\uff1f\u751f\u6210\u751f\u6210\u77ed\u94fe\u63a5\uff0c\u7136\u540e\u751f\u6210\u77ed\u94fe\u63a5\u5224\u65ad\u4ec0\u4e48\uff1f\u5224\u65ad\u662f\u5426\u5b58\u5728\uff1f\u901a\u8fc7\u4ec0\u4e48\uff1f\u5e03\u9686\u8fc7\u6ee4\u5668\uff0c\u7136\u540e\u6211\u4eec\u5e03\u9686\u8fc7\u6ee4\u5668\u7684\u8bdd\u5355\u72ec\u7528\u4e00\u4e2aDB\u53bb\u5b58\u50a8\uff0c\u662f8\u670826\u3002\u7136\u540e\u751f\u6210\u7684\u6848\u4ef6\u5982\u679c\u8bf4\u5b58\u5728\uff0c\u5982\u679c\u8bf4\u662f\u5b58\u5728\u7684\u8bdd\uff0c\u90a3\u4e48\u5916\u90e8\u5faa\u73af10\u6b21\uff0c\u76f4\u5230\u4e0d\u51b2\u7a81\u4e3a\u6b62\u3002<\/p>\n\n\n\n<p>\u5982\u679c\u8d85\u8fc710\u6b21\u3002\u8dd1\u4e00\u573a\uff0c\u5982\u679c\u5224\u65ad\u5b58\u5728\uff0c\u5982\u679c\u8bf4\u4e0d\u5b58\u5728\uff0c\u90a3\u5c31\u6b63\u5e38\u8fd4\u56de\u5bf9\u4e0d\u5bf9\uff1f\u505a\u4e00\u4e2a\u53cc\u5411\u7684\u7bad\u5934\uff0c\u7136\u540e\u8fd9\u91cc\u9762\u7684\u8bdd\u6211\u4eec\u7528\u53cc\u5411\u7684\u7bad\u5934ok\uff0c\u7136\u540e\u5b83\u5c31\u751f\u6210\u77ed\u94fe\u63a5\uff0c\u7136\u540e\u751f\u6210\u4e4b\u540e\u5b83\u5e72\u4ec0\u4e48\uff1f\u5165\u5e93\uff0c\u4fdd\u5b58\u5165\u4e70C\u53e3\u3002\u8fd9\u91cc\u7684\u8bdd\u6211\u4eec\u8fd8\u8981\u518d\u521b\u5efa\u51fa\u6765\u4e00\u4e2aDB\u3002\u548b\u770b\u90fd\u6709\u70b9\u4e11\u3002\u7b97\u4e86\u3002\u6211\u4eec\u8fd9\u6837\u597d\u5427\uff1f\u7136\u540e\u4fdd\u5b58\u5165my circle\uff0c\u5b83\u6700\u7ec8\u7684\u8bdd\u8fd9\u91cc\u662f\u8bf7\u6c42\u5230\u8bf7\u6c42\u5230\u6211\u4eec\u4e0d\u5bb9\u6613\u8bf7\u6c42\u5230\u6211\u4eec\u4e70C\u53e3tb\u7684\u3002\u7136\u540e\u8fd9\u91cc\u7684\u8bdd\u5176\u5b9e\u662f\u4ec0\u4e48\uff1f\u745e\u8fea\u65af\u3002\u7136\u540e\u57fa\u4e8e\u8fd9\u79cd\u573a\u666f\u4e0b\uff0c\u6211\u4eec\u7684\u77ed\u94fe\u63a5\u7684\u521b\u5efa\u5176\u5b9e\u624d\u7b97\u662f\u7a0d\u5fae\u5b8c\u6210\u4e8680%\u3002\u7a0d\u7b49\u6211\u7ee7\u7eed\u8ddf\u5927\u5bb6\u53bb\uff0c\u8fd9\u91cc\u9762\u8fd8\u6709\u4e2a\u6d41\u7a0b\u6ca1\u8bf4\u6e05\u695a\u5982\u679c\u8bf4\u51b2\u7a81\u4e86\u3002\u5728\u8fd9\u91cc\u5982\u679c\u8bf4\u4fdd\u5b58\u552f\u5c31\u662f\u552f\u4e00\u7d22\u5f15\u51b2\u7a81\uff0c\u6211\u4eec\u5c31\u8be5\u5e72\u4ec0\u4e48\uff1f\u53bb\u67e5\u8be2\u6570\u636e\u5e93\uff0c\u5bf9\u5427\uff1f\u67e5\u8be2\u6570\u636e\u5e93\u662f\u5426\u5b58\u5728\uff0c\u5982\u679c\u8bf4\u5b58\u5728\uff0c\u5b58\u5728\u7684\u8bdd\u4e3a\u4ec0\u4e48\u6211\u4eec\u8fd9\u91cc\u76f4\u63a5\u5c31\u8fd9\u79cd\u53bb\u7b80\u5355\u7684\u53bb\u8868\u8fbe\u4e86\u3002<\/p>\n\n\n\n<p>\u5b58\u5728\u8dd1\u4e00\u573a\u4e0d\u5b58\u5728\u6267\u884c\u63a7\u5236\u903b\u8f91\u662f\u4ec0\u4e48\uff1f\u90a3\u5c31\u662f\u628a\u6211\u4eec\u7684\u4e00\u4e2a\u90a3\u5c31\u662f\u628a\u8fd9\u4e2a\u6570\u636e\u52a0\u5230\u6ce2\u52a8\u8fc7\u6ee4\u5668\u91cc\u9762\u3002Ok\u5927\u6982\u5c31\u662f\u8fd9\u4e2a\u6837\u5b50\u3002\u7136\u540e\u53ef\u80fd\u5927\u5bb6\u4f1a\u95ee\u4e00\u70b9\uff0c\u5982\u679c\u8bf4\u6211\u8fd9\u4e48\u505a\u4e86\u4e4b\u540e\u5bf9\u5427\uff1f\u4f60\u4e0d\u80fd\u8fc7\u6ee4\u5668\uff0c\u5982\u679c\u8bf4\u8fd9\u4e2a\u5bb9\u91cf\u8d85\u8fc7\u4e86\u5b83\u63a5\u8fd1\u4e8e\u5b83\u7684\u9600\u503c\u4e86\u600e\u4e48\u529e\uff1f\u5927\u5bb6\u53ef\u4ee5\u5148\u4e0d\u8981\u7740\u6025\uff0c\u8fd9\u4e2a\u80af\u5b9a\u662f\u6709\u89e3\u51b3\u65b9\u6848\u7684\uff0c\u89e3\u51b3\u65b9\u6848\u6211\u5148\u628a\u601d\u8def\u8ddf\u5927\u5bb6\u8bf4\u4e00\u4e0b\uff0c\u90a3\u5c31\u662f\u4f60\u8981\u6709\u4e2a\u5b9a\u65f6\u4efb\u52a1\uff0c\u4e0d\u65ad\u7684\u53bb\u8bf7\u6c42\u4f60\u5f53\u524d\u7684\u6b65\u9aa4\u8fc7\u6ee4\u5668\u53bb\u5224\u65ad\u5b83\u7684\u5bb9\u91cf\u662f\u5426\u6709\u591a\u5927\uff0c\u5bf9\u5427\uff1f\u5b83\u6709\u5b83\u5df2\u7ecf\u5b58\u50a8\u591a\u5927\u7684 URL\u4e86\uff0c\u5982\u679c\u8bf4\u5b58\u50a8\u7684\u5f88\u5927\u4e86\u4e4b\u540e\uff0c\u63a5\u8fd1\u6211\u4eec\u7684\u8bbe\u7f6e\u7684\u9600\u503c\u4e4b\u540e\uff0c\u90a3\u4e48\u5c31\u518d\u7ed9\u5b83\u521b\u5efa\u51fa\u6765\u4e00\u4e2a\u65b0\u7684\u8fc7\u7a0b\u8fc7\u6ee4\u5668\uff0c\u7136\u540e\u628a\u73b0\u6709\u7684\u4e0d\u540c\u8fc7\u6ee4\u5668\u91cc\u9762\u7684\u6570\u636e\u7ed9\u5b83\u653e\u5230\u6211\u4eec\u65b0\u7684\u91cc\u9762\u53bb\uff0c\u7136\u540e\u518d\u628a\u5f15\u7528\u6307\u5411\u65b0\u7684\uff0c\u540e\u7eed\u7684\u4f1a\u5728\u540e\u7eed\u7684\u903b\u8f91\u91cc\u9762\u8ddf\u5927\u5bb6\u8bb2\uff0c\u6211\u4eec\u73b0\u5728\u53ea\u9700\u8981\u77e5\u9053\u6709\u8fd9\u79cd\u573a\u666f\uff0c\u7136\u540e\u8fd9\u79cd\u573a\u666f\u662f\u600e\u4e48\u89e3\u51b3\u7684\u5c31\u53ef\u4ee5\u4e86\uff0c\u7136\u540e\u6211\u4eec\u518d\u91cd\u542f\u4e00\u4e0b\uff0c\u6211\u4eec\u518d\u8bd5\u4e00\u4e0b\u529f\u80fd\u3002<img loading=\"lazy\" decoding=\"async\" height=\"375\" width=\"1010\" src=\"https:\/\/i-blog.csdnimg.cn\/direct\/9d56357a20a4410292802b17fc0940c4.png\" alt=\"\"><img loading=\"lazy\" decoding=\"async\" height=\"205\" width=\"658\" src=\"https:\/\/i-blog.csdnimg.cn\/direct\/efebbe5dc19e49d7823b16ab37eb57d6.png\" alt=\"\"><\/p>\n\n\n\n<p>\u8fd9\u4e2a\u957f\u94fe\u63a5\uff0c\u6211\u8fd9\u4e2a\u539f\u59cb\u94fe\u63a5\u4f60\u7ed9\u6211\u52a0\u4e0a\u6beb\u79d2\u6570\u4f1a\u6709\u95ee\u9898\u5417\uff1f\u542c\u6211\u4eec\u8fd9\u8fb9\u8981\u660e\u786e\u4e00\u4e2a\u95ee\u9898\u554a\uff0c\u77ed\u94fe\u63a5\u7684\u539f\u59cb\u94fe\u63a5\u4f1a\u4fdd\u5b58\u5230\u6570\u636e\u5e93\u4e2d\uff0c\u4fdd\u5b58\u7684\u4e0d\u662fhttp:\/\/qrrxiba\/qqqzr121698068473014\u8fd9\u79cd\u4e00\u5927\u5768\u7684\uff0c\u8fd9\u4e2a\u53ea\u662f\u8ba9\u4f60\u53bb\u751f\u6210\u5b83\u5bf9\u5e94\u77ed\u94fe\u63a5\u3002\u4ed6\u6700\u7ec8\u4e0d\u4f1a\u4fdd\u5b58\u5230\u5e93\u91cc\u9762\uff0c\u53ea\u662f\u4e3a\u4e86\u9632\u6b62\u4f60\u751f\u6210\u7684\u4e00\u4e2ahash\u6982\u7387\u51b2\u7a81\u7684<\/p>\n\n\n\n<p>\u8ba4\u4e3a\u4ee3\u7801\u4e0d\u7f8e\u89c2\uff0c\u7528build\u4f1a\u597d\u4e00\u70b9<\/p>\n\n\n\n<p>\u7ed9ShortLinkDO\u6dfb\u52a0<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">@Builder\n@NoArgsConstructor\n@AllArgsConstructor<\/pre>\n\n\n\n<p>&nbsp;\u4ee3\u7801\u4fee\u6539\u5982\u4e0b<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    @Override\n    public ShortLinkCreateRespDTO createShortLink(ShortLinkCreateReqDTO requestParam) {\n\n        String shortLinkSuffix = generateSuffix(requestParam);\n        \/\/ShortLinkDO shortLinkDO = BeanUtil.toBean(requestParam, ShortLinkDO.class);\n        \/\/shortLinkDO.setShortUri(shortLinkSuffix);\n        \/\/String fullShortUrl = requestParam.getDomain() + \"\/\" + shortLinkSuffix;\n        String fullShortUrl = StrBuilder.create(requestParam.getDomain())\n                .append(\"\/\")\n                .append(shortLinkSuffix)\n                .toString();\n\n        \/\/shortLinkDO.setEnableStatus(0);\n        \/\/shortLinkDO.setFullShortUrl(requestParam.getDomain() + \"\/\" + shortLinkSuffix);\n        ShortLinkDO shortLinkDO = ShortLinkDO.builder()\n                .domain(requestParam.getDomain())\n                .originUrl(requestParam.getOriginUrl())\n                .gid(requestParam.getGid())\n                .createdType(requestParam.getCreateType())\n                .validDateType(requestParam.getValidDateType())\n                .validDate(requestParam.getValidDate())\n                .describe(requestParam.getDescribe())\n                .shortUri(shortLinkSuffix)\n                .enableStatus(0)\n                .fullShortUrl(fullShortUrl)\n                .build();\n        try {\n            baseMapper.insert(shortLinkDO);\n        } catch (DuplicateKeyException ex) {\n            LambdaQueryWrapper&lt;ShortLinkDO&gt; queryWrapper = Wrappers.lambdaQuery(ShortLinkDO.class)\n                    .eq(ShortLinkDO::getFullShortUrl, fullShortUrl);\n            ShortLinkDO hasShortLinkDO = baseMapper.selectOne(queryWrapper);\n            if (hasShortLinkDO != null) {\n                log.warn(\"\u77ed\u94fe\u63a5\uff1a{} \u91cd\u590d\u5165\u5e93\", fullShortUrl);\n                throw new ServiceException(\"\u77ed\u94fe\u63a5\u751f\u6210\u91cd\u590d\");\n            }\n        }\n        shortUriCreateCachePenetrationBloomFilter.add(shortLinkSuffix);\n        return ShortLinkCreateRespDTO.builder()\n                .fullShortUrl(shortLinkDO.getFullShortUrl())\n                .gid(requestParam.getGid())\n                .originUrl(requestParam.getOriginUrl())\n                .build();\n    }<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>&nbsp;\u4e3a\u4ec0\u4e48\u5728\u552f\u4e00\u7d22\u5f15\u51b2\u7a81\u5f02\u5e38\u6355\u83b7\u4e2d\u8fd8\u8981\u518d\u67e5\u4e00\u6b21\uff1f<\/p>\n\n\n\n<p><a href=\"https:\/\/t.zsxq.com\/18eJBXoWS\" target=\"_blank\"  rel=\"nofollow\" >https:\/\/t.zsxq.com\/18eJBXoWS<\/a><\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u4e00.\u6709\u4e2a\u7591\u95ee\uff0c\u5e03\u9686\u8fc7\u6ee4\u5668\u5bf9\u4e8e\u5224\u65ad\u5143\u7d20\u4e0d\u5b58\u5728\u65f6\uff0c\u662f\u6ca1\u6709\u8bef\u5224\u7684\u3002\u5373GenerateSuffix\u751f\u6210\u7684\u540e\u7f00\u662f\u552f\u4e00\u7684\uff0c\u90a3\u4e3a\u4ec0\u4e48\u63d2\u5165\u7684\u65f6\u5019\u8fd8\u4f1a\u51fa\u73b0\u91cd\u590dkey\u7684\u60c5\u51b5\u3002<\/p>\n\n\n\n<p>\u7b54\uff1a\u4e3b\u8981\u662f\u4e3a\u4e86\u9632\u6b62\u591a\u7ebf\u7a0b\u5e76\u53d1\u60c5\u51b5\u4e0b\u7684\u9519\u8bef\uff0c\u6709\u591a\u4e2a\u7ebf\u7a0b\u53ef\u80fd\u4f1a\u62ff\u5230\u76f8\u540c\u7684\u4e0d\u5b58\u5728\u7684URI\u7136\u540e\u8fd4\u56de\uff0c\u63a5\u7740\u53bb\u63d2\u5165\u6570\u636e\u5e93\u3002\u4e3a\u5565\u4e0d\u7528\u5206\u5e03\u5f0f\u9501\u5462\uff1f\u7528\u5206\u5e03\u5f0f\u9501\u6027\u80fd\u4e0d\u5c31\u4f4e\u4e86\u4e48<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u4e8c.2\u4e2a\u5e03\u9686\u8fc7\u6ee4\u5668\u6570\u636e\u8fc1\u79fb\u65f6\uff0c\u5982\u679credis\u5b95\u673a\u4e86\u600e\u4e48\u529e\uff1f\u5728\u516c\u53f8\u5b9e\u9645\u4e1a\u52a1\u573a\u666f\u4e0b\uff0c\u4f1a\u9009\u62e9\u4ec0\u4e48\u6837\u7684\u65b9\u6848\u6765\u505a\u6545\u969c\u6062\u590d\u5462\uff1f\u6bd4\u5982\u6301\u4e45\u5316\/\u96c6\u7fa4\u8fd8\u662f\u4ec0\u4e48\u522b\u7684\u65b9\u6848\u5462\uff1f&nbsp;<\/p>\n\n\n\n<p>\u7b54\uff1a\u8fd9\u4e2a\u611f\u89c9\u5c31\u662fredis\u96c6\u7fa4\u548c\u81ea\u5e26\u7684\u6301\u4e45\u5316\u673a\u5236\u5c31\u89e3\u51b3\u4e86<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u4e09.\u552f\u4e00\u7d22\u5f15\u5b58\u5728\u4e0d\u5c31\u662f\u6570\u636e\u5e93\u91cc\u6709\u8fd9\u4e2a\u77ed\u94fe\u63a5\u5417\uff1f\u548b\u8fd8\u518d\u67e5\u4e00\u6b21\u6570\u636e\u5e93\u554a\uff1f<\/p>\n\n\n\n<p>\u7b54\uff1a\u5f02\u5e38\u91cc\u9762\u67e5\u8be2\u6570\u636e\u5e93\u662f\u591a\u4f59\u7684\uff0c\u90fd\u5df2\u7ecf\u62a5\u552f\u4e00\u7d22\u5f15\u5f02\u5e38\u80af\u5b9a\u5c31\u5b58\u5728\uff0c\u90a3\u4e48\u8fd8\u662f\u76f8\u5f53\u4e8e\u6267\u884cif\u91cc\u9762\u7684\u4ee3\u7801\uff0c\u8fd9\u91cc\u5e94\u8be5\u662f\u591a\u4f59\u7684\u64cd\u4f5c,\u53cd\u6b63\u6211\u662f\u4e0d\u660e\u767d\u7684\u3002<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u56db. \u4e3a\u5565\u653e\u8fdb\u5e03\u9686\u8fc7\u6ee4\u5668\u91cc\u7684\u662f\u540e\u7f00\uff0c\u4ece\u5e03\u9686\u8fc7\u6ee4\u5668\u53d6\u51fa\u6765\u5224\u65ad\u7684\u662f\u6574\u4e2a\u77ed\u94fe\u63a5\u7684url<\/p>\n\n\n\n<p>\u7b54\uff1a\u653e\u8fdb\u7684\u5c31\u662f\u6574\u4e2afull\u77ed\u94fe\u63a5\u554a<\/p>\n\n\n\n<p>\u4e0d\u662f\u5427\uff0c\u653e\u8fdb\u53bb\u7684\u662f\u5728\u4e0b\u9762\u65b9\u6cd5\u4e2d\u751f\u6210\u7684\u540e\u7f00\u554a<\/p>\n\n\n\n<p>\u5e94\u8be5\u8981\u653e\u8fdb\u53bb\u751f\u6210\u540e\u5b8c\u6574\u7684\u7684\u77ed\u94fe\u63a5\u5427\uff0c\u5e03\u9686\u8fc7\u6ee4\u5668\u5224\u65ad\u7684\u65f6\u5019\u5224\u65ad\u7684fullShortUrl<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u4e94. \u63d2\u5165\u6570\u636e\u5e93\u90a3\u91cc\u5df2\u7ecf\u505a\u4e86\u552f\u4e00\u7d22\u5f15\u7684\u9650\u5236\uff0c\u6240\u4ee5\u5982\u679c\u751f\u6210\u7684\u77ed\u94fe\u63a5\u5df2\u7ecf\u5728\u5e93\u4e2d\u5b58\u5728\u4e0d\u662f\u5e94\u8be5\u518d\u6b21\u8c03\u7528generate\u65b9\u6cd5\u4e48\uff0c\u5982\u679c\u63a5\u4e0b\u6765\u7684\u5341\u6b21\u90fd\u8fd8\u662f\u91cd\u590d\u7684\uff0c\u90a3\u5c31\u629b\u51fa\u9519\u8bef\uff0c\u611f\u89c9\u8fd9\u6837\u4f1a\u4e0d\u4f1a\u66f4\u597d\u4e00\u4e9b<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u516d. \u8fd9\u91cc\u52a0\u76d0\u5904\u7406\u4e4b\u540e\u540c\u4e00\u4e2aoriginUrl\u80fd\u751f\u6210\u591a\u4e2a\u77ed\u94fe\u63a5\u5427\uff0c\u4e0d\u4f1a\u6709\u95ee\u9898\u5417\uff0c\u7136\u540e\u5c31\u662f\u5e03\u9686\u8fc7\u6ee4\u5668\u6dfb\u52a0\u548c\u68c0\u67e5\u7684\u5b57\u6bb5\u4e0d\u4e00\u81f4\uff0c\u6700\u540e\u5c31\u662f\u4e0d\u660e\u767d\u4e3a\u4ec0\u4e48\u6570\u636e\u5e93\u629b\u5f02\u5e38\u8fd8\u8981\u68c0\u67e5\u4e00\u904d\uff0c\u5f02\u5e38\u4e0d\u5c31\u8bf4\u660e\u952e\u91cd\u590d\u4e86\u5417<\/p>\n\n\n\n<p>\u7b54\uff1a\u95ee\u9898\u4e00\u4e0d\u4f1a\u6709\u95ee\u9898\u5427\uff0c\u4e07\u4e00\u591a\u4e2a\u4e0d\u540c\u7528\u6237\u7528\u540c\u4e00\u4e2a\u539f\u94fe\u63a5\u4e5f\u5e94\u8be5\u53ef\u4ee5\u6b63\u5e38\u751f\u6210\u624d\u5bf9\uff1b<\/p>\n\n\n\n<p>\u540c\u4e00\u4e2a\u539f\u59cb\u94fe\u63a5\u751f\u6210\u591a\u4e2a\u77ed\u94fe\u63a5\u4e0d\u4f1a\u6709\u95ee\u9898\uff0c\u4e1a\u52a1\u662f\u9700\u8981\u7684\uff0c\u6bd4\u5982\u591a\u4e2a\u6e20\u9053\uff08\u5c0f\u7ea2\u4e66\u3001\u5fae\u535a\u7b49\uff09\u8df3\u8f6c\u540c\u4e00\u77ed\u94fe\u63a5\u7edf\u8ba1<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u4e03. \u53d1\u751f\u8bef\u5224\u53ea\u6709\u4e00\u79cd\u60c5\u51b5\uff0c\u5c31\u662f\u672c\u6765\u4e0d\u5b58\u5728\u8bef\u5224\u4e3a\u4e86\u5b58\u5728\uff0c\u5982\u679c\u5b58\u5728\u90a3\u4e48\u4e00\u5b9a\u4f1a\u91cd\u8bd5\uff0c\u4e0d\u4f1a\u8d70\u5230\u6dfb\u52a0\u6570\u636e\u5e93\u7684\u6b65\u9aa4\uff0c\u90a3\u4e48\u80fd\u8d70\u5230\u6dfb\u52a0\u6570\u636e\u5e93\u6b65\u9aa4\u7684\u4e00\u5b9a\u662f\u4e0d\u5b58\u5728\u7684\u77ed\u94fe\u63a5\uff0c\u6b64\u65f6\u6dfb\u52a0\u53ea\u6709\u591a\u7ebf\u7a0b\u60c5\u51b5\u4e0b\u4f1a\u51fa\u73b0\u95ee\u9898\u5427\uff0c\u5982\u679c\u591a\u4e2a\u7ebf\u7a0b\u540c\u65f6\u6dfb\u52a0\u76f8\u540c\u7684\u77ed\u94fe\u63a5\uff0c\u53ea\u6709\u4e00\u4e2a\u80fd\u6dfb\u52a0\u6210\u529f\uff0c\u5176\u4ed6\u7684\u4f1a\u56e0\u4e3a\u552f\u4e00\u7d22\u5f15\u7ea6\u675f\u6dfb\u52a0\u5931\u8d25\uff0c\u6240\u4ee5\u65e2\u7136\u6dfb\u52a0\u5931\u8d25\u4e86\u5c31\u8bf4\u660e\u8fd9\u4e2a\u77ed\u94fe\u63a5\u5df2\u7ecf\u88ab\u4f7f\u7528\u4e86\uff0c\u4e3a\u4ec0\u4e48\u8fd8\u8981\u67e5\u8be2\u6570\u636e\u5e93\u518d\u5224\u65ad\u4e00\u6b21\u662f\u5426\u5b58\u5728\u5462\uff1f<\/p>\n\n\n\n<p>\u7b54\uff1a\u6211\u7684\u731c\u6d4b\u662f\uff0c\u63d2\u5165\u6570\u636e\u5e93\u7684\u77ed\u94fe\u63a5\u6570\u636e\uff0c\u56e0\u4e3a\u6267\u884c\u4e1a\u52a1\u8fc7\u7a0b\u4e2d\u5931\u8d25\uff0c\u53c8\u56de\u5f52\u4e86\ud83d\ude12\u8fd9\u91cc\u786e\u5b9e\u6ca1\u8bb2\u6e05\u695a<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>&nbsp;\u516b.\u5e03\u9686\u8fc7\u6ee4\u5668\u5b58\u5728\u7684\u8bef\u5224\u4e09\u79cd\u60c5\u51b5 1\u3001\u5982\u679c\u5f53\u524d\u7684\u77ed\u94fe\u63a5\u662f\u6ca1\u7528\u8fc7\u7684\uff0c\u4f46\u662f\u88ab\u8bef\u5224\u7528\u8fc7\u4e86\uff0c\u90a3\u4e5f\u6ca1\u4e8b\uff0c\u76f4\u63a5\u4f1a\u88ab\u8df3\u8fc7\uff0c\u7ee7\u7eed\u751f\u6210 2\u3001\u5982\u679c\u5f53\u524d\u7684\u77ed\u94fe\u63a5\u662f\u7528\u8fc7\u7684\uff0c\u4f46\u662f\u88ab\u8bef\u5224\u8bf4\u6ca1\u6709\u7528\u8fc7\uff0c\u90a3\u4e48\u5728\u63d2\u5165\u5230\u6570\u636e\u5e93\u7684\u65f6\u5019\uff0c\u5c31\u4f1a\u88ab\u6570\u636e\u5e93\u7684\u552f\u4e00\u5b57\u6bb5\uff0c\u77ed\u94fe\u63a5\u62e6\u622a\uff0c\u51fa\u73b0\u5f02\u5e38 3\u3001\u5982\u679c\u5728\u6570\u636e\u5e93\u6ca1\u6709\u62e6\u622a\uff0c\u8bf4\u660e\u6ca1\u6709\u8bef\u5224, \u83b7\u53d6\u5230\u7684\u5c31\u662f\u6ca1\u7528\u8fc7\u7684\uff0c\u6b63\u5e38\u8fdb\u884c\uff0c\u4e0d\u629b\u5f02\u5e38<\/p>\n\n\n\n<p>\u7b54\uff1a\u6211\u7684\u60f3\u6cd5\u5c31\u662f\u515c\u5e95\u4e00\u4e0b\uff0c\u6bd4\u5982\u6211\u4eec\u5e73\u65f6\u5199\u767b\u5f55\u7684\u65f6\u5019\u8981\u5224\u65ad\u7a7a\uff0c\u90a3\u4e48\u524d\u7aef\u5176\u5b9e\u5df2\u7ecf\u68c0\u9a8c\u597d\u4e86\uff0c\u4e00\u822c\u4e0d\u4f1a\u4f20\u5165\u7a7a\u8fc7\u6765\uff0c\u6211\u4eec\u540e\u7aef\u8fd8\u662f\u8981\u68c0\u5224\u7a7a\uff0c\u6211\u5c31\u662f\u8fd9\u4e48\u60f3\u7684\uff0c\u5982\u679c\u4e0d\u5bf9\uff0c\u7b49\u9a6c\u54e5\u89e3\u91ca\u54c8\u54c8\uff0c\u5e03\u9686\u8fc7\u6ee4\u5668\u8bf4\u4e0d\u5b58\u5728\u5c31\u662f\u4e0d\u5b58<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u4e5d.\u9a6c\u54e5\u8bf4\u5bf9\u5e03\u9686\u8fc7\u6ee4\u5668\u4e2d\u8bef\u5224\u540e\uff0c\u6570\u636e\u5e93\u8fd8\u8981\u590d\u67e5\u4e00\u904d\u8bf4\u662f\u6709\u8bf4\u6cd5\u7684\u3002\u5728\u8fd9\u91cc\u5408\u7406\u50ac\u66f4\u4e00\u624b\u3002<\/p>\n\n\n\n<p>\u5e94\u8be5\u662f\u91cd\u8bd5\u5341\u6b21\u540e\uff0c\u4ecd\u7136\u53ef\u80fd\u662f\u8bef\u5224\uff0c\u53ef\u4ee5\u518d\u67e5\u4e00\u6b21\u6570\u636e\u5e93\u68c0\u67e5\uff0c\u76f4\u63a5\u629b\u5f02\u5e38\u4e5f\u53ef\u4ee5\uff0c\u6bd5\u7adf\u90fd\u91cd\u8bd5\u5341\u6b21\u8fd8\u662f\u5931\u8d25\u4e86<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u5341. \u8fd9\u91cc\u91cd\u590d\u63d2\u5165\u5f02\u5e38\u51fa\u73b0\u8bf4\u660e\u5e03\u9686\u8fc7\u6ee4\u5668\u91cc\u9762\u662f\u6ca1\u6709\u8fd9\u6761fullShortLink\u7684 \u6240\u4ee5\u6211\u89c9\u5f97\u5e94\u8be5\u4e0d\u7528\u518d\u53bb\u67e5\u4e00\u6b21\u8868\u76f4\u63a5\u628a\u8fd9\u4e2afullShortLink\u653e\u5230\u5e03\u9686\u8fc7\u6ee4\u5668\u4e2d\u7136\u540e\u518d\u629b\u5f02\u5e38<\/p>\n\n\n\n<p>\u7b54\uff1a\u8fd9\u4e2a\u60f3\u6cd5\u5e94\u8be5\u662f\u5bf9\u7684\uff0c\u67e5\u6570\u636e\u5e93\u662f\u591a\u4f59\u7684<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>11. \u5728generateSuffix()\u65b9\u6cd5\u4e2d originUrl += System.currentTimeMillis(), \u7136\u540e\u5f53\u6267\u884c HashUtil.hashToBase62(originUrl), \u6bcf\u6b21\u751f\u6210\u7684\u77ed\u94fe\u63a5\u90fd\u4e0d\u4e00\u6837, \u56e0\u4e3a\u662f\u539f\u59cb\u94fe\u63a5+\u6beb\u79d2\u503c,\u8fd9\u4e2a\u503c\u662f\u52a8\u6001\u6539\u53d8\u7684,\u751f\u6210\u7684\u77ed\u94fe\u63a5\u4e5f\u662f\u52a8\u6001\u6539\u53d8, \u5f53\u6267\u884cbaseMapper.insert\u65f6,\u5b83\u5c31\u4e0d\u4f1a\u8fdb\u5165catch\u4ee3\u7801\u5757\u4e2d, \u4f1a\u76f4\u63a5\u63d2\u5165.\u7406\u8bba\u4e0a\u4e00\u4e2a\u94fe\u63a5\u53ef\u4ee5\u751f\u6210\u65e0\u9650\u4e2a\u4e0d\u540c\u7684\u77ed\u94fe, \u8fd9\u6837\u76f4\u63a5\u628a\u6570\u636e\u5e93\u586b\u6ee1\u4e86<\/p>\n\n\n\n<p>\u7b54\uff1a\u7528\u6237\u8981\u751f\u6210\u77ed\u94fe\u63a5\uff0c\u5e94\u8be5\u662f\u6709\u6761\u6570\u9650\u5236\u7684\uff0c\u4e0d\u4f1a\u8ba9\u4ed6\u63d2\u6ee1\u7684 \u8fd9\u4ee3\u7801\u6709\u903b\u8f91\u95ee\u9898\uff0c\u7528\u6237\u6bcf\u6b21\u751f\u6210\u7684\u77ed\u94fe\u63a5\u90fd\u662f\u4e0d\u540c\u7684\uff0c\u53ea\u80fd\u7528\u4e00\u6b21<\/p>\n\n\n\n<p>\u6211\u89c9\u5f97\u8fd9\u79cd\u4e1a\u52a1\u573a\u666f\u662f\u9700\u8981\u7684\uff0c\u5c31\u662f\u7ed9\u540c\u4e00\u4e2a\u539f\u59cb\u94fe\u63a5\uff0c\u751f\u6210\u591a\u4e2a\u4e0d\u540c\u7684\u77ed\u94fe\u63a5\uff0c\u6bd4\u5982\u8bf4\u505a\u4e00\u4e9b\u5546\u5bb6\u63a8\u5e7f\uff0c\u7ed9\u4e0d\u540c\u7684\u4e3b\u64ad\u4e0d\u540c\u7684\u77ed\u94fe\u63a5\u53bb\u63a8\u5e7f\uff0c\u6bd4\u5982b\u7ad9\u8fd9\u79cd\u5c31\u5f88\u591a\uff0c\u65b9\u4fbf\u7edf\u8ba1\u4e0d\u540c\u4e3b\u64ad\u7684\u6d41\u91cf\u60c5\u51b5\uff0c\u5f53\u7136\u6211\u8bf4\u7684\u4e5f\u53ef\u80fd\u4e0d\u5bf9\uff0c\u8fd9\u662f\u6211\u7684\u60f3\u6cd5<\/p>\n\n\n\n<p>\u52a0\u6beb\u79d2\u503c\u76ee\u7684\u5c31\u662f\u751f\u6210\u4e0d\u540c\u7684\u77ed\u94fe\u63a5\uff0c\u5728\u591a\u7ebf\u7a0b\u60c5\u51b5\u4e0b\u6709\u53ef\u80fd\u8fdb\u5165\u5230catch\u5757\u91cc\uff0c\u56e0\u4e3a\u8fd9\u65f6\u8fd8\u6ca1\u52a0\u5230\u5e03\u9686\u8fc7\u6ee4\u5668\u91cc\u9762\uff0c\u5c31\u8bef\u5224\u4e3a\u4e0d\u5b58\u5728\uff0c\u4f46\u662f\u6570\u636e\u5e93\u4e2d\u5176\u5b9e\u5df2\u7ecf\u63d2\u5165\u8fdb\u53bb\u4e86\uff0c\u6240\u4ee5\u5728\u5f02\u5e38\u5757\u91cc\u76f4\u63a5\u628a\u5b8c\u6574\u7684\u77ed\u94fe\u63a5\u653e\u5230\u5e03\u9686\u8fc7\u6ee4\u5668\u91cc\u9762\u5c31\u597d\u4e86<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>12. 1.\u8fd9\u91cc\u5f53\u5411\u6570\u636e\u5e93\u4e2d\u63d2\u5165\u77ed\u94fe\u63a5\u65f6\uff0c\u53ef\u80fd\u53d1\u751f\u552f\u4e00\u7d22\u5f15\u51b2\u7a81\uff0c\u5373\u5e03\u9686\u8fc7\u6ee4\u5668\u5224\u65ad\u4e0d\u5b58\u5728\uff0c\u4f46\u6570\u636e\u5e93\u4e2d\u5df2\u7ecf\u5b58\u5728\uff0c\u8fd9\u79cd\u60c5\u51b5\u53ef\u80fd\u662f\u591a\u7ebf\u7a0b\u591a\u4e2a\u7528\u6237\u4e00\u8d77\u751f\u6210\u76f8\u540c\u77ed\u94fe\u63a5\u5bfc\u81f4\u7684\uff1b\u4e5f\u53ef\u80fd\u56e0\u4e3a\u8fdb\u7a0b\u6302\u6389\u7b49\u7b49\u539f\u56e0\uff0c\u7531\u4e8e\u6ca1\u52a0\u4e8b\u52a1\uff0c\u77ed\u94fe\u63a5\u5165\u5e93\u4e86\uff0c\u4f46\u5e03\u9686\u8fc7\u6ee4\u5668\u4e2d\u6ca1\u6709\u4fdd\u5b58\uff0c\u540c\u65f6\u6ca1\u6709\u56de\u6eda\uff0c\u7b2c\u4e8c\u79cd\u60c5\u51b5\u662f\u53ef\u4ee5\u901a\u8fc7\u52a0\u4e8b\u52a1\u6765\u89e3\u51b3\u7684\u3002 2.\u6355\u83b7\u5230\u552f\u4e00\u7d22\u5f15\u51b2\u7a81\u4e4b\u540e\uff0c\u9a6c\u54e5\u518d\u6b21\u5224\u65ad\u6570\u636e\u5e93\u4e2d\u662f\u5426\u5b58\u5728\uff0c\u8fd9\u91cc\u6211\u4e5f\u4e0d\u592a\u770b\u5f97\u61c2\u4e86\uff0c\u5df2\u7ecf\u552f\u4e00\u7d22\u5f15\u51b2\u7a81\uff0c\u8fd8\u53ef\u80fd\u6570\u636e\u5e93\u4e0d\u5b58\u5728\u5417\uff1f\u6211\u80fd\u60f3\u5230\u7684\u60c5\u51b5\u53ea\u6709\u522b\u4eba\u7684\u4e1a\u52a1\u56de\u6eda\u4e86\uff0c\u672c\u6765\u4fdd\u5b58\u8fdb\u6570\u636e\u5e93\u7684\u6570\u636e\u53c8\u5220\u9664\u4e86\uff0c\u90a3\u4ed6\u6570\u636e\u5e93\u4e0d\u5b58\u5728\u4e86\uff0c\u6211\u8fd8\u628a\u5b83\u52a0\u5230\u5e03\u9686\u8fc7\u6ee4\u5668\u91cc\uff0c\u8fd9\u662f\u4e3a\u4e86\u4ec0\u4e48\uff1f\u96be\u9053\u4e0d\u5e94\u8be5\u6570\u636e\u5e93\u67e5\u5230\u5b58\u5728\u65f6\uff0c\u52a0\u5230\u5e03\u9686\u8fc7\u6ee4\u5668\uff0c\u9632\u6b621\u91cc\u9762\u6211\u8bf4\u7684\u4e8b\u52a1\u95ee\u9898\u5bfc\u81f4\u7684\u5417\uff1f<\/p>\n\n\n\n<p>\u7b54\uff1a\u786e\u5b9e\uff0c\u95ee\u98982\u6211\u4e5f\u6ca1\u770b\u61c2\uff0c\u53e6\u5916\u4e3a\u4ec0\u4e48\u5224\u65ad\u4e0d\u5b58\u5728\u5c31\u53ef\u4ee5\u76f4\u63a5\u6267\u884c\u4e0b\u9762\u7684\u6b65\u9aa4\uff0c\u63d2\u5165\u5931\u8d25\u4e86\u76f4\u63a5\u8fd4\u56de\u7ed9\u7528\u6237\u77ed\u94fe\u63a5\u800c\u6570\u636e\u5e93\u5e76\u6ca1\u6709\u8bb0\u5f55\uff0c\u4f46\u662f\u56e0\u4e3a\u6ca1\u6709\u62a5\u9519\u7528\u6237\u4ecd\u7136\u4f7f\u7528\u8fd9\u6761\u8bb0\u5f55\u8fdb\u884c\u64cd\u4f5c\u5c31\u4f1a\u6709\u95ee\u9898\u3002\u6211\u611f\u89c9\u5224\u65ad\u4e0d\u5b58\u5728\u4e4b\u540e\u9700\u8981\u518d\u91cd\u65b0\u63d2\u5165\u4e00\u904d\uff0c\u6216\u8005\u76f4\u63a5\u62a5\u9519\uff0c\u800c\u4e0d\u662f\u6b63\u5e38\u8fd4\u56de<\/p>\n\n\n\n<p>\u540c\u610f\u5c0f\u660e\u7684\u8bf4\u6cd5\uff0c\u901a\u8fc7\u4fdd\u8bc1\u6570\u636e\u5e93\u548c\u5e03\u9686\u8fc7\u6ee4\u5668\u7684\u4e8b\u52a1\uff0c\u53ef\u4ee5\u9632\u6b62\u5e03\u9686\u8fc7\u6ee4\u5668\u4e22\u5931\u90e8\u5206\u77ed\u94fe\u63a5\u7684\u4fe1\u606f\u3002\u5177\u4f53\u505a\u6cd5\u662f\uff1f\u6d88\u606f\u961f\u5217\u91cd\u8bd5\uff1f\u8ba2\u9605MySQL binlog\uff0c\u518d\u64cd\u4f5c\u5e03\u9686\u8fc7\u6ee4\u5668\uff1f<\/p>\n\n\n\n<p>\u591a\u7ebf\u7a0b\u591a\u4e2a\u7528\u6237\u4e00\u8d77\u751f\u6210\u76f8\u540c\u77ed\u94fe\u63a5\u5bfc\u81f4\u7684\uff0c\u8fd9\u4e2a\u53ea\u662f\u5728\u5e03\u9686\u8fc7\u6ee4\u5668\u4e0a\u4f1a\u91cd\u590d\uff0c\u6570\u636e\u5e93\u63d2\u5165\u662f\u4e32\u884c\u6267\u884c\u4e0d\u4f1a\u91cd\u590d\u63d2\u5165\uff0c\u4e3a\u4e86\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\uff0c\u4e0a\u9501\u5c31\u884c\uff0c\u6ce8\u610f\u7c92\u5ea6\uff0c\u7b2c\u4e8c\u4e2a\u95ee\u9898\u90a3\u786e\u5b9e\u9700\u8981\u4e8b\u52a1\u6765\u5904\u7406\uff0c\u4fdd\u8bc1redis\u548c\u6570\u636e\u5e93\u540c\u65f6\u6210\u529f\u5931\u8d25\uff0c\u4f7f\u7528spring\u7684\u7f16\u7a0b\u4e8b\u52a1\uff0c\u6ce8\u610f\u4e0d\u662f\u58f0\u660e\u4e8b\u52a1\uff0c\u5c31\u53ef\u4ee5\uff0c\u8fd9\u91cc\u5199\u7684\u4ee3\u7801\u7684\u786e\u6bd4\u8f83\u591a\u95ee\u9898<\/p>\n\n\n\n<p>\u5bf9\u4e8e\u7b2c2\u4e2a\u95ee\u9898\u7684\u573a\u666f\uff0c\u5e94\u8be5\u662f\u4e0d\u5b58\u5728\u7684\u5427\u3002\u56e0\u4e3a\u63d2\u5165\u77ed\u94fe\u63a5\u8fd9\u4e2a\u65b9\u6cd5\u662f\u6ca1\u6709\u52a0\u4e8b\u52a1\u7684\uff0c\u6240\u4ee5\u63d2\u5165\u662f\u4e0d\u5b58\u5728\u4e1a\u52a1\u56de\u6eda\u7684\u60c5\u51b5\u7684\uff0c\u53ea\u8981\u51fa\u73b0\u4e86Dup Key\uff0c\u8bf4\u660e\u6570\u636e\u5e93\u4e2d\u5fc5\u7136\u5df2\u7ecf\u5b58\u5728\u3002 \u6709\u4e86\u8fd9\u4e2a\u524d\u63d0\uff0c\u90a3\u4e48\u5f53\u51fa\u73b0\u4e86Dup Key\uff0c\u6b64\u65f6\u53ea\u9700\u8981\u624b\u52a8\u5728\u5f02\u5e38catch\u5757\u4e2d\u8865\u5145\u4e00\u6b21\u5e03\u9686\u8fc7\u6ee4\u5668\u7684add\u64cd\u4f5c\uff0c\u7136\u540e\u629b\u51fa\u5f02\u5e38\u5373\u53ef\uff0c\u4e0d\u7528\u518d\u52a0\u4e8b\u52a1\u4e86\u3002<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>13. \u53d1\u73b0\u91cd\u590d\u5165\u5e93\u4e4b\u540e\uff0c\u662f\u4e0d\u662f\u5e94\u8be5\u91cd\u65b0\u751f\u6210\u77ed\u94fe\u63a5\uff0c\u800c\u4e0d\u662f\u76f4\u63a5\u62a5\u9519\uff1f\u7b54\uff1a\u4e00\u79cd\u4f18\u5316\u601d\u8def\uff0c\u662f\u53ef\u4ee5\u7684<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>14. \u8fd9\u79cd\u751f\u6210\u77ed\u94fe\u63a5\u7684\u903b\u8f91\u4e0d\u5c31\u662f\u610f\u5473\u7740\uff0c\u4e00\u4e2a\u539f\u59cburl\u53ef\u80fd\u4f1a\u5bf9\u5e94\u591a\u4e2a\u77ed\u94fe\u63a5\u5417\uff0c\u6bcf\u6b21\u8c03\u7528\u8fd9\u4e2a\u63a5\u53e3\u90fd\u4f1a\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u77ed\u94fe\u63a5\uff1f\u7b54\uff1a\u662f\u7684\uff0c\u8fd9\u79cd\u60c5\u51b5\u662f\u5141\u8bb8\u7684<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>15. \u6709\u4e2a\u7591\u95ee\uff1a\u5728generateSuffix\u65b9\u6cd5\u4e2d\uff0c\u7ed9originUrl\u5b57\u7b26\u4e32\u6dfb\u52a0\u4e86\u65f6\u95f4\u5bfc\u81f4\u6bcf\u4e2aoriginUrl\u90fd\u4e0d\u4f1a\u76f8\u540c\uff0c\u5305\u62ec\u540c\u4e00\u4e2aoriginUrl\uff0c\u90a3\u4e48\u540c\u4e00\u4e2aoriginUrl\u53ef\u4ee5\u521b\u5efa\u591a\u6b21\u77ed\u94fe\u63a5\uff0c\u751f\u6210\u7684shortUri\u90fd\u4e0d\u76f8\u540c\uff0c\u4e00\u4f1a\u5c31\u4f1a\u628a\u5e03\u9686\u8fc7\u6ee4\u5668\u6491\u7206\u3002<\/p>\n\n\n\n<p>\u7b54\uff1a\u8fd9\u4e2a\u6211\u89c9\u5f97\u5408\u7406\u554a\uff0c\u96be\u9053\u4e00\u4e2a\u767e\u5ea6url\u53ea\u80fd\u7ed9\u4e00\u4e2a\u7528\u6237\u521b\u5efa\u77ed\u94fe\u63a5\u5417\uff1f\u5408\u7406\u7684\uff0c\u4f8b\u5982\u591a\u4e2a\u77ed\u94fe\u63a5\u5bf9\u5e94\u4e00\u4e2a originUrl, \u4e0d\u540c\u7684\u77ed\u94fe\u63a5\u5bf9\u5e94\u7ed9\u4e0d\u540c\u7684\u5e73\u53f0\u505a\u63a8\u5e7f\uff0c \u5c31\u53ef\u4ee5\u901a\u8fc7\u8fd9\u4e9b\u77ed\u94fe\u63a5\u7684\u70b9\u51fb\u7387\u5206\u6790\u5230\u5728\u4e0d\u540c\u5e73\u53f0\u7684\u63a8\u5e7f\u8d28\u91cf\uff1b\u8fd9\u91cc\u7684\u95ee\u9898\u4e0d\u662f\u8bf4\u4e00\u4e2a\u539f\u59cb\u94fe\u63a5\u4e0d\u53ef\u4ee5\u62e5\u6709\u591a\u4e2a\u77ed\u94fe\u63a5\uff0c\u800c\u662f\u4f1a\u51fa\u73b0\u540c\u4e00\u4e2a\u7528\u6237\u540c\u4e00\u4e2a\u539f\u59cb\u94fe\u63a5\u90fd\u4f1a\u51fa\u73b0\u591a\u4e2a\u77ed\u94fe\u63a5\uff0c\u6211\u611f\u89c9\u8fd9\u79cd\u5e94\u8be5\u662f\u4e0d\u5141\u8bb8\u51fa\u73b0\u7684\u5427\uff1f\u6211\u89c9\u5f97\u4f60\u8bf4\u5f97\u5bf9\uff0c\u540c\u4e00\u7528\u6237\u5c31\u5e94\u8be5\u53ea\u80fd\u5bf9\u540c\u4e00\u77ed\u94fe\u63a5\u751f\u6210\u7406\u8bba\u4e0a\u6709\u9650\u7684\u77ed\u94fe\u63a5\uff0cmading\u8fd9\u91cc\u76f4\u63a5\u7528\u7cfb\u7edf\u6beb\u79d2\u6570\u52a0\u76d0\u6211\u89c9\u5f97\u5f88\u626f\uff0c\u8fd9\u6837\u57fa\u672c\u4e0a\u4e00\u4e2a\u7528\u6237\u5bf9\u4efb\u610f\u539f\u59cb\u8fde\u63a5\u751f\u6210\u7684\u77ed\u94fe\u63a5\u90fd\u4e0d\u540c\u4e86\uff0c\u9ad8\u5e76\u53d1\u76f4\u63a5\u628a\u5e03\u9686\u8fc7\u6ee4\u5668\u6491\u7206\u4e86<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>16. \u770b\u5230\u8fd9\u6709\u7591\u95ee\u7684\u540c\u5b66\uff0c\u53ef\u4ee5\u5148\u628a\u4ee3\u7801\u8fd9\u4e48\u6572\u7740\uff0c\u540e\u7eed\u9a6c\u54e5\u4f1a\u9488\u5bf9\u8fd9\u4e00\u5757\u5728\u6539\u4ee3\u7801\uff0c\u56e0\u4e3a\u5e03\u9686\u8fc7\u6ee4\u7684\u5224\u65ad\u903b\u8f91\u662f\uff1a\u5e03\u9686\u8fc7\u6ee4\u5668\u5224\u65ad\u4e0d\u5b58\u5728\u7684\uff0c\u90a3\u4e48\u4e00\u5b9a\u4e0d\u5b58\u5728\uff0c\u5e03\u9686\u8fc7\u6ee4\u5668\u5224\u65ad\u5b58\u5728\u7684\u6570\u636e\uff0c\u771f\u5b9e\u60c5\u51b5\u53ef\u80fd\u4e0d\u5b58\u5728\u4e5f\u5c31\u662f\u51fa\u73b0\u8bef\u5224\u7684\u60c5\u51b5\uff0c\u6240\u4ee5\u540e\u8fb9\u9a6c\u54e5\u5c31\u628a\u67e5\u8be2\u6570\u636e\u5e93\u8fd9\u4e00\u5757\u7684\u4ee3\u7801\u5220\u4e86\u3002<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>17.\u6dfb\u52a0\u4e86System.currentTimeMillis()\u4e0d\u662f\u4f1a\u5bfc\u81f4\u76f8\u540c\u7684originUrl\u4e0e\u591a\u4e2a\u77ed\u94fe\u63a5\u7ed1\u5b9a\u5417\uff1f\u90a3\u8fd9\u6837\u4e0d\u5c31\u53ef\u4ee5\u4e0d\u65ad\u5730\u8bf7\u6c42\uff0c\u4e0d\u4f1a\u6709\u98ce\u9669\u5417\uff1f&nbsp;<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">\u7b2c07\u8282\uff1a\u77ed\u94fe\u63a5\u6d77\u91cf\u6570\u636e\u5206\u7247\u5206\u8868<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.nageoffer.shortlink.admin.test;\n\n\/**\n *  \u505a\u4e00\u4e2a\u5206\u7247\u7684\u5904\u7406\uff0c\u6211\u4eec\u5148\u5206\u5341\u516d\u4e2a\u7247\u554a\n *\/\npublic class UserTableShardingTest {\n\n    public static final String SQL = \"CREATE TABLE `t_link_%d` (\\n\" +\n            \"  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',\\n\" +\n            \"  `domain` varchar(128) DEFAULT NULL COMMENT '\u57df\u540d',\\n\" +\n            \"  `short_uri` varchar(8) DEFAULT NULL COMMENT '\u77ed\u94fe\u63a5',\\n\" +\n            \"  `full_short_url` varchar(128) DEFAULT NULL COMMENT '\u5b8c\u6574\u77ed\u94fe\u63a5',\\n\" +\n            \"  `origin_url` varchar(1024) DEFAULT NULL COMMENT '\u539f\u59cb\u94fe\u63a5',\\n\" +\n            \"\\t`click_num` int(11) DEFAULT 0 COMMENT '\u70b9\u51fb\u91cf',\\n\" +\n            \"\\t`gid` varchar(32) DEFAULT NULL COMMENT '\u5206\u7ec4\u6807\u8bc6',\\n\" +\n            \"\\t`enable_status` tinyint(1) DEFAULT NULL COMMENT '\u542f\u7528\u6807\u8bc6 1\uff1a\u672a\u542f\u7528 0\uff1a\u5df2\u542f\u7528',\\n\" +\n            \"\\t`created_type` tinyint(1) DEFAULT NULL COMMENT '\u521b\u5efa\u7c7b\u578b 0\uff1a\u63a7\u5236\u53f0 1\uff1a\u63a5\u53e3',\\n\" +\n            \"\\t`valid_date_type` tinyint(1) DEFAULT NULL COMMENT '\u6709\u6548\u671f\u7c7b\u578b 0\uff1a\u6c38\u4e45\u6709\u6548 1\uff1a\u7528\u6237\u81ea\u5b9a\u4e49',\\n\" +\n            \"\\t`valid_date` datetime DEFAULT NULL COMMENT '\u6709\u6548\u671f',\\n\" +\n            \"\\t`describe` varchar(1024) DEFAULT NULL COMMENT '\u63cf\u8ff0',\\n\" +\n            \"  `create_time` datetime DEFAULT NULL COMMENT '\u521b\u5efa\u65f6\u95f4',\\n\" +\n            \"  `update_time` datetime DEFAULT NULL COMMENT '\u4fee\u6539\u65f6\u95f4',\\n\" +\n            \"  `del_flag` tinyint(1) DEFAULT NULL COMMENT '\u5220\u9664\u6807\u8bc6 0\uff1a\u672a\u5220\u9664 1\uff1a\u5df2\u5220\u9664',\\n\" +\n            \"  PRIMARY KEY (`id`),\\n\" +\n            \"  UNIQUE KEY `idx_unique_full_short_url` (`full_short_url`) USING BTREE\\n\" +\n            \") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;\";\n\n    public static void main(String&#91;] args) {\n        for (int i = 0; i &lt; 16; i++) {\n            System.out.printf((SQL) + \"%n\", i);\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u00a0\u751f\u6210\u4e8616\u4e2a\u8868\uff0c\u628a\u539f\u6765\u90a3\u4e2a\u5220\u4e86<img loading=\"lazy\" decoding=\"async\" height=\"310\" width=\"679\" src=\"https:\/\/i-blog.csdnimg.cn\/direct\/f0dafdf9874b45269b99fe5813c81851.png\" alt=\"\"><\/p>\n\n\n\n<p>&nbsp;\u73b0\u5728\u914d\u7f6eshardingsphere\uff0cproject\u7684\u4e24\u4e2a\u914d\u7f6e\u6587\u4ef6\u5982\u4e0b<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>server:\n  port: 8001\nspring:\n  datasource:\n    driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver\n    url: jdbc:shardingsphere:classpath:shardingsphere-config.yaml\n  data:\n      redis:\n        host: 192.168.111.130\n        password: 123321\n        port: 6379<\/code><\/pre>\n\n\n\n<p>&nbsp;\u5206\u7247\u4ef6\u8be5\u600e\u4e48\u9009\u62e9\u4e86\uff1f\u53c2\u8003\u4e00\u4e0b\u90a3\u4e2a\u5c0f\u7801\u77ed\u94fe\u63a5\u3002\u5b83\u96be\u9053\u662f\u6839\u636e\u77ed\u94fe\u63a5\u53bb\u5206\u7ec4\u7684\u5417\uff1f\u5217\u8868\u91cc\u9762\u67e5\u8be2\u6761\u4ef6\u91cc\u9762\u4e00\u5b9a\u6709\u77ed\u94fe\u63a5\uff1f\u4e0d\u4e00\u5b9a\uff1b\u6709\u4e00\u4e2a\u4ed6\u4eec\u7684\u8fd9\u4e2a\u5206\u7ec4ID\uff0c\u76f8\u5f53\u4e8e\u4f60\u4e3e\u4f8b\uff1a\u6211\u4eec\u5982\u679c\u8bf4\u7528\u77ed\u94fe\u63a5\u5206\u5e93\u5206\u8868\uff0c\u6211\u4eec\u7528\u77ed\u94fe\u63a5\u53bb\u505a\u90a3\u79cdhashmode\uff0c\u7528hash\u7684\u65b9\u5f0f\u53bb\u8fdb\u884c\u5206\u8868\uff0c\u6839\u636e\u4ed6\u5bf9\u5e94\u7684\u77ed\u94fe\u63a5\u53bb\u67e5\u4e00\u4e0b\u957f\u94fe\u63a5\uff0c\u5f53\u7136\u53ef\u4ee5\u3002\u4f46\u662f\u4f60\u50cf\u8fd9\u79cd\u540e\u7ba1\u91cc\u9762\u7684\u5206\u9875\uff0c\u4ed6\u60f3\u6839\u636e\u67d0\u4e2a\u5206\u7ec4\u53bb\u67e5\u8be2\u5bf9\u5e94\u7684\u8fd9\u4e2a\u5206\u7ec4\u4e0b\u7684\u77ed\u94fe\u63a5\uff0c\u7528\u77ed\u94fe\u63a5\u53bb\u5206\u8868\u5c31\u4e0d\u884c\uff1a\u4ed6\u53ea\u4f20\u7ed9\u4f60\u4e00\u4e2a\u8fd9\u4e2a\u5206\u7ec4\uff0c\u80af\u5b9a\u662f\u67e5\u6240\u6709\u7684\u90a3\u4e2a\u8868<\/p>\n\n\n\n<p>\u90a3\u6211\u4eec\u53ef\u4ee5\u6309\u7167\u5206\u7ec4ID\uff0c\u4e5f\u5c31\u662f\u6211\u4eec\u7684gid\u53bb\u7ed9\u5b83\u505a\u4e00\u4e2a\u5206\u8868\uff0c\u4f46\u662f\u4f60groupid\u5206\u5e93\u5206\u8868\uff0c\u90a3\u4f60\u5982\u679c\u8bf4\u8fd9\u79cd\u77ed\u94fe\u63a5\u8df3\u8f6c\u957f\u94fe\u63a5\uff0c\u5b83\u662f\u6ca1\u6709\u5206\u7ec4ID\u7684\uff0c\u600e\u4e48\u529e\uff1f\u4e0b\u8282\u8bfe\u8bf4<\/p>\n\n\n\n<p>\u6211\u4eec\u5c31\u6309\u90a3\u4e2aGID\u53bb\u7ed9\u5b83\u505a\u5206\u8868<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># \u6570\u636e\u6e90\u96c6\u5408\ndataSources:\n  ds_0:\n    dataSourceClassName: com.zaxxer.hikari.HikariDataSource\n    driverClassName: com.mysql.cj.jdbc.Driver\n    jdbcUrl: jdbc:mysql:\/\/127.0.0.1:3306\/link?useUnicode=true&amp;characterEncoding=UTF-8&amp;rewriteBatchedStatements=true&amp;allowMultiQueries=true&amp;serverTimezone=Asia\/Shanghai\n    username: root\n    password: root\n\nrules:\n  - !SHARDING\n    tables:\n      t_link:\n        actualDataNodes: ds_0.t_link_${0..15}\n        tableStrategy:\n          standard:\n            shardingColumn: gid\n            shardingAlgorithmName: link_table_hash_mod\n    shardingAlgorithms:\n      link_table_hash_mod:\n        type: HASH_MOD\n        props:\n          sharding-count: 16\nprops:\n  sql-show: true<\/pre>\n\n\n\n<p>\u6211\u4eec\u53bb\u4f20\u4ed6\u5bf9\u5e94\u7684\u4e00\u4e2aGlobeIid\u67e5\u8be2\u5373\u53ef<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u4f60\u53ef\u80fd\u4f1a\u62a5\u9519\uff0c\u8bb0\u5f97&nbsp;ShortLinkServicelmpl.java\uff0cShortLinkDO.java \uff0cShortLinkCreateReqDTO.java\u8fd9\u51e0\u4e2a\u7684createdType\u6216\u8005getCreatedType;\u90fd\u8981\u52a0\u4e2ad\uff0c\u4e0d\u662fcreateType;<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">\u7b2c08\u8282\uff1a\u62e6\u622a\u5668\u5c01\u88c5\u7528\u6237\u4e0a\u4e0b\u6587\uff08\u8865\u5145\u7bc7\uff09<\/h2>\n\n\n\n<p>&nbsp;\u6211\u5728\u8ddf\u524d\u7aef\u8054\u8c03\u8fc7\u7a0b\u5f53\u4e2d\u9047\u5230\u7684\u4e00\u4e2a\u95ee\u9898\uff0c\u9996\u5148\u6211\u4eec\u8fd9\u91cc\u9762\u662f\u5df2\u7ecf\u91cd\u6784\u8fc7\u4e86 ADB\u63a5\u53e3\u7684\uff0c\u7136\u540e\u4f46\u662f\u6211\u4eec\u8fd9\u91cc\u9762\u8fd8\u662f\u6ca1\u52a0\/admin\uff0c\u6240\u4ee5\u8bf4\u5b83\u4f1a\u6709\u4e00\u70b9\u95ee\u9898\uff1b\u7136\u540e\u5176\u6b21\u6211\u4eec\u524d\u7aef\u4e0d\u9700\u8981\u53bb\u767b\u5f55\u7684\u63a5\u53e3\u4e0d\u6b62\u4e00\u4e2alogin\uff0c\u5b83\u4f1a\u6709\u4e09\u4e2a\uff0c\u4e00\u4e2a\u6ce8\u518c\uff0c\u4e00\u4e2a\u662f\u7528\u6237\u767b\u5f55\uff0c\u7528\u6237\u6ce8\u518c\u548c\u4e00\u4e2a\u68c0\u67e5\u7528\u6237\u540d\u662f\u5426\u53ef\u7528\uff0c\u5927\u5bb6\u53ef\u80fd\u4f1a\u6709\u95ee\u9898\uff0c\u5c31\u662f\u8bf4\u68c0\u67e5\u7528\u6237\u540d\u662f\u5426\u53ef\u7528\uff0c\u4e3a\u4ec0\u4e48\u4e0d\u9700\u8981token\uff1f\u8fd9\u4e2a\u63a5\u53e3\u662f\u6211\u4eec\u5728\u6ce8\u518c\u7684\u65f6\u5019\u53bb\u5224\u65ad\u8fd9\u4e2a\u7528\u6237\u540d\u6709\u6ca1\u6709\u88ab\u5176\u4ed6\u7528\u6237\u4f7f\u7528\uff0c\u76f8\u5f53\u4e8e\u7528\u6237\u8fd8\u6ca1\u6709\u53bb\u6ce8\u518c\uff0c\u66f4\u4f55\u51b5\u4ed6\u54ea\u6765\u7684token\u5bf9\u4e0d\u5bf9\uff1f&nbsp;<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">package com.nageoffer.shortlink.admin.common.biz.user;\n\nimport com.alibaba.fastjson2.JSON;\n\nimport com.google.common.collect.Lists;\nimport jakarta.servlet.Filter;\nimport jakarta.servlet.FilterChain;\nimport jakarta.servlet.ServletException;\nimport jakarta.servlet.ServletRequest;\nimport jakarta.servlet.ServletResponse;\nimport jakarta.servlet.http.HttpServletRequest;\nimport lombok.RequiredArgsConstructor;\nimport org.springframework.data.redis.core.StringRedisTemplate;\nimport org.springframework.util.StringUtils;\n\nimport java.io.IOException;\nimport java.net.URLDecoder;\nimport java.util.List;\nimport java.util.Objects;\n\nimport static java.nio.charset.StandardCharsets.UTF_8;\n\n\/**\n * \u7528\u6237\u4fe1\u606f\u4f20\u8f93\u8fc7\u6ee4\u5668\n *\/\n@RequiredArgsConstructor\npublic class UserTransmitFilter implements Filter {\n    private final StringRedisTemplate stringRedisTemplate;\n\n    private static final List&lt;String&gt; IGNORE_URI = Lists.newArrayList(\n            \"\/api\/short-Link\/admin\/v1\/user\/Login\",\n            \"\/api\/short-Link\/admin\/admin\/v1\/actual\/user\/has-user-name\"\n            \/*\n            \"\/api\/short-Link\/admin\/v1\/user\"\n            *\/\n    );\n\n    @Override\n    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {\n        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;\n        String requestURI = httpServletRequest.getRequestURI();\n        \/\/\u8fd9\u4e2aURI\u662f\u5426\u5b58\u5728\u4e8e\u6211\u4eec\u7684\u5ffd\u7565\u673a\u58f3\u91cc\uff0c\u5ffd\u7565\u53d6\u53cd\u8bf4\u660e\u5b83\u90a3\u4e2a\u4e0d\u5b58\u5728\u4e8e\u6211\u4eec\u5ffd\u7565\u7684\u540d\u5355\u91cc\u9762\n        \/\/\u4f46\u662f\u8fd9\u91cc\u6709\u4e2a\u95ee\u9898,\"\/api\/short-Link\/admin\/v1\/user\"\u662f\u56e0\u4e3a\u6211\u4eec\u662f\u7528\u7684Restful\u7684\u8fd9\u79cd\u5f62\u5f0f,\u5b83\u4e0d\u6b62\u4e00\u4e2a\u5730\u65b9\n        \/\/\u6ce8\u518c\u548c\u4fee\u6539\u662f\u4e00\u6a21\u4e00\u6837\u7684\u8def\u5f84\uff0c\u90a3\u4ed6\u5c31\u4e0d\u80fd\u518d\u901a\u8fc7\u8fd9\u79cd\u65b9\u5f0f\u53bb\u9a8c\u8bc1\u662f\u5426\u5b58\u5728\u4e86\n        if (!IGNORE_URI.contains(requestURI)) {\n            String username = httpServletRequest.getHeader(\"username\");\n            String token = httpServletRequest.getHeader(\"token\");\n            Object userInfoJsonStr = stringRedisTemplate.opsForHash().get(\"login_\" + username, token);\n            if (userInfoJsonStr != null) {\n                UserInfoDTO userInfoDTO = JSON.parseObject(userInfoJsonStr.toString(), UserInfoDTO.class);\n                UserContext.setUser(userInfoDTO);\n            }\n        }\n        try {\n            filterChain.doFilter(servletRequest, servletResponse);\n        } finally {\n            UserContext.removeUser();\n        }\n    }\n}<\/pre>\n\n\n\n<p>\u90a3\u5c31\u662f\u901a\u8fc7\u5b83\u7684\u8fd9\u4e2aHTTP\u7684method&nbsp;<\/p>\n\n\n\n<p>\u5982\u679c\u4e00\u81f4\u4e4b\u540e<\/p>\n\n\n\n<p>\u5ba2\u6237\u7aef\u7684\u5f02\u5e38\u662fA\u5f00\u5934\u7684\uff0cUserErrorCodeEnum.java\u52a0\u4e00\u53e5<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">USER_TOKEN_FAIL(\"A000200\",\"\u7528\u6237token\u9a8c\u8bc1\u5931\u8d25\"),\n<\/pre>\n\n\n\n<p>&nbsp;\u7136\u540e\u8fd9\u4e2a\u65f6\u5019\u6211\u4f1a\u8ddf\u524d\u7aef\u505a\u6210\u8fbe\u6210\u4e00\u4e2a\u6807\u8bc6\u5462\uff0c \u5982\u679c\u8bf4\u6211\u8fd4\u56de\u5230result\u91cc\u9762\u662f\u8fd9\u4e2a\u72b6\u6001\u7801\uff0c\u90a3\u4f60\u8ba9\u7528\u6237\u8df3\u5230\u767b\u5f55\u9875\u9762\u53bb<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">package com.nageoffer.shortlink.admin.common.biz.user;\n\nimport cn.hutool.core.util.StrUtil;\nimport com.alibaba.fastjson2.JSON;\n\nimport com.google.common.collect.Lists;\nimport com.nageoffer.shortlink.admin.common.convention.exception.ClientException;\nimport jakarta.servlet.Filter;\nimport jakarta.servlet.FilterChain;\nimport jakarta.servlet.ServletException;\nimport jakarta.servlet.ServletRequest;\nimport jakarta.servlet.ServletResponse;\nimport jakarta.servlet.http.HttpServletRequest;\nimport lombok.RequiredArgsConstructor;\nimport org.springframework.data.redis.core.StringRedisTemplate;\nimport org.springframework.util.StringUtils;\n\nimport java.io.IOException;\nimport java.net.URLDecoder;\nimport java.util.List;\nimport java.util.Objects;\n\nimport static com.nageoffer.shortlink.admin.common.enums.UserErrorCodeEnum.USER_TOKEN_FAIL;\nimport static java.nio.charset.StandardCharsets.UTF_8;\n\n\/**\n * \u7528\u6237\u4fe1\u606f\u4f20\u8f93\u8fc7\u6ee4\u5668\n *\/\n@RequiredArgsConstructor\npublic class UserTransmitFilter implements Filter {\n    private final StringRedisTemplate stringRedisTemplate;\n\n    private static final List&lt;String&gt; IGNORE_URI = Lists.newArrayList(\n            \"\/api\/short-Link\/admin\/v1\/user\/Login\",\n            \"\/api\/short-Link\/admin\/admin\/v1\/actual\/user\/has-user-name\"\n            \/*\n            \"\/api\/short-Link\/admin\/v1\/user\"\n            *\/\n    );\n\n    @Override\n    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {\n        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;\n        String requestURI = httpServletRequest.getRequestURI();\n        if (!IGNORE_URI.contains(requestURI)) {\n            String method = httpServletRequest.getMethod();\n            if (!(Objects.equals(requestURI, \"\/api\/short-Link\/admin\/v1\/user\") &amp;&amp; Objects.equals(method, \"POST\"))) {\n                String username = httpServletRequest.getHeader(\"username\");\n                String token = httpServletRequest.getHeader(\"token\");\n                if (!StrUtil.isAllNotBlank(username,token)) {\n                    throw new ClientException(USER_TOKEN_FAIL);\n                }\n                Object userInfoJsonStr = stringRedisTemplate.opsForHash().get(\"login_\" + username, token);\n                if (userInfoJsonStr != null) {\n                    UserInfoDTO userInfoDTO = JSON.parseObject(userInfoJsonStr.toString(), UserInfoDTO.class);\n                    UserContext.setUser(userInfoDTO);\n                }\n            }\/\/POST\u548c\u5730\u5740\u8fd9\u4e24\u4e2a\u90fd\u4e0d\u6ee1\u8db3\u8bc1\u660e\uff0c\u5b83\u9700\u8981\u53bb\u9a8c\u8bc1token\uff0c\u5982\u679c\u8bf4\u4f60\u9a8c\u8bc1TOKEN\u4e0d\u901a\u8fc7\u5bf9\u5427\n        }\n        try {\n            filterChain.doFilter(servletRequest, servletResponse);\n        } finally {\n            UserContext.removeUser();\n        }\n    }\n}<\/pre>\n\n\n\n<p>&nbsp;\u53ea\u662f\u5224\u65ad\u5b83\u4fe9\u662f\u5426\u6709\u503c\u8fd8\u4e0d\u884c,hai\u5f97\u53bb\u5224\u65ad\u4e00\u4e0b\u5b83\u662f\u5426\u5b58\u5728\u5728Redis\u91cc\u9762\uff0c\u5373token\u5b58\u50a8\u5668\u91cc\u9762\u662f\u5426\u5b58\u5728\uff1f\u4e3a\u4e86\u907f\u514dredis\u62a5\u9519\uff0c\u505a\u4e00\u6b21try catch<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Object userInfoJsonStr = null;\ntry {\n    userInfoJsonStr = stringRedisTemplate.opsForHash().get(\"login_\" + username, token);\n}catch (Exception ex){\n    throw new ClientException(USER_TOKEN_FAIL);\n}<\/pre>\n\n\n\n<p>\u7136\u540e\u5982\u679c\u8bf4\u6211\u4eec\u8fd9\u91cc\u5224\u65ad\u5b83\u662f\u5426\u7b49\u4e8enull\uff0c&nbsp;\u76f4\u63a5\u4e0b\u9762\u90a3\u4e9b\u5c31\u4e0d\u4f1a\u7b49\u4e8enull\u4e86<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">    @Override\n    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {\n        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;\n        String requestURI = httpServletRequest.getRequestURI();\n        if (!IGNORE_URI.contains(requestURI)) {\n            String method = httpServletRequest.getMethod();\n            if (!(Objects.equals(requestURI, \"\/api\/short-link\/admin\/v1\/user\") &amp;&amp; Objects.equals(method, \"POST\"))) {\n                String username = httpServletRequest.getHeader(\"username\");\n                String token = httpServletRequest.getHeader(\"token\");\n                if (!StrUtil.isAllNotBlank(username, token)) {\n                    throw new ClientException(USER_TOKEN_FAIL);\n                }\n                Object userInfoJsonStr = null;\n                try {\n                    userInfoJsonStr = stringRedisTemplate.opsForHash().get(\"login_\" + username, token);\n                    if (userInfoJsonStr == null) {\n                        throw new ClientException(USER_TOKEN_FAIL);\n                    }\n                } catch (Exception ex) {\n                    throw new ClientException(USER_TOKEN_FAIL);\n                }\n\n                UserInfoDTO userInfoDTO = JSON.parseObject(userInfoJsonStr.toString(), UserInfoDTO.class);\n                UserContext.setUser(userInfoDTO);\n            }\n        }\n        try {\n            filterChain.doFilter(servletRequest, servletResponse);\n        } finally {\n            UserContext.removeUser();\n        }\n    }\n}<\/pre>\n\n\n\n<p>&nbsp;\u5728apifox\u4e2d\u6d4b\u8bd5\u8f93\u5165\u4e00\u4e2a\u9519\u8bef\u7684token\uff0c\u8001\u5e08\u53d1\u73b0\u5168\u5c40\u5f02\u5e38\u5904\u7406\u6355\u83b7\u62e6\u622a\u5668\u62e6\u4e0d\u5230\u554a<\/p>\n\n\n\n<p>\u540e\u7eed\u62c6\u89e3\u5230\u7f51\u5173\u4e86\u5c31\u4e0d\u4f1a\u6709\u8fd9\u79cd\u95ee\u9898\u4e86\uff0c\u8fd9\u662f\u4e34\u65f6\u4ee3\u7801<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">package com.nageoffer.shortlink.admin.common.biz.user;\n\nimport cn.hutool.core.util.StrUtil;\nimport com.alibaba.fastjson2.JSON;\n\nimport com.google.common.collect.Lists;\nimport com.nageoffer.shortlink.admin.common.convention.exception.ClientException;\nimport com.nageoffer.shortlink.admin.common.convention.result.Results;\nimport com.nageoffer.shortlink.admin.common.enums.UserErrorCodeEnum;\nimport jakarta.servlet.Filter;\nimport jakarta.servlet.FilterChain;\nimport jakarta.servlet.ServletException;\nimport jakarta.servlet.ServletRequest;\nimport jakarta.servlet.ServletResponse;\nimport jakarta.servlet.http.HttpServletRequest;\nimport jakarta.servlet.http.HttpServletResponse;\nimport lombok.RequiredArgsConstructor;\nimport lombok.SneakyThrows;\nimport org.springframework.data.redis.core.StringRedisTemplate;\nimport org.springframework.util.StringUtils;\n\nimport java.io.IOException;\nimport java.io.PrintWriter;\nimport java.net.URLDecoder;\nimport java.util.List;\nimport java.util.Objects;\n\nimport static com.nageoffer.shortlink.admin.common.enums.UserErrorCodeEnum.USER_TOKEN_FAIL;\nimport static java.nio.charset.StandardCharsets.UTF_8;\n\n\/**\n * \u7528\u6237\u4fe1\u606f\u4f20\u8f93\u8fc7\u6ee4\u5668\n *\/\n@RequiredArgsConstructor\npublic class UserTransmitFilter implements Filter {\n    private final StringRedisTemplate stringRedisTemplate;\n\n    private static final List&lt;String&gt; IGNORE_URI = Lists.newArrayList(\n            \"\/api\/short-link\/admin\/v1\/user\/login\",\n            \"\/api\/short-link\/admin\/v1\/actual\/user\/has-user-name\"\n\n    );\n\n    @SneakyThrows\n    @Override\n    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {\n        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;\n        String requestURI = httpServletRequest.getRequestURI();\n        if (!IGNORE_URI.contains(requestURI)) {\n            String method = httpServletRequest.getMethod();\n            if (!(Objects.equals(requestURI, \"\/api\/short-link\/admin\/v1\/user\") &amp;&amp; Objects.equals(method, \"POST\"))) {\n                String username = httpServletRequest.getHeader(\"username\");\n                String token = httpServletRequest.getHeader(\"token\");\n                if (!StrUtil.isAllNotBlank(username, token)) {\n                    returnJson((HttpServletResponse) servletResponse, JSON.toJSONString(Results.failure(new ClientException(USER_TOKEN_FAIL))));\n                    return;\n                }\n                Object userInfoJsonStr;\n                try {\n                    userInfoJsonStr = stringRedisTemplate.opsForHash().get(\"login_\" + username, token);\n                    if (userInfoJsonStr == null) {\n                        throw new ClientException(USER_TOKEN_FAIL);\n                    }\n                } catch (Exception ex) {\n                    returnJson((HttpServletResponse) servletResponse, JSON.toJSONString(Results.failure(new ClientException(USER_TOKEN_FAIL))));\n                    return;\n                }\n\n                UserInfoDTO userInfoDTO = JSON.parseObject(userInfoJsonStr.toString(), UserInfoDTO.class);\n                UserContext.setUser(userInfoDTO);\n            }\n        }\n        try {\n            filterChain.doFilter(servletRequest, servletResponse);\n        } finally {\n            UserContext.removeUser();\n        }\n    }\n\n    private void returnJson(HttpServletResponse response, String json) throws Exception {\n        PrintWriter writer = null;\n        response.setCharacterEncoding(\"UTF-8\");\n        response.setContentType(\"text\/html; charset=utf-8\");\n        try {\n            writer = response.getWriter();\n            writer.print(json);\n        } catch (IOException e) {\n        } finally {\n            if (writer != null)\n                writer.close();\n        }\n    }\n}<\/pre>\n\n\n\n<p>\u8bd5\u4e00\u4e0b\uff0c\u4e4b\u524d\u6211\u4eec\u90fd\u662f\u5728\u7f51\u5173\u5c42\u9762\u53bb\u9a8c\u8ba9&nbsp;\uff0c\u81ea\u524d\u5148\u4ee5\u529f\u80fd\u4e3a\u5bfc\u5411\uff1b\u4e3a\u4e86\u7ed9\u5e94\u7528\u6253\u5305\uff0c\u5728admin\uff0cproject\u7684pom\u4e2d\u6dfb\u52a0\u4e00\u70b9\u4e1c\u897f\uff0c\u6ca1\u6709repackage\u7684\u8bdd\uff0c\u5b83\u6253\u51fa\u6765\u7684\u5305\u53ea\u662f\u4f60\u7684\u539f\u7801\u5305\uff0c\u91cc\u9762\u4e0d\u4f1a\u5305\u542b\u53ef\u76f4\u63a5\u542f\u52a8\u7684springboot<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">    &lt;\/dependencies&gt;\n    &lt;build&gt;\n        &lt;finalName&gt;${project.artifactId}&lt;\/finalName&gt;\n        &lt;plugins&gt;\n            &lt;plugin&gt;\n                &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n                &lt;artifactId&gt;spring-boot-maven-plugin&lt;\/artifactId&gt;\n                &lt;executions&gt;\n                    &lt;execution&gt;\n                        &lt;goals&gt;\n                            &lt;goal&gt;repackage&lt;\/goal&gt;\n                        &lt;\/goals&gt;\n                    &lt;\/execution&gt;\n                &lt;\/executions&gt;\n            &lt;\/plugin&gt;\n        &lt;\/plugins&gt;\n    &lt;\/build&gt;\n&lt;\/project&gt;<\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u9488\u5bf9\u4e8e\u5168\u5c40\u5f02\u5e38\u5904\u7406\u6355\u83b7\u4e0d\u5230filter\u5f02\u5e38\u7684\u95ee\u9898\uff0c\u7f51\u4e0a\u7684\u53e6\u4e00\u79cd\u89e3\u51b3\u65b9\u6848\u662f\u5b9a\u4e49\u4e00\u4e2a\u65b0\u7684filter\uff0c\u6355\u83b7\u51fa\u5f02\u5e38\u7684filter\uff0c\u7136\u540e\u624b\u52a8\u6307\u5b9a\u5904\u7406\u8be5\u8bf7\u6c42\u7684\u5904\u7406\u5668\uff0c\u8ba9\u4ed6\u5230\u8fbecontroller\u5c42\uff0c\u8fd9\u6837\u5c31\u80fd\u8ba9@ControllerAdvice\u6355\u83b7\u5230\u3002<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u521a\u5f00\u59cb\u5230\u62e6\u622a\u8fd9\u4e00\u5757\u5c31\u6709\u70b9\u7591\u60d1\uff0c\u4ee3\u7801\u5230\u8fd9\u4e00\u6b65\u6574\u4e2a\u7cfb\u7edf\u8fd8\u662f\u5355\u4f53\u9879\u76ee\u90a3\u4e3a\u4ec0\u4e48\u8981\u7528javaweb\u91cc\u7684Filter\u5462\uff0c\u76f4\u63a5\u7528SpringMVC\u91cc\u7684HandlerInterceptor \u4e0d\u5c31\u884c\u4e86\uff0c\u8fd8\u4e0eGlobalExceptionHandler \u9002\u914d&nbsp;<\/p>\n\n\n\n<p>\u5728\u5355\u4f53\u9879\u76ee\u4e2d\u4f7f\u7528 **Java Web Filter** \u800c\u975e **Spring MVC HandlerInterceptor** \u662f\u5426\u5408\u7406\uff0c\u9700\u7ed3\u5408\u5177\u4f53\u573a\u666f\u5206\u6790\uff1a<\/p>\n\n\n\n<p>---<\/p>\n\n\n\n<p>### **1. Filter \u4e0e HandlerInterceptor \u7684\u6838\u5fc3\u533a\u522b**<br>| **\u7279\u6027** &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| **Filter\uff08Servlet \u89c4\u8303\uff09** &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | **HandlerInterceptor\uff08Spring MVC\uff09** &nbsp; &nbsp; &nbsp; |<br>|-------------------------|-----------------------------------------------|-------------------------------------------|<br>| **\u4f5c\u7528\u5c42\u7ea7** &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| \u66f4\u5e95\u5c42\uff0c\u4f5c\u7528\u4e8e\u6240\u6709\u8bf7\u6c42\uff08\u5305\u62ec\u9759\u6001\u8d44\u6e90\u3001WebSocket\u7b49\uff09 | Spring MVC \u63a7\u5236\u5668\u7ea7\u522b\uff0c\u4ec5\u4f5c\u7528\u4e8e Controller \u65b9\u6cd5 |<br>| **\u4f9d\u8d56\u6ce8\u5165** &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| \u9700\u901a\u8fc7\u6784\u9020\u51fd\u6570\u6216 `@RequiredArgsConstructor` \u6ce8\u5165 Spring Bean\uff08\u9700\u914d\u7f6e FilterRegistrationBean\uff09 | \u652f\u6301 `@Autowired` \u76f4\u63a5\u6ce8\u5165 Spring Bean |<br>| **\u5f02\u5e38\u5904\u7406** &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| \u5f02\u5e38\u65e0\u6cd5\u88ab Spring `@ControllerAdvice` \u6355\u83b7\uff0c\u9700\u624b\u52a8\u5904\u7406 | \u5f02\u5e38\u53ef\u88ab Spring \u5168\u5c40\u5f02\u5e38\u5904\u7406\u5668\u6355\u83b7 |<br>| **\u6267\u884c\u65f6\u673a** &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| \u5728 Spring MVC \u521d\u59cb\u5316\u524d\u6267\u884c\uff08\u5982 DispatcherServlet \u4e4b\u524d\uff09 | \u5728 Controller \u65b9\u6cd5\u524d\u540e\u6267\u884c |<br>| **\u8def\u5f84\u5339\u914d\u7075\u6d3b\u6027** &nbsp; &nbsp; &nbsp;| \u9700\u786c\u7f16\u7801 URI \u5217\u8868\uff08\u5982 `IGNORE_URI.contains(requestURI)`\uff09 | \u652f\u6301 `AntPathMatcher` \u7b49\u52a8\u6001\u5339\u914d\u89c4\u5219 |<\/p>\n\n\n\n<p>---<\/p>\n\n\n\n<p>### **2. \u5f53\u524d\u4ee3\u7801\u4e2d\u4f7f\u7528 Filter \u7684\u5408\u7406\u6027\u5206\u6790**<br>#### **\u5f53\u524d\u5b9e\u73b0\u903b\u8f91**\uff1a<br>- **Filter \u529f\u80fd**\uff1a &nbsp;<br>&nbsp; - \u63d0\u53d6\u8bf7\u6c42\u5934\u4e2d\u7684 `username` \u548c `token`\uff0c\u4ece Redis \u83b7\u53d6\u7528\u6237\u4fe1\u606f\u5e76\u5b58\u5165 `ThreadLocal`\uff08\u7528\u6237\u4e0a\u4e0b\u6587\uff09\u3002 &nbsp;<br>&nbsp; - \u653e\u884c\u7279\u5b9a\u63a5\u53e3\uff08\u5982\u767b\u5f55\u3001\u6ce8\u518c\u3001\u7528\u6237\u540d\u68c0\u67e5\uff09\u3002 &nbsp;<br>&nbsp; - \u62e6\u622a\u672a\u767b\u5f55\u8bf7\u6c42\u5e76\u8fd4\u56de\u9519\u8bef\u7801\u3002 &nbsp;<br>- **\u5f02\u5e38\u5904\u7406**\uff1a &nbsp;<br>&nbsp; - \u6355\u83b7 Redis \u5f02\u5e38\u5e76\u624b\u52a8\u8fd4\u56de JSON \u9519\u8bef\u54cd\u5e94\uff08`returnJson(...)`\uff09\u3002 &nbsp;<\/p>\n\n\n\n<p>#### **\u5408\u7406\u6027\u5224\u65ad**\uff1a<br>- **\u4f18\u70b9**\uff1a &nbsp;<br>&nbsp; 1. **\u5168\u5c40\u6027**\uff1aFilter \u53ef\u62e6\u622a\u6240\u6709\u8bf7\u6c42\uff08\u5305\u62ec\u975e Controller \u7684\u8d44\u6e90\uff09\uff0c\u9002\u5408\u5904\u7406\u5168\u5c40\u4e0a\u4e0b\u6587\uff08\u5982\u7528\u6237\u8eab\u4efd\u3001\u65e5\u5fd7\u8bb0\u5f55\uff09\u3002 &nbsp;<br>&nbsp; 2. **\u4e0e\u7f51\u5173\u517c\u5bb9**\uff1a\u82e5\u672a\u6765\u62c6\u5206\u4e3a\u5fae\u670d\u52a1\u67b6\u6784\uff0cFilter \u7684\u8bbe\u8ba1\u53ef\u76f4\u63a5\u8fc1\u79fb\u81f3\u7f51\u5173\u5c42\uff0c\u4fdd\u6301\u903b\u8f91\u4e00\u81f4\u6027\u3002 &nbsp;<br>- **\u7f3a\u70b9**\uff1a &nbsp;<br>&nbsp; 1. **\u5f02\u5e38\u5904\u7406\u590d\u6742**\uff1aFilter \u4e2d\u7684\u5f02\u5e38\u65e0\u6cd5\u88ab Spring \u7684 `@ControllerAdvice` \u6355\u83b7\uff0c\u9700\u624b\u52a8\u8fd4\u56de\u54cd\u5e94\uff08\u5982 `returnJson(...)`\uff09\u3002 &nbsp;<br>&nbsp; 2. **\u8def\u5f84\u5339\u914d\u7e41\u7410**\uff1a\u786c\u7f16\u7801 `IGNORE_URI` \u5217\u8868\uff0c\u7ef4\u62a4\u6210\u672c\u9ad8\uff08\u5982 RESTful \u63a5\u53e3 `\/api\/short-Link\/admin\/v1\/user` \u7684 POST \u9700\u7279\u6b8a\u5904\u7406\uff09\u3002 &nbsp;<br>&nbsp; 3. **\u4e0e Spring \u96c6\u6210\u5ea6\u4f4e**\uff1a\u9700\u663e\u5f0f\u901a\u8fc7\u6784\u9020\u51fd\u6570\u6ce8\u5165 Bean\uff08\u5982 `StringRedisTemplate`\uff09\uff0c\u4e0d\u5982 HandlerInterceptor \u76f4\u63a5\u4f7f\u7528 `@Autowired` \u7b80\u6d01\u3002 &nbsp;<\/p>\n\n\n\n<p>---<\/p>\n\n\n\n<p>### **3. \u6539\u7528 HandlerInterceptor \u7684\u53ef\u884c\u6027**<br>#### **\u6539\u8fdb\u6b65\u9aa4**\uff1a<br>1. **\u5b9a\u4e49 Interceptor**\uff1a &nbsp;<br>&nbsp; &nbsp;```java<br>&nbsp; &nbsp;@Component<br>&nbsp; &nbsp;public class UserContextInterceptor implements HandlerInterceptor {<br>&nbsp; &nbsp; &nbsp; &nbsp;@Autowired<br>&nbsp; &nbsp; &nbsp; &nbsp;private StringRedisTemplate stringRedisTemplate;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp;private static final List&lt;String&gt; IGNORE_PATHS = Arrays.asList(<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\"\/api\/short-link\/admin\/v1\/user\/login\",<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\"\/api\/short-link\/admin\/v1\/user\/has-username\"<br>&nbsp; &nbsp; &nbsp; &nbsp;);<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp;@Override<br>&nbsp; &nbsp; &nbsp; &nbsp;public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;String requestURI = request.getRequestURI();<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (isIgnorePath(requestURI, request.getMethod())) {<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return true; \/\/ \u653e\u884c\u6307\u5b9a\u8def\u5f84<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;String username = request.getHeader(\"username\");<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;String token = request.getHeader(\"token\");<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (!StringUtils.hasText(username) || !StringUtils.hasText(token)) {<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;throw new ClientException(USER_TOKEN_FAIL);<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Object userInfoJsonStr = stringRedisTemplate.opsForHash().get(\"login_\" + username, token);<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (userInfoJsonStr == null) {<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;throw new ClientException(USER_TOKEN_FAIL);<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;UserInfoDTO userInfoDTO = JSON.parseObject(userInfoJsonStr.toString(), UserInfoDTO.class);<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;UserContext.setUser(userInfoDTO);<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return true;<br>&nbsp; &nbsp; &nbsp; &nbsp;}<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp;@Override<br>&nbsp; &nbsp; &nbsp; &nbsp;public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;UserContext.removeUser();<br>&nbsp; &nbsp; &nbsp; &nbsp;}<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp;private boolean isIgnorePath(String uri, String method) {<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\/\/ \u4f7f\u7528 AntPathMatcher \u4f18\u5316\u8def\u5f84\u5339\u914d<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;AntPathMatcher pathMatcher = new AntPathMatcher();<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return IGNORE_PATHS.stream().anyMatch(pattern -&gt; pathMatcher.match(pattern, uri));<br>&nbsp; &nbsp; &nbsp; &nbsp;}<br>&nbsp; &nbsp;}<br>&nbsp; &nbsp;```<\/p>\n\n\n\n<p>2. **\u6ce8\u518c Interceptor**\uff1a &nbsp;<br>&nbsp; &nbsp;```java<br>&nbsp; &nbsp;@Configuration<br>&nbsp; &nbsp;public class WebConfig implements WebMvcConfigurer {<br>&nbsp; &nbsp; &nbsp; &nbsp;@Autowired<br>&nbsp; &nbsp; &nbsp; &nbsp;private UserContextInterceptor userContextInterceptor;<\/p>\n\n\n\n<p>&nbsp; &nbsp; &nbsp; &nbsp;@Override<br>&nbsp; &nbsp; &nbsp; &nbsp;public void addInterceptors(InterceptorRegistry registry) {<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;registry.addInterceptor(userContextInterceptor)<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.addPathPatterns(\"\/**\")<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.excludePathPatterns(\"\/api\/short-link\/admin\/v1\/user\/login\", \"\/api\/short-link\/admin\/v1\/user\/has-username\");<br>&nbsp; &nbsp; &nbsp; &nbsp;}<br>&nbsp; &nbsp;}<br>&nbsp; &nbsp;```<\/p>\n\n\n\n<p>3. **\u5f02\u5e38\u5904\u7406\u4f18\u5316**\uff1a &nbsp;<br>&nbsp; &nbsp;```java<br>&nbsp; &nbsp;@ControllerAdvice<br>&nbsp; &nbsp;public class GlobalExceptionHandler {<br>&nbsp; &nbsp; &nbsp; &nbsp;@ExceptionHandler(ClientException.class)<br>&nbsp; &nbsp; &nbsp; &nbsp;public Result&lt;?&gt; handleClientException(ClientException ex) {<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return Results.failure(ex);<br>&nbsp; &nbsp; &nbsp; &nbsp;}<br>&nbsp; &nbsp;}<br>&nbsp; &nbsp;```<\/p>\n\n\n\n<p>#### **\u4f18\u52bf**\uff1a<br>- **\u4e0e Spring \u6df1\u5ea6\u96c6\u6210**\uff1a &nbsp;<br>&nbsp; - \u53ef\u76f4\u63a5\u4f7f\u7528 `@Autowired` \u6ce8\u5165 Bean\uff0c\u65e0\u9700\u6784\u9020\u51fd\u6570\u4f20\u53c2\u3002 &nbsp;<br>&nbsp; - \u5f02\u5e38\u53ef\u88ab `@ControllerAdvice` \u7edf\u4e00\u6355\u83b7\uff0c\u907f\u514d\u624b\u52a8\u8fd4\u56de JSON \u54cd\u5e94\u3002 &nbsp;<br>- **\u8def\u5f84\u5339\u914d\u66f4\u7075\u6d3b**\uff1a &nbsp;<br>&nbsp; - \u652f\u6301 `AntPathMatcher`\uff0c\u65e0\u9700\u786c\u7f16\u7801\u8def\u5f84\uff08\u5982 RESTful \u63a5\u53e3\u5339\u914d `\/api\/short-link\/admin\/v1\/user\/**`\uff09\u3002 &nbsp;<br>- **\u4ee3\u7801\u7b80\u6d01\u6027**\uff1a &nbsp;<br>&nbsp; - \u65e0\u9700\u663e\u5f0f\u5904\u7406 `try-catch` \u548c `finally`\uff0c\u7531 Spring \u7ba1\u7406\u751f\u547d\u5468\u671f\u3002 &nbsp;<\/p>\n\n\n\n<p>---<\/p>\n\n\n\n<p>### **4. \u4e3a\u4f55\u539f\u4ee3\u7801\u4f7f\u7528 Filter\uff1f**<br>\u53ef\u80fd\u539f\u56e0\uff1a &nbsp;<br>1. **\u5386\u53f2\u9057\u7559\u6216\u7f51\u5173\u8fc1\u79fb\u51c6\u5907**\uff1a &nbsp;<br>&nbsp; &nbsp;- \u82e5\u672a\u6765\u8ba1\u5212\u5c06\u62e6\u622a\u903b\u8f91\u8fc1\u79fb\u81f3\u7f51\u5173\uff08\u5982 Spring Cloud Gateway\uff09\uff0cFilter \u8bbe\u8ba1\u53ef\u65e0\u7f1d\u8fc1\u79fb\u3002 &nbsp;<br>2. **\u5168\u5c40\u6027\u9700\u6c42**\uff1a &nbsp;<br>&nbsp; &nbsp;- \u82e5\u9700\u62e6\u622a\u975e Spring MVC \u7684\u8d44\u6e90\uff08\u5982 WebSocket\u3001\u9759\u6001\u6587\u4ef6\uff09\uff0cFilter \u662f\u552f\u4e00\u9009\u62e9\u3002 &nbsp;<br>3. **\u56e2\u961f\u4e60\u60ef**\uff1a &nbsp;<br>&nbsp; &nbsp;- \u5f00\u53d1\u8005\u53ef\u80fd\u66f4\u719f\u6089 Filter \u7684\u4f20\u7edf\u6a21\u5f0f\uff0c\u4f46\u5b9e\u9645\u5728\u5355\u4f53\u9879\u76ee\u4e2d\u5e76\u975e\u6700\u4f73\u5b9e\u8df5\u3002<\/p>\n\n\n\n<p>---<\/p>\n\n\n\n<p>### **5. \u7ed3\u8bba\u4e0e\u5efa\u8bae**<br>#### **\u5224\u65ad\u6b63\u786e\u6027**\uff1a<br>- **\u7528\u6237\u8d28\u7591\u5408\u7406**\uff1a\u5728\u5355\u4f53\u9879\u76ee\u4e2d\uff0c**\u4f18\u5148\u63a8\u8350\u4f7f\u7528 HandlerInterceptor**\uff0c\u56e0\u5176\u4e0e Spring MVC \u96c6\u6210\u66f4\u7d27\u5bc6\uff0c\u5f02\u5e38\u5904\u7406\u66f4\u4f18\u96c5\u3002 &nbsp;<br>- **Filter \u7684\u9002\u7528\u573a\u666f**\uff1a &nbsp;<br>&nbsp; - \u9700\u62e6\u622a\u975e Spring MVC \u7684\u8d44\u6e90\uff08\u5982 `\/ws\/**` WebSocket\uff09\u3002 &nbsp;<br>&nbsp; - \u672a\u6765\u8ba1\u5212\u62c6\u5206\u7f51\u5173\u65f6\uff0c\u63d0\u524d\u7edf\u4e00\u8bbe\u8ba1\u3002 &nbsp;<\/p>\n\n\n\n<p>#### **\u6539\u8fdb\u5efa\u8bae**\uff1a<br>1. **\u66ff\u6362\u4e3a HandlerInterceptor**\uff1a &nbsp;<br>&nbsp; &nbsp;- \u4f7f\u7528 `@Component` \u548c `WebMvcConfigurer` \u6ce8\u518c\u62e6\u622a\u5668\u3002 &nbsp;<br>&nbsp; &nbsp;- \u5229\u7528 `AntPathMatcher` \u52a8\u6001\u5339\u914d\u8def\u5f84\uff08\u5982\u6392\u9664 `\/api\/short-link\/admin\/v1\/user` \u7684 POST \u8bf7\u6c42\uff09\u3002 &nbsp;<br>2. **\u7edf\u4e00\u5f02\u5e38\u5904\u7406**\uff1a &nbsp;<br>&nbsp; &nbsp;- \u79fb\u9664 Filter \u4e2d\u7684 `try-catch` \u548c `returnJson(...)`\uff0c\u901a\u8fc7 `@ControllerAdvice` \u7edf\u4e00\u5904\u7406 `ClientException`\u3002 &nbsp;<br>3. **\u4f18\u5316\u8def\u5f84\u5339\u914d**\uff1a &nbsp;<br>&nbsp; &nbsp;- \u907f\u514d\u786c\u7f16\u7801 `IGNORE_URI`\uff0c\u6539\u7528 `excludePathPatterns(...)` \u6216 `AntPathMatcher` \u52a8\u6001\u5339\u914d\u3002 &nbsp;<br>4. **\u4f9d\u8d56\u6ce8\u5165\u7b80\u5316**\uff1a &nbsp;<br>&nbsp; &nbsp;- \u901a\u8fc7 `@RequiredArgsConstructor` \u6216 `@Autowired` \u6ce8\u5165 `StringRedisTemplate`\uff0c\u65e0\u9700\u6784\u9020\u51fd\u6570\u4f20\u9012\u3002 &nbsp;<\/p>\n\n\n\n<p>#### **\u6700\u7ec8\u7ed3\u8bba**\uff1a<br>- **\u5355\u4f53\u9879\u76ee\u4e2d\u4f7f\u7528 HandlerInterceptor \u66f4\u4f18**\uff1a &nbsp;<br>&nbsp; - \u4e0e Spring MVC \u96c6\u6210\u5ea6\u9ad8\uff0c\u5f02\u5e38\u5904\u7406\u66f4\u4f18\u96c5\u3002 &nbsp;<br>&nbsp; - \u8def\u5f84\u5339\u914d\u66f4\u7075\u6d3b\uff0c\u7ef4\u62a4\u6210\u672c\u66f4\u4f4e\u3002 &nbsp;<br>- **Filter \u9002\u7528\u4e8e\u5168\u5c40\u6027\u6216\u7f51\u5173\u573a\u666f**\uff1a &nbsp;<br>&nbsp; - \u82e5\u9700\u62e6\u622a\u975e Controller \u8bf7\u6c42\u6216\u8ba1\u5212\u62c6\u5206\u7f51\u5173\uff0cFilter \u662f\u5408\u7406\u9009\u62e9\u3002 &nbsp;<\/p>\n\n\n\n<p>**\u5efa\u8bae**\uff1a\u5f53\u524d\u5355\u4f53\u9879\u76ee\u5e94\u4f18\u5148\u4f7f\u7528 HandlerInterceptor\uff0c\u51cf\u5c11\u4e0e Spring \u7684\u8026\u5408\uff0c\u63d0\u5347\u4ee3\u7801\u53ef\u7ef4\u62a4\u6027\u3002<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">\u7b2c09\u8282\uff1a\u5206\u9875\u67e5\u8be2\u77ed\u94fe\u63a5\u5217\u8868<\/h2>\n\n\n\n<p>&nbsp;\u5206\u8868\u7684\u6570\u91cf\u4e00\u822c\u662f\u591a\u5c11\uff1f\u662f\u8981\u548c\u8981\u6839\u636e\u4e1a\u52a1\u53bb\u8bc4\u4f30\u7684\uff0c\u4e3b\u8981\u662f\u5206\u4e24\u4e2a\u70b9\uff1a\u90a3\u5c31\u662f\u4f60\u4e1a\u52a1\u7684\u4e00\u4e2a\u73b0\u6709\u6570\u636e\u91cf\u4ee5\u53ca\u4f60\u4e1a\u52a1\u7684\u4e00\u4e2a\u589e\u957f\u91cf<br>\u6bd4\u5982\u8bf4\u4f60\u9884\u4f30\u73b0\u6709\u8868\u5047\u5982\u8bf4\u6709\u4e00\u4e2a\u4ebf\u7684\u6570\u636e\uff0c\u4f46\u662f\u4f60\u6bcf\u6708\u5bf9\u5427\uff0c\u5b83\u7684\u6570\u636e\u589e\u957f\u5927\u6982\u662f\u5728500\u4e07\uff0c\u4f60\u5c31\u8981\u5145\u5206\u8003\u8651\u5230\u8fd9\u4e00\u4e2a\u4ebf\u7684\u5386\u53f2\u7684\u6570\u636e\uff0c\u4ee5\u53ca\u4f60\u6bcf\u6708500\u4e07\u7684\u589e\u957f\u6570\u636e\uff0c\u7136\u540e\u8fd9\u4e2a\u65f6\u5019\u4f60\u8981\u53bb\u8bc4\u4f30\u51fa\u4e00\u4e2a\u5c31\u662f\u4f60\u6bcf\u5f20\u8868\u5927\u6982\u6700\u5927\u7684\u6570\u636e\u91cf\uff0c\u6bd4\u5982\u8bf4\u6211\u9884\u4f30T-link-0\uff0c\u5b83\u7684\u6574\u4f53\u7684\u5c31\u662f\u5355\u5f20\u88682,000\u4e07\u6570\u636e\u6027\u80fd\u7ef0\u7ef0\u6709\u4f59\uff0c\u5bf9\u5427\uff1f\u6211\u5c31\u53ef\u4ee5\u6309\u7167\u8fd9\u79cd\u65b9\u5f0f\u53bb\u8bc4\u4f30\u3002\u7136\u540e\u5177\u4f53\u7684\u8bdd\u6211\u4f1a\u5199\u4e00\u5f20\u6587\u6863\u91cc\u9762\u53bb\u7ed9\u5927\u5bb6\u53bb\u8bb2\uff0c\u660e\u5230\u65f6\u5019\u5927\u5bb6\u53bb\u770b\u6211\u4eec\u77ed\u94fe\u63a5\u7684\u6587\u6863\u91cc\u9762\u5c31\u53ef\u4ee5\u4e86\uff0c\u7136\u540e\u8bb2\u7684\u8bdd\u6211\u4eec\u8fd8\u662f\u6309\u7167\u9ed8\u8ba416\u5f20\u8868\u8fd9\u6837\u521b\u5efa\u5f62\u6210\u4e00\u79cd\u89c4\u8303\uff0c\u8fd9\u91cc\u9762\u6709\u4e2a\u975e\u5e38\u91cd\u8981\u7684\u70b9\uff0c\u5b83\u8fd9\u4e2a\u8868\u53ef\u4ee5\u591a\uff0c\u6bcf\u5f20\u8868\u7684\u6570\u636e\u53ef\u4ee5\u5c11\uff0c\u4f46\u662f\u5343\u4e07\u4e0d\u8981\u4e00\u5f00\u59cb\u8bbe\u8ba1\u7684\u5f88\u5c11\uff0c\u56e0\u4e3a\u7b49\u4f60\u8bbe\u8ba1\u7684\u7b49\u4f60\u7684\u8868\u591a\u4e86\u4e4b\u540e\uff0c\u4f60\u8981\u518d\u7ed9\u4ed6\u8fdb\u884c\u6269\u5bb9\uff0c\u90a3\u5c31\u662f\u5728\u9ad8\u901f\u4e0a\u6362\u8f66\u80ce\uff0c\u975e\u5e38\u7684\u4e0d\u63a8\u8350\u3002<\/p>\n\n\n\n<p>\u5728\u6570\u636e\u5e93\u4e2d\u521b\u5efa\u65b0\u5b57\u6bb5\u7684favicon \uff0c\u5728gid\u540e\u9762\u6dfb\u52a0`favicon` varchar(256) DEFAULT NULL COMMENT '\u7f51\u7ad9\u56fe\u6807',<\/p>\n\n\n\n<p>\u53f3\u952enavicat\u7684\u8868\uff0c\u8bbe\u8ba1\u8868\uff0c\u5373\u53ef\u4fee\u6539\uff0c\u7136\u540e\u91cd\u65b0\u5f0416\u4e2a\u8868<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">package com.nageoffer.shortlink.admin.test;\n\n\/**\n *  \u505a\u4e00\u4e2a\u5206\u7247\u7684\u5904\u7406\uff0c\u6211\u4eec\u5148\u5206\u5341\u516d\u4e2a\u7247\u554a\n *\/\npublic class UserTableShardingTest {\n\n    public static final String SQL = \"CREATE TABLE `t_link_%d` (\\n\" +\n            \"  `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ID',\\n\" +\n            \"  `domain` varchar(128) DEFAULT NULL COMMENT '\u57df\u540d',\\n\" +\n            \"  `short_uri` varchar(8) DEFAULT NULL COMMENT '\u77ed\u94fe\u63a5',\\n\" +\n            \"  `full_short_url` varchar(128) DEFAULT NULL COMMENT '\u5b8c\u6574\u77ed\u94fe\u63a5',\\n\" +\n            \"  `origin_url` varchar(1024) DEFAULT NULL COMMENT '\u539f\u59cb\u94fe\u63a5',\\n\" +\n            \"  `click_num` int DEFAULT '0' COMMENT '\u70b9\u51fb\u91cf',\\n\" +\n            \"  `gid` varchar(32) DEFAULT NULL COMMENT '\u5206\u7ec4\u6807\u8bc6',\\n\" +\n            \"  `favicon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '\u7f51\u7ad9\u56fe\u6807',\\n\" +\n            \"  `enable_status` tinyint(1) DEFAULT NULL COMMENT '\u542f\u7528\u6807\u8bc6 1\uff1a\u672a\u542f\u7528 0\uff1a\u5df2\u542f\u7528',\\n\" +\n            \"  `created_type` tinyint(1) DEFAULT NULL COMMENT '\u521b\u5efa\u7c7b\u578b 0\uff1a\u63a7\u5236\u53f0 1\uff1a\u63a5\u53e3',\\n\" +\n            \"  `valid_date_type` tinyint(1) DEFAULT NULL COMMENT '\u6709\u6548\u671f\u7c7b\u578b 0\uff1a\u6c38\u4e45\u6709\u6548 1\uff1a\u7528\u6237\u81ea\u5b9a\u4e49',\\n\" +\n            \"  `valid_date` datetime DEFAULT NULL COMMENT '\u6709\u6548\u671f',\\n\" +\n            \"  `describe` varchar(1024) DEFAULT NULL COMMENT '\u63cf\u8ff0',\\n\" +\n            \"  `create_time` datetime DEFAULT NULL COMMENT '\u521b\u5efa\u65f6\u95f4',\\n\" +\n            \"  `update_time` datetime DEFAULT NULL COMMENT '\u4fee\u6539\u65f6\u95f4',\\n\" +\n            \"  `del_flag` tinyint(1) DEFAULT NULL COMMENT '\u5220\u9664\u6807\u8bc6 0\uff1a\u672a\u5220\u9664 1\uff1a\u5df2\u5220\u9664',\\n\" +\n            \"  PRIMARY KEY (`id`),\\n\" +\n            \"  UNIQUE KEY `idx_unique_full_short_url` (`full_short_url`) USING BTREE\\n\" +\n            \") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;\";\n\n    public static void main(String[] args) {\n        for (int i = 0; i &lt; 16; i++) {\n            System.out.printf((SQL) + \"%n\", i);\n        }\n    }\n}<\/pre>\n\n\n\n<p>\u5f00\u53d1\u6211\u4eec\u7684\u77ed\u94fe\u63a5\u8fd9\u4e2a\u5206\u9875\u529f\u80fd&nbsp;\uff0c\u73b0\u5728\u662fMybatisPlus\u4e86<\/p>\n\n\n\n<p>ShortLinkDO\u52a0\u4e00\u4e2a\u5b57\u6bb5<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\/**\n * \u7f51\u7ad9\u6807\u8bc6\n *\/\nprivate String favicon;<\/pre>\n\n\n\n<p>\u9762\u5148\u9884\u7559\u51fa\u6765\u4e00\u4e0b&nbsp;\uff0c\u76f8\u5f53\u4e8e\u6211\u4eec\u6709\u4e2a\u90a3\u79cd\u76d1\u63a7\u5b57\u6bb5\uff0c\u6211\u4eec\u5148\u6211\u4eec\u5148\u4e0d\u7ed9\u4ed6\u8d4b\u503c<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">package com.nageoffer.shortlink.project.dto.req;\n\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport lombok.Data;\n\n\/**\n * \u77ed\u94fe\u63a5\u5206\u9875\u8bf7\u6c42\u53c2\u6570\n *\/\n@Data\npublic class ShortLinkPageReqDTO extends Page&lt;ShortLinkDO&gt; {\n    \/**\n     * \u5206\u7ec4\u6807\u8bc6\n     *\/\n    private String gid;\n}\n<\/pre>\n\n\n\n<p>&nbsp;dto\u91cc\u9762\u7684req\u548cresp\u4e2d\u5206\u522b\u5199<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">package com.nageoffer.shortlink.project.dto.resp;\n\nimport lombok.Data;\n\nimport java.util.Date;\n\n\/**\n * \u77ed\u94fe\u63a5\u5206\u9875\u8fd4\u56de\u53c2\u6570\n *\/\n@Data\npublic class ShortLinkPageRespDTO {\n    \/**\n     * id\n     *\/\n    private Long id;\n    \/**\n     * \u57df\u540d\n     *\/\n    private String domain;\n    \/**\n     * \u77ed\u94fe\u63a5\n     *\/\n    private String shortUri;\n    \/**\n     * \u5b8c\u6574\u77ed\u94fe\u63a5\n     *\/\n    private String fullShortUrl;\n    \/**\n      *\u539f\u59cb\u94fe\u63a5\n     *\/\n    private String originUrl;\n    \/**\n     * \u5206\u7ec4\u6807\u8bc6\n     *\/\n    private String gid;\n    \/**\n     * \u6709\u6548\u671f\n     *\/\n    private Date validDate;\n    \/**\n     * \u63cf\u8ff0\n     *\/\n    private String describe;\n    \/**\n     * \u7f51\u7ad9\u6807\u8bc6\n     *\/\n    private String favicon;\n\n}\n<\/pre>\n\n\n\n<p>&nbsp;\u5728controller\u548cservice\u4e2d\u521b\u5efa\u76f8\u5173\u4ee3\u7801<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\/**\n * \u5206\u9875\u67e5\u8be2\u77ed\u94fe\u63a5\n *\/\n@GetMapping(\"\/api\/short-link\/v1\/page\")\npublic Result&lt;IPage&lt;ShortLinkPageRespDTO&gt;&gt; pageShortLink(ShortLinkPageReqDTO requestParam) {\n       return Results.success(shortLinkService.pageShortLink(requestParam));\n}<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">\/**\n * \u5206\u9875\u67e5\u8be2\u77ed\u94fe\u63a5\n * @param requestParam \u8bf7\u6c42\u53c2\u6570\n * @return \u5206\u7c7b\u8fd4\u56de\u7ed3\u679c\n *\/\nIPage&lt;ShortLinkPageRespDTO&gt; pageShortLink(ShortLinkPageReqDTO requestParam);<\/pre>\n\n\n\n<p>&nbsp;impl\u5982\u4e0b<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">@Override\npublic IPage&lt;ShortLinkPageRespDTO&gt; pageShortLink(ShortLinkPageReqDTO requestParam) {\n    LambdaQueryWrapper&lt;ShortLinkDO&gt; queryWrapper = Wrappers.lambdaQuery(ShortLinkDO.class)\n            .eq(ShortLinkDO::getGid, requestParam.getGid())\n            .eq(ShortLinkDO::getEnableStatus, 0)\n            .eq(ShortLinkDO::getDelFlag, 0)\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.orderByDesc(ShortLinkDO::getCreateTime);\n    IPage&lt;ShortLinkDO&gt; resultPage = baseMapper.selectPage(requestParam, queryWrapper);\n    return resultPage.convert(each -&gt; BeanUtil.toBean(each, ShortLinkPageRespDTO.class));\n}<\/pre>\n\n\n\n<p>\u5728config\u4e2d\u521b\u5efa&nbsp;DataBaseConfiguration<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">package com.nageoffer.shortlink.project.config;\n\nimport com.baomidou.mybatisplus.annotation.DbType;\nimport com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;\nimport com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n@Configuration\npublic class DataBaseConfiguration {\n    \/**\n     * \u5206\u9875\u63d2\u4ef6\n     *\/\n    @Bean\n    public MybatisPlusInterceptor mybatisPlusInterceptor() {\n        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();\n        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));\n        return interceptor;\n    }\n}\n<\/pre>\n\n\n\n<p>\u540c\u6837\u7684\u5728admin\u4e2d\u521b\u5efa\u4e0a\u9762\u90a3\u4e2a\u6587\u4ef6<\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" height=\"923\" width=\"743\" src=\"https:\/\/i-blog.csdnimg.cn\/direct\/53c060ff9eb641bbbe59e0025f7f6076.png\" alt=\"\"><img loading=\"lazy\" decoding=\"async\" height=\"1174\" width=\"1130\" src=\"https:\/\/i-blog.csdnimg.cn\/direct\/4895cc62cbba470ba1b26ac73578dd39.png\" alt=\"\"><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n    \"code\": \"0\",\n    \"message\": null,\n    \"data\": {\n        \"records\": &#91;\n            {\n                \"id\": 1926975245760077826,\n                \"domain\": \"http:\/\/eve2333.com\",\n                \"shortUri\": \"3TajjG\",\n                \"fullShortUrl\": \"http:\/\/eve2333.com\/3TajjG\",\n                \"originalUrl\": null,\n                \"gid\": \"14\",\n                \"validDate\": null,\n                \"describe\": \"\u554a\u7c73\u6d74\u8bf4\u7684\u9053\u7406ccb\",\n                \"favicon\": null\n            },\n            {\n                \"id\": 1926972819892105218,\n                \"domain\": \"http:\/\/eve2333.com\",\n                \"shortUri\": \"QqQ0b\",\n                \"fullShortUrl\": \"http:\/\/eve2333.com\/QqQ0b\",\n                \"originalUrl\": null,\n                \"gid\": \"14\",\n                \"validDate\": null,\n                \"describe\": \"\u554a\u7c73\u6d74\u8bf4\u7684\u9053\u7406ccb\",\n                \"favicon\": null\n            }\n        ],\n        \"total\": 2,\n        \"size\": 10,\n        \"current\": 1,\n        \"orders\": &#91;],\n        \"optimizeCountSql\": true,\n        \"searchCount\": true,\n        \"maxLimit\": null,\n        \"countId\": null,\n        \"gid\": \"14\",\n        \"pages\": 1\n    },\n    \"requestId\": null,\n    \"success\": true\n}<\/code><\/pre>\n\n\n\n<p>\u591a\u4f59\u7684\u53c2\u6570 \u662f\u548c\u540e\u9762\u7f51\u5173\u7528\u7684\uff0c\u73b0\u5728\u5148\u8fd9\u4e48\u7528\u7740&nbsp;<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>&nbsp;\u4e4b\u524d\u5728\u77ed\u94fe\u63a5\u5206\u7ec4\u8868\u4e2d\uff0cgid\u548cusername\u4e00\u8d77\u4f5c\u4e3a\u552f\u4e00\u7d22\u5f15\uff0c\u800c\u8fd9\u91cc\u77ed\u94fe\u63a5\u8868\u91cc\u53ea\u6709gid\uff0c\u6ca1\u6709username\uff0c\u56e0\u6b64\u53ef\u80fd\u67e5\u5230\u5176\u4ed6\u7528\u6237\u7684\u77ed\u94fe\u63a5\uff0c\u5efa\u8bae\u628agid\u8bbe\u7f6e\u4e3a\u5168\u5c40\u552f\u4e00\uff0c\u56e0\u4e3a6\u4f4d\u7684gid\uff0c\u6bcf\u4f4d62\u79cd\u5b57\u7b26\uff0c580\u591a\u4ebf\uff0c\u5b8c\u5168\u8db3\u591f\u4e86<\/p>\n\n\n\n<p>\u5176\u5b9e\u4e0d\u4f1a\u7684\uff0c\u56e0\u4e3a\u524d\u9762\u65b0\u589e\u5206\u7ec4\u7684\u5224\u65ad\u903b\u8f91\u662f\u67e5\u8be2group\u8868\u4e2d\u662f\u5426\u6709\u91cd\u590dgid\u3002 \u5e94\u8be5\u589e\u52a0\u6821\u9a8c\uff0c\u9a8c\u8bc1\u7528\u6237\u8eab\u4efd\uff0c\u9632\u6b62\u7528\u6237\u7be1\u6539\u8bf7\u6c42\u53c2\u6570\u4e2d\u7684gid\u76f4\u63a5\u67e5\u5230\u5176\u4ed6\u7528\u6237\u7684\u5206\u7ec4\u4e0b\u7684\u94fe\u63a5\u3002link\u8868\u5e94\u8be5\u4e5f\u53ef\u4ee5\u52a0\u4e0ausername\u5b57\u6bb5\uff0c\u67e5\u7684\u65f6\u5019\u9700\u8981\u8fd9\u4e24\u4e2a\u6761\u4ef6\u5c31\u884c\u3002<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">\u7b2c10\u8282\uff1a\u540e\u7ba1\u8054\u8c03\u4e2d\u53f0\u77ed\u94fe\u63a5\u63a5\u53e3<\/h2>\n\n\n\n<p>\u00a0<img loading=\"lazy\" decoding=\"async\" height=\"217\" width=\"662\" src=\"https:\/\/i-blog.csdnimg.cn\/direct\/76a3a6171ae54c37bf94b195c232acc5.png\" alt=\"\"><\/p>\n\n\n\n<p>\u8bf7\u6c42\u5230\u6211\u4eec\u7684\u524d\u7aef\u63a7\u5236\u53f0\uff0c\u7136\u540e\u524d\u7aef\u63a7\u5236\u53f0\u73b0\u5728\u662f\u8bbf\u95ee\u4ec0\u4e48\uff1f\u8bbf\u95ee\u524d\u7aef\u63a7\u5236\u53f0\u91cc\u9762\u8bbf\u95ee\u7684\u662f\u540e\u7ba1\u3002\u6211\u4eec\u5148\u6765\u770b\u4e00\u4e0b\u6211\u4eec\u7684\u4ee3\u7801\u662f\u5199\u5728project\u91cc\u9762\uff0c\u8fd9\u8fb9\u8d27\u6b3e\u5728\u8fd9\u91cc\u3002\u5982\u679c\u8bf4\u8fd9\u6837\u7684\u8bdd\u5c31\u53d8\u6210\u6f14\u53d8\u6210\u4e86\u4ec0\u4e48\uff1f\u524d\u7aef\u8fd8\u7ed9\u4ed6\u5206\u51fa\u6765\u4e00\u4e2a\u53bb\u8bf7\u6c42\u6211\u4eec\u7684\u77ed\u94fe\u63a5\u4e2d\u5fc3\uff0c\u5176\u5b9e\u8fd9\u79cd\u4e8b\u80fd\u4e0d\u80fd\u5b9e\u73b0\u6548\u679c\u662f\u53ef\u4ee5\u7684\uff0c\u4f46\u662f\u6709\u4e00\u70b9\u4e0d\u592a\u4e00\u6837\u662f\u4ec0\u4e48\uff1f\u9996\u5148\u6211\u4eec\u540e\u679c\u4e5f\u4e0d\u80fd\u8bb2\u5b8c\u5168\u7684\u540e\u7ba1\uff0c\u8fd9\u4e2a\u540e\u7ba1\u662f\u63d0\u4f9b\u7ed9\u6211\u4eec\u8fd9\u4e9bSARS\u7528\u6237\uff0c\u901a\u8fc7\u6211\u4eec\u7684\u4ec0\u4e48\u63a7\u5236\u53f0\u8bbf\u95ee\u7684\uff0c\u76f8\u5f53\u4e8e\u6709\u4e00\u70b9\u662f\u4ec0\u4e48\uff1f\u5b83\u662f\u9700\u8981\u4ec0\u4e48\uff1f\u5b83\u662f\u9700\u8981\u7528\u6237\u4fe1\u606f\u7684\uff0c\u5bf9\u4e0d\u5bf9\uff1f\u5b83\u5f97\u9a8c\u8bc1\u7528\u6237\u4fe1\u606f\uff0c\u4e5f\u5c31\u662f\u6211\u4eec\u7684token\u3002&nbsp;\u7136\u540e\u5176\u6b21\u5b83\u8fd9\u91cc\u9762\u8bbf\u95ee\u540e\u7ba1\uff0c\u8bbf\u95ee\u540e\u7ba1\u7684\u90fd\u4e0d\u662f\u90a3\u79cd\u4ec0\u4e48\uff0c\u90fd\u4e0d\u662f\u90a3\u79cd\u5e76\u53d1\u91cf\u8f83\u4f4e\u3002\u7136\u540e\u8fd9\u79cd\u662f\u8bbf\u95ee\u7684\u662f\u540e\u7ba1\u5e26\u56fe\u5f62\u5316\u754c\u9762\uff0c\u7136\u540e\u77ed\u94fe\u63a5\u4e2d\u5fc3\u7684\u8bdd\uff0c\u77ed\u94fe\u63a5\u4e2d\u5fc3\u4e00\u4e2a\u662f\u4f5c\u4e3a SARS\u63d0\u4f9bAPI\u8c03\u7528\uff0c\u7136\u800c\u8fd9\u4e2aAPI\u8c03\u7528\u662f\u6211\u4eec\u8981\u9881\u53d1\u7ed9\u5ba2\u6237\u7aef\u4e00\u4e2atoken\uff0c\u8fd9\u4e2a\u4e0d\u80fd\u8bf4token\u5c31\u662f\u4e00\u4e2a\u5bc6\u94a5\uff0c\u6211\u4eec\u8981\u9881\u53d1\u7ed9\u5ba2\u6237\u7aef\u4e00\u4e2a\u5bc6\u94a5\uff0c\u7136\u540e\u4f60\u6765\u8bf7\u6c42\u6211\u7684\u65f6\u5019\uff0c\u4f60\u5728\u91cc\u9762\u628a\u8fd9\u4e2a\u5bc6\u94a5\u5e26\u4e0a\uff0c\u7136\u540e\u6211\u624d\u80fd\u9a8c\u8bc1\u4f60\u7684\u8eab\u4efd\u6ce8\u610f\uff0c\u5bc6\u94a5\u5b83\u4e0d\u662f\u7528\u6237\u7684\uff0c\u5b83\u662f\u4e2a\u522b\u9881\u53d1\u7684\u3002<\/p>\n\n\n\n<p>\u7136\u540e\u7b2c\u4e8c\u5b83\u7684\u6d41\u91cf\u5e76\u53d1\u91cf\u975e\u5e38\u9ad8\uff0c\u4f60\u60f3\u6211\u4eec\u4f5c\u4e3a\u4e00\u6b3eSasS\u5e94\u7528\uff0c\u5b83\u4e0d\u53ea\u662f\u5bf9\u4e2a\u4eba\uff0c\u5b83\u4e5f\u5bf9\u4f01\u4e1a\u5982\u679c\u8bf4\uff0c\u5047\u5982\u8bf4\u963f\u91cc\u5df4\u5df4\u4e70\u4e86\u6211\u7684 SARS\u7684\u77ed\u94fe\u63a5\u7cfb\u7edf\u5f53\u7136\u4e0d\u592a\u73b0\u5b9e\uff0c\u4f46\u662f\u5982\u679c\u4ed6\u4e70\u4e86\u4ed6\u8981\u751f\u6210\u7684\u91cf\u662f\u975e\u5e38\u5927\u7684\uff0c\u5f53\u7136\u6211\u4f1a\u6536\u4ed6\u94b1\u5f88\u591a\uff0c\u4f46\u662f\u6536\u4ed6\u94b1\u591a\u5c31\u610f\u5473\u7740\u4eba\u5bb6\u5bf9\u5427\u8c03\u7814\u8c03\u4f60\u7684\u63a5\u53e3\u4eba\u5bb6\u8086\u65e0\u5fcc\u60ee\uff0c\u6240\u4ee5\u8bf4\u5b83\u8fd9\u91cc\u9762\u4e3b\u8981\u5e94\u5bf9\u7684\u662f\u4ec0\u4e48\uff1f\u5c31\u662f\u4e2a\u4eba\u4ee5\u53ca\u4f01\u4e1a\u7684SARS\u5316\u7684\u77ed\u94fe\u63a5\u63a5\u53e3\u8c03\u7528\uff0c\u6240\u4ee5\u8bf4\u5b83\u4e00\u822c\u5b83\u662f\u4e0d\u4f1a\u5bf9\u5230\u63a7\u5236\u53f0\u7684\uff0c\u4e00\u822c\u6211\u4eec\u4f1a\u5e72\u4ec0\u4e48\uff1fOk\u6211\u4eec\u73b0\u5728\u7406\u6e05\u695a\u8fd9\u4e2a\u5173\u7cfb\u4e86\uff0c\u90a3\u7406\u6e05\u695a\u8fd9\u4e2a\u5173\u7cfb\u4e4b\u540e\u6211\u4eec\u73b0\u5728\u8981\u505a\u4ec0\u4e48\uff1f\u6211\u4eec\u662f\u4e0d\u662f\u8981\u901a\u8fc7\u540e\u7ba1\u53bb\u8c03\u6211\u4eec\u7684\u77ed\u94fe\u63a5\u4e2d\u5fc3\u5b9e\u73b0\u8fd9\u79cd\u8c03\u7528\uff0c\u4e24\u4e2a\u9879\u76ee\u4e4b\u95f4\u600e\u4e48\u8c03\u7528\uff1f\u5927\u5bb6\u60f3\u4e00\u60f3\u662f\u4e0d\u662f\u5c31\u662f\u6bd4\u8f83\u5e38\u89c1\u7684\u662f\u4e0d\u662f\u5c31\u662fHTTP\u7f51\u7edc\u534f\u8bae\u8c03\u7528\uff1f\u6b63\u5c31\u662f\u5982\u679c\u8bf4\u5728\u4f01\u4e1a\u5f53\u4e2d\u80af\u5b9a\u662f\u7c7b\u4f3c\u4e8espring cloud\u6216\u8005 double\u8fd9\u79cdIPC\uff0c\u7c7b\u4f3c\u4e8e\u8fd9\u4e24\u79cd\u53bb\u8c03\u7528\uff0c\u4f46\u662f\u76ee\u524d\u6211\u4eec\u7684\u4e3b\u8981\u6d41\u7a0b\u8fd8\u6ca1\u8bb2\u5b8c\uff0c\u6211\u4eec\u73b0\u5728\u5148\u4ee5HTTP\u7684\u65b9\u5f0f\u53bb\u8c03\uff0c\u7136\u540e\u7b49\u6211\u4eec\u90fd\u8bb2\u5b8c\u540e\uff0c\u6211\u4eec\u518d\u7528\u8fd9\u79cd\u6bd4\u5982\u8bf4spring cloud\u6211\u4eec\u5c31\u7528spring cloud\u53bb\u6539\u9020\uff0c\u73b0\u5728\u5148\u600e\u4e48\u7b80\u5355\u600e\u4e48\u6765\u597d\u5427\uff1f<\/p>\n\n\n\n<p>\u7ed9ShortLinkPageRespDTO\u6dfb\u52a0\u548c\u8865\u5145<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.nageoffer.shortlink.admin.remote.dto.resp;\n\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport lombok.Data;\n\nimport java.util.Date;\n\n\/**\n * \u77ed\u94fe\u63a5\u5206\u9875\u8fd4\u56de\u53c2\u6570\n *\/\n@Data\npublic class ShortLinkPageRespDTO {\n\n    \/**\n     * id\n     *\/\n    private Long id;\n\n    \/**\n     * \u57df\u540d\n     *\/\n    private String domain;\n\n    \/**\n     * \u77ed\u94fe\u63a5\n     *\/\n    private String shortUri;\n\n    \/**\n     * \u5b8c\u6574\u77ed\u94fe\u63a5\n     *\/\n    private String fullShortUrl;\n\n    \/**\n     * \u539f\u59cb\u94fe\u63a5\n     *\/\n    private String originUrl;\n\n    \/**\n     * \u5206\u7ec4\u6807\u8bc6\n     *\/\n    private String gid;\n\n    \/**\n     * \u6709\u6548\u671f\u7c7b\u578b 0\uff1a\u6c38\u4e45\u6709\u6548 1\uff1a\u81ea\u5b9a\u4e49\n     *\/\n    private Integer validDateType;\n\n    \/**\n     * \u6709\u6548\u671f\n     *\/\n    @JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n    private Date validDate;\n\n    \/**\n     * \u521b\u5efa\u65f6\u95f4\n     *\/\n    @JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n    private Date createTime;\n\n    \/**\n     * \u63cf\u8ff0\n     *\/\n    private String describe;\n\n    \/**\n     * \u7f51\u7ad9\u6807\u8bc6\n     *\/\n    private String favicon;\n}\n<\/code><\/pre>\n\n\n\n<p>&nbsp;HTTP\u7684\u8bdd\u5c31\u6bd4\u8f83\u7b80\u5355\u4e86\u561b\uff0c\u521b\u5efa\u77ed\u94fe\u63a5\u548c\u8fd9\u4e2a\u5206\u9875\u67e5\u8be2\u77ed\u94fe\u63a5\u6211\u4eec\u90fd\u662f\u9700\u8981\u7684\uff0c\u90a3\u4e48\u5c31\u8981\u5c06project \u7684req\uff0cresp\u90fd\u590d\u5236\u5230admin\u7684remote dto\u91cc\u9762\u53bb\uff08ShortLinkPageReqDTO extends Page\uff1b\u6ca1\u6709shortlinkDO\uff09\uff0c\u540e\u9762\u7528fin\u7684\u8bdd\u662finterface\uff0c\u5982\u679c\u8bf4\u4f60\u7528\u63a5\u53e3\u53bb\u8c03\u7684\u8bdd\u3002\u6709\u4e00\u4e2ajava8\u7684default\u65b9\u6cd5\uff0c\u5728remote.dto\u4e0b\u521b\u5efaShortLinkRemoteService<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">package com.nageoffer.shortlink.admin.remote.dto;\n\nimport cn.hutool.core.lang.TypeReference;\nimport cn.hutool.http.HttpUtil;\nimport com.alibaba.fastjson2.JSON;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.nageoffer.shortlink.admin.common.convention.result.Result;\nimport com.nageoffer.shortlink.admin.remote.dto.req.ShortLinkPageReqDTO;\nimport com.nageoffer.shortlink.admin.remote.dto.resp.ShortLinkPageRespDTO;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\npublic interface ShortLinkRemoteService {\n    default Result&lt;IPage&lt;ShortLinkPageRespDTO&gt;&gt; pageShortLink(ShortLinkPageReqDTO requestParam) {\n        Map&lt;String,Object&gt;requestMap=new HashMap&lt;&gt;();\n        requestMap.put(\"gid\",requestParam.getGid());\n        requestMap.put(\"current\",requestParam.getCurrent());\n        requestMap.put(\"size\",requestParam.getSize());\n        String resultPageStr = HttpUtil.get(\"http:\/\/127.0.0.1:8001\/api\/short-link\/v1\/page\",requestMap);\n        return JSON.parseObject(resultPageStr, new TypeReference&lt;&gt;() {\n        });\n    }\n}\n<\/pre>\n\n\n\n<p>controller\u65b0\u5efaShortLinkController<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">package com.nageoffer.shortlink.admin.controller;\n\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.nageoffer.shortlink.admin.common.convention.result.Result;\nimport com.nageoffer.shortlink.admin.remote.dto.ShortLinkRemoteService;\nimport com.nageoffer.shortlink.admin.remote.dto.req.ShortLinkPageReqDTO;\nimport com.nageoffer.shortlink.admin.remote.dto.resp.ShortLinkPageRespDTO;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic class ShortLinkController {\n    \n    @GetMapping(\"\/api\/short-link\/admin\/v1\/page\")\n    public Result&lt;IPage&lt;ShortLinkPageRespDTO&gt;&gt; pageShortLink(ShortLinkPageReqDTO requestParam) {\n        ShortLinkRemoteService shortLinkRemoteService = new ShortLinkRemoteService(){};\n        return shortLinkRemoteService.pageShortLink(requestParam);\n    }\n}<\/pre>\n\n\n\n<p>\u5728apifox\u4e2d\u539f\u6765\u63d0\u4f9b\u7684\u4e24\u4e2a\u521b\u5efa\u77ed\u94fe\u63a5\uff0c\u4e0a\u4e00\u4e2a\u7528\u7684\u5e94\u8be5\u662f<strong>\u77ed\u94fe\u63a5\u7ba1\u7406\u4e2d<\/strong>\u7684\uff0c\u602a\u4e0d\u5f97\u662f\u591a\u4e86\u53c2\u6570<img loading=\"lazy\" decoding=\"async\" height=\"343\" width=\"271\" src=\"https:\/\/i-blog.csdnimg.cn\/direct\/0e149e499ee24979aca83f6fe3db1b1d.png\" alt=\"\"><\/p>\n\n\n\n<p>&nbsp;admin\u7684ShortLinkController\u548cShortLinkRemoteService\u5982\u4e0b&nbsp;\u77ed\u94fe\u63a5\u540e\u7ba1\u63a7\u5236\u5c42<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.nageoffer.shortlink.admin.controller;\n\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.nageoffer.shortlink.admin.common.convention.result.Result;\nimport com.nageoffer.shortlink.admin.common.convention.result.Results;\nimport com.nageoffer.shortlink.admin.remote.dto.ShortLinkRemoteService;\nimport com.nageoffer.shortlink.admin.remote.dto.req.ShortLinkCreateReqDTO;\nimport com.nageoffer.shortlink.admin.remote.dto.req.ShortLinkPageReqDTO;\nimport com.nageoffer.shortlink.admin.remote.dto.resp.ShortLinkCreateRespDTO;\nimport com.nageoffer.shortlink.admin.remote.dto.resp.ShortLinkPageRespDTO;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RestController;\n\n\/**\n * \u77ed\u94fe\u63a5\u540e\u7ba1\u63a7\u5236\u5c42\n *\/\n@RestController\npublic class ShortLinkController {\n    ShortLinkRemoteService shortLinkRemoteService = new ShortLinkRemoteService(){};\n    \/**\n     * \u521b\u5efa\u77ed\u94fe\u63a5\n     *\/\n    @PostMapping(\"\/api\/short-link\/admin\/v1\/create\")\n    public Result&lt;ShortLinkCreateRespDTO&gt; createShortLink(@RequestBody ShortLinkCreateReqDTO requestParam) {\n        return shortLinkRemoteService.createShortLink(requestParam);\n    }\n\n    @GetMapping(\"\/api\/short-link\/admin\/v1\/page\")\n    public Result&lt;IPage&lt;ShortLinkPageRespDTO&gt;&gt; pageShortLink(ShortLinkPageReqDTO requestParam) {\n       \n        return shortLinkRemoteService.pageShortLink(requestParam);\n    }\n}\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.nageoffer.shortlink.admin.remote.dto;\n\nimport cn.hutool.core.lang.TypeReference;\nimport cn.hutool.http.HttpUtil;\nimport com.alibaba.fastjson2.JSON;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.nageoffer.shortlink.admin.common.convention.result.Result;\nimport com.nageoffer.shortlink.admin.remote.dto.req.ShortLinkCreateReqDTO;\nimport com.nageoffer.shortlink.admin.remote.dto.req.ShortLinkPageReqDTO;\nimport com.nageoffer.shortlink.admin.remote.dto.resp.ShortLinkCreateRespDTO;\nimport com.nageoffer.shortlink.admin.remote.dto.resp.ShortLinkPageRespDTO;\nimport org.springframework.web.bind.annotation.RequestBody;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\npublic interface ShortLinkRemoteService {\n    \/**\n     * \u521b\u5efa\u77ed\u94fe\u63a5\n     *\n     * @param requestParam \u521b\u5efa\u77ed\u94fe\u63a5\u8bf7\u6c42\u53c2\u6570\n     * @return \u77ed\u94fe\u63a5\u521b\u5efa\u54cd\u5e94\n     *\/\n    default Result&lt;ShortLinkCreateRespDTO&gt; createShortLink(ShortLinkCreateReqDTO requestParam) {\n        String resultBodyStr = HttpUtil.post(\"http:\/\/127.0.0.1:8001\/api\/short-link\/v1\/create\", JSON.toJSONString(requestParam));\n        return JSON.parseObject(resultBodyStr, new TypeReference&lt;&gt;() {\n        });\n    }\n\n    \/**\n     * \u5206\u9875\u67e5\u8be2\u77ed\u94fe\u63a5\n     * @param requestParam \u5206\u9875\u77ed\u94fe\u63a5\u8bf7\u6c42\u53c2\u6570\n     * @return \u67e5\u8be2\u77ed\u94fe\u63a5\u54cd\u5e94\n     *\/\n    default Result&lt;IPage&lt;ShortLinkPageRespDTO&gt;&gt; pageShortLink(ShortLinkPageReqDTO requestParam) {\n        Map&lt;String, Object&gt; requestMap = new HashMap&lt;&gt;();\n        requestMap.put(\"gid\", requestParam.getGid());\n        requestMap.put(\"current\", requestParam.getCurrent());\n        requestMap.put(\"size\", requestParam.getSize());\n        String resultPageStr = HttpUtil.get(\"http:\/\/127.0.0.1:8001\/api\/short-link\/v1\/page\", requestMap);\n        return JSON.parseObject(resultPageStr, new TypeReference&lt;&gt;() {\n        });\n    }\n\n\n}\n<\/code><\/pre>\n\n\n\n<p>\u00a0\u70b9\u51fb\u8fd0\u884cShortLinkAdminAppllication\uff0c\u4e24\u4e2a\u670d\u52a1\u90fd\u8981\u542f\u52a8<img loading=\"lazy\" decoding=\"async\" height=\"566\" width=\"665\" src=\"https:\/\/i-blog.csdnimg.cn\/direct\/55309ea8ee4f4daea42c20a41de076fe.png\" alt=\"\"><\/p>\n\n\n\n<p>\u6709\u4e00\u4e2a\u9519\u8bef\uff0c\u4f46\u662f\u6211\u627e\u4e0d\u5230\uff0c\u4e8b\u5b9e\u4e0a\u8fd9\u4e2a\u5728\u4e0a\u671f\u5c31\u53ef\u80fd\u51fa\u73b0\u4e86<\/p>\n\n\n\n<p>tm\u7684\uff0c\u539f\u6765\u662f\u8fd9\u4e00\u53e5short-link\u5199\u6210short-Link\u4e86<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">if (!(Objects.equals(requestURI, \"\/api\/short-link\/admin\/v1\/user\") &amp;&amp; Objects.equals(method, \"POST\")))<\/pre>\n\n\n\n<p>TODO \u540e\u7eed\u91cd\u6784\u4e3aSpringCloud Feign\u8c03\u7528<\/p>\n\n\n\n<p>&nbsp;\u8fd9\u662f\u77ed\u94fe\u63a5\u540e\u7ba1\u7cfb\u7edf\u8c03\u7528\u4e2d\u53f0\u8bf7\u6c42\u76f8\u5173\u63a5\u53e3<\/p>\n\n\n\n<p>&nbsp;\u6211\u4eec\u7684\u670d\u52a1\u5668\u4e0a\u7684\uff0c\u4f46\u662f\u90e8\u7f72\u5230\u670d\u52a1\u5668\u91cc\u9762\u5b83\u4f1a\u6709\u4e00\u4e2a\u95ee\u9898\uff0c\u90a3\u5c31\u662fshardingsphere-config-dev\u8fd9\u4e2a\u4e1c\u897f\uff0c\u5b83\u8fd9\u91cc\u9762\u7684\u53c2\u6570\u6ca1\u6709\u529e\u6cd5\u901a\u8fc7vm\u53c2\u6570\u4ee5\u53caspring\u90a3\u79cd\u6ce8\u5165\u7684\u65b9\u5f0f\u7ed9\u5b83\u66ff\u6362\u8d77\u6765\uff0c\u90a3\u4e5f\u5c31\u76f8\u5f53\u4e8e\u5b83\u8fd9\u91cc\u9762\u5199\u4ec0\u4e48\uff0c\u4f60\u5728\u670d\u52a1\u5668\u91cc\u9762\u5c31\u662f\u4ec0\u4e48\uff0c\u4f46\u662f\u6211\u751f\u4ea7\u7684\u670d\u52a1\u5668\u5b83\u7684\u5bc6\u7801\u4e0d\u53ebroot\uff0c\u56e0\u4e3a\u4f60\u5728\u751f\u4ea7\u90e8\u7f72\u5982\u679c\u8bf4\uff0c\u4f60\u8bbe\u7f6e\u4e00\u4e2a\u5f31\u5bc6\u7801\u7684\u8bdd\uff0c\u53ef\u80fd\u88ab\u522b\u4eba\u76f4\u63a5\u7528\u90a3\u79cd\u8868\u7ed9\u4f60\u5c31\u70b8\u4e86\uff0c\u6240\u4ee5\u8bf4\u6211\u5bc6\u7801\u8bbe\u8ba1\u5f97\u975e\u5e38\u590d\u6742\uff0c\u8fd9\u79cd\u60c5\u51b5\u4e0b\u600e\u4e48\u529e\uff1fapplication\u5982\u4e0b<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">url: jdbc:shardingsphere:classpath:shardingsphere-config-${database.env:dev}.yaml<\/pre>\n\n\n\n<p>\u53ea\u80fd\u8bf4\u6211\u4eec\u8fd9\u8fb9\u7ed9\u4ed6\u6539\u4e00\u4e0b\u3002\u6211\u8ddf\u4ed6\u7ed9\u4f60\u627e\u5230\u4e86\uff0c\u5927\u5bb6\u6f14\u793a\u4e00\u4e0b\u8be5\u600e\u4e48\u8bf4\u8be5\u600e\u4e48\u505a\u3002\u9996\u5148\u6211\u4eec\u7684\u6539\u6210\u9ed8\u8ba4\u7684DEV\uff0c\u7136\u540e\u5728\u8fd9\u91cc\u7ed9\u5b83\u52a0\u4e00\u4e2a\u53c2\u6570\u3002<\/p>\n\n\n\n<p>Java\u542f\u52a8\u7684\u8bdd\uff0c\u90fd\u77e5\u9053\u80fd\u5728Java\u542f\u52a8\u8fc7\u7a0b\u5f53\u4e2d\u4f20\u9012\u4e00\u4e9b\u90a3\u79cd\u7cfb\u7edf\u53c2\u6570\uff0c\u7136\u540e\u6211\u4eec\u5728\u8fd9\u91cc\u901a\u8fc7\u4e0a\u4e0b\u6587\u53bb\u62ff\u5230 database.dev\uff0c\u7136\u540e\u5224\u65ad\u5982\u679c\u8bf4\u5b83\u4e0d\u7b49\u4e8e\u7a7a\uff0c\u90a3\u4e48\u5c31\u662f\u5982\u679c\u8bf4\u5b83\u8fd9\u4e2a\u53c2\u6570\u7b49\u4e8e\u7a7a\uff0c\u90a3\u4e48\u5b83\u9ed8\u8ba4\u5c31\u662fDV\uff0c\u6240\u4ee5\u8bf4\u6211\u4eec\u9ed8\u8ba4\u8bfbDV\u7684\u53c2\u6570\uff0c\u7136\u540e\u8fd9\u91cc\u7684\u8bdd\u6211\u4eec\u7ed9\u5b83\u6539\u6210prod\u7684\uff0c\u7136\u540e\u5bc6\u7801<\/p>\n\n\n\n<p>shardingsphere-config-dev\u7248\u5c31\u662f\u8fd9\u6837<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>dataSources:\n  ds_0:\n    dataSourceClassName: com.zaxxer.hikari.HikariDataSource\n    driverClassName: com.mysql.cj.jdbc.Driver\n    jdbcUrl: jdbc:mysql:\/\/127.0.0.1:3306\/link?useUnicode=true&amp;characterEncoding=UTF-8&amp;rewriteBatchedStatements=true&amp;allowMultiQueries=true&amp;serverTimezone=Asia\/Shanghai\n    username: root\n    password: root<\/code><\/pre>\n\n\n\n<p>prod\u662f \u5bc6\u7801\u590d\u6742\u7684\u7ebf\u4e0a\u7248\u672c\uff0cproject\u4e00\u6837\u7684\u9053\u7406\uff0c\u4e00\u6837\u7684\u4e1c\u897f\u7ed9project\u4e5f\u6765\u4e00\u6ce2<\/p>\n\n\n\n<p>vm\u53c2\u6570<img loading=\"lazy\" decoding=\"async\" height=\"94\" width=\"375\" src=\"https:\/\/i-blog.csdnimg.cn\/direct\/b5b1b31d094a4f8ca26de07b7ce261b7.png\" alt=\"\">\u8fd9\u662f\u201c\u5f00\u53d1\u670d\u52a1\u7aef\u90e8\u7f72\u77ed\u94fe\u63a5\u9879\u76ee\u6570\u636e\u5e93\u914d\u7f6e\u53d8\u66f4\u201d<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>&nbsp;\u65fa\u65fa\u6380\u88ab\uff1a\u6211\u7684\u4e2d\u53f0\u8fdc\u7a0b\u8c03\u7528\u670d\u52a1\uff0c\u5728Service\u90a3\u91cc\u7684return\u4f1a\u62a5\u7c7b\u578b\u8f6c\u6362\u5f02\u5e38\uff0c\u4f60\u4eec\u6709\u540c\u60c5\u51b5\u89e3\u51b3\u4e86\uff0ct\u6211\u4e00\u4e0b<\/p>\n\n\n\n<p>\u4f60\u4ece\u6811\u6797\u6df1\u5904\u8d70\u51fa\u96fe&nbsp;\u56de\u590d&nbsp;\u65fa\u65fa\u6380\u88ab\uff1a\u6211\u7684\u4e5f\u5728return\u62a5\u7c7b\u578b\u8f6c\u6362\u5f02\u5e38\u4e86\uff0c\u540e\u6765\u53d1\u73b0\u662f\u4e2d\u53f0\u8fdc\u8c03\u540e\u7684\u63a5\u6536\u7ed3\u679c\u7c7b\u578b\u4e0d\u5bf9\uff0capi\u90a3\u91cc\u8fd4\u56de\u7684\u5df2\u7ecf\u662fResult&lt;IPage&lt;&gt;&gt;\u4e86\uff0c\u7ed3\u679c\u6211\u53c8\u641e\u4e86\u4e2aIPage\u53cd\u5e8f\u5217\u5316<\/p>\n\n\n\n<p>wdnmd&nbsp;\u56de\u590d&nbsp;\u4f60\u4ece\u6811\u6797\u6df1\u5904\u8d70\u51fa\u96fe\uff1a\u4e3a\u5565\u8fd9\u91cc\u663e\u793a\u6211\u6ca1\u643a\u5e26token\uff0c\u62a5\u4e86\u6211\u81ea\u5df1\u7684\u5f02\u5e38<\/p>\n\n\n\n<p>\u4f60\u4ece\u6811\u6797\u6df1\u5904\u8d70\u51fa\u96fe&nbsp;\u56de\u590d&nbsp;wdnmd\uff1a\u4e4b\u524d\u540e\u7ba1\u7cfb\u7edf\u4e0d\u662f\u8bbe\u7f6e\u4e86\u767b\u5f55\u68c0\u6d4b\u561b\uff0c\u8bf7\u6c42\u5934\u91cc\u5f97\u6709username\u548ctoken\uff0c\u4f60\u770b\u770b\u4f60\u7684\u8bf7\u6c42\u91cc\u6709\u6ca1\u6709\u52a0<\/p>\n\n\n\n<p>\u7a7a\u60f3\u5bb6&nbsp;\u56de\u590d&nbsp;\u65fa\u65fa\u6380\u88ab\uff1a\u5982\u679c\u4f60\u8bf4\u7684\u65e5\u671f\u8f6c\u6362\u5f02\u5e38\u7684\u8bdd\uff0c\u9700\u8981\u5728\u8bf7\u6c42\u53c2\u6570\u7684\u65e5\u671f\u7c7b\u578b\u4e0a\u52a0\u4e0aJsonFormat<\/p>\n\n\n\n<p>\u65fa\u65fa\u6380\u88ab&nbsp;\u56de\u590d&nbsp;\u4f60\u4ece\u6811\u6797\u6df1\u5904\u8d70\u51fa\u96fe\uff1a\u6211\u4e5f\u5fd8\u8bb0\u4ec0\u4e48\u9519\u4e86\uff0c\u4f46\u4e0d\u662f\u4f60\u7684\u8fd9\u4e2a\uff0c\u53cd\u6b63\u6211\u540e\u9762\u662f\u7528\u7684Post\u8bf7\u6c42\u3002<\/p>\n\n\n\n<p>\u65fa\u65fa\u6380\u88ab&nbsp;\u56de\u590d&nbsp;\u7a7a\u60f3\u5bb6\uff1a\u8fd9\u4e2a\u6211\u8fd8\u662f\u6709\u6ce8\u610f\u5230\u7684\uff0c\u4e0d\u662f\u8fd9\u4e2a\u54e6<\/p>\n\n\n\n<p>Faded&nbsp;\u56de\u590d&nbsp;\u65fa\u65fa\u6380\u88ab\uff1a\u6211\u7684\u62a5\u9519\u539f\u56e0\u662f\u6ca1\u542f\u52a8ShortLinkApplication\uff0c\u4e24\u4e2a\u542f\u52a8\u7c7b\u90fd\u8981\u542f\u52a8<\/p>\n\n\n\n<p>\u6e05\u6668&nbsp;\u56de\u590d&nbsp;\u65fa\u65fa\u6380\u88ab\uff1a\u6211\u7684\u662fTypeReference\u7684\u5305\u5bfc\u9519\u4e86\uff0c\u5e94\u8be5\u5bfc\u5165fastjson2\u7684\u5305<\/p>\n\n\n\n<p>\u65fa\u65fa\u6380\u88ab&nbsp;\u56de\u590d&nbsp;Faded\uff1a\u5982\u679c\u670d\u52a1\u6ca1\u542f\u52a8\u5e94\u8be5\u4e0d\u4f1a\u662f\u7c7b\u578b\u8f6c\u6362\u5f02\u5e38\u5427<\/p>\n\n\n\n<p>\u65fa\u65fa\u6380\u88ab&nbsp;\u56de\u590d&nbsp;\u6e05\u6668\uff1a\u8fd9\u4e2a\u6211\u4e5f\u9519\u8fc7\uff0c\u6211\u5f00\u4e86\u90a3\u4e2a\u81ea\u52a8\u5bfc\u5305\u6709\u65f6\u5019\u8fd8\u662f\u4f1a\u6709\u70b9\u70e6\u4eba\u3002<\/p>\n\n\n\n<p>\u60f3\u6bd5\u4e1a\u54e9&nbsp;\u56de\u590d&nbsp;Faded\uff1a\u6211\u4e5f\u662f\u8fd9\u6837\uff0c\u8bf7\u95ee\u4f60\u89e3\u51b3\u4e86\u5417<\/p>\n\n\n\n<p>Faded&nbsp;\u56de\u590d&nbsp;\u60f3\u6bd5\u4e1a\u54e9\uff1a\u4e24\u4e2a\u670d\u52a1\u90fd\u8981\u542f\u52a8<\/p>\n\n\n\n<p>\u4e00\u53ea\u9c7c&nbsp;\u56de\u590d&nbsp;Faded\uff1a\u6211\u4e5f\u662f<\/p>\n\n\n\n<p>Drano \ud83c\udf1d&nbsp;\u56de\u590d&nbsp;wdnmd\uff1a\u770b\u770b\u662f\u4e0d\u662f HttpUtil.get\u91cc\u9762\u7684url\u5199\u9519\u4e86\uff0c\u6211\u7aef\u53e3\u53f78001\u5199\u6210\u4e868002\u5c31\u4f1a\u62a5\u8fd9\u4e2a\u9519\u8bef<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>&nbsp;HttpUtil\u600e\u4e48\u8bbe\u7f6echarSet\u548ccontentType\u963f?\u6211\u8fdc\u7a0b\u8c03\u7528\u62a5\u7684\u8fd9\u4e2a\u9519\uff1f<\/p>\n\n\n\n<p>\u6211\u8bbe\u7f6e\u4e86HttpUtil\u7684charSet\u548ccontentType\uff0c\u4f46\u53c8\u6709\u65b0\u95ee\u9898\uff0c\u6211\u540e\u6765\u7528RestTemplate\u4e86<img loading=\"lazy\" decoding=\"async\" height=\"435\" width=\"762\" src=\"https:\/\/i-blog.csdnimg.cn\/direct\/c5f335b96dc94a5499906ceaf690c87a.png\" alt=\"\"><\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u738b\u749e\uff1a\u73b0\u5728\u968f\u4fbf\u4e00\u4e2a\u7528\u6237\u767b\u5f55\u5c31\u53ef\u4ee5\u67e5\u770b\u6240\u6709\u7684\u77ed\u94fe\u63a5\u4fe1\u606f\u5417\uff1f\u8fd8\u6ca1\u6709\u7528\u6237\u4e0e\u77ed\u94fe\u63a5\u5173\u8054\uff1f\u4e0d\u592a\u61c2<\/p>\n\n\n\n<p>2024-03-14 09:19<\/p>\n\n\n\n<p>\u963f\u767d&nbsp;\u56de\u590d&nbsp;\u738b\u749e\uff1a\u540c\u95ee<\/p>\n\n\n\n<p>2024-04-13 02:00<\/p>\n\n\n\n<p>\u9a6c\u4e01&nbsp;\u56de\u590d&nbsp;\u738b\u749e\uff1aGet\uff0c\u4fee\u590d\u601d\u8def\uff1a\u5224\u65ad\u5f53\u524d\u767b\u5f55\u7528\u6237\u548c gid \u7684\u8bb0\u5f55\u662f\u5426\u5b58\u5728\uff0c\u4f1a\u5728\u6700\u65b0\u4ee3\u7801\u4e2d\u4fee\u590d<\/p>\n\n\n\n<p>2024-04-15 10:48<\/p>\n\n\n\n<p>\u4e0d\u60f3\u53d6\u540d&nbsp;\u56de\u590d&nbsp;\u9a6c\u4e01\uff1a\u8bf7\u95ee\u8fd9\u4e2a\u5730\u65b9\u8fd8\u6ca1\u4fee\u590d\u5417\uff1f<\/p>\n\n\n\n<p>2024-06-19 20:22<\/p>\n\n\n\n<p>\u9a6c\u4e01&nbsp;\u56de\u590d&nbsp;\u4e0d\u60f3\u53d6\u540d\uff1a\u5df2\u4fee\u590d\uff0c\u901a\u8fc7 gid \u5168\u5c40\u552f\u4e00\u624b\u6bb5\u89e3\u51b3<\/p>\n\n\n\n<p>2024-06-19 20:23<\/p>\n\n\n\n<p>\u4e0d\u60f3\u53d6\u540d&nbsp;\u56de\u590d&nbsp;\u9a6c\u4e01\uff1a\u5662\u5662\u597d\u7684\u8c22\u8c22\u9a6c\u54e5\uff0c\u6211\u8fd8\u6709\u4e2a\u95ee\u9898\u53d1\u5728\u77ed\u94fe\u63a5\u95ee\u7b54\u91cc\u7684\uff0c\u53ef\u4ee5\u8bf7\u4f60\u89e3\u7b54\u4e00\u4e0b\u5417<\/p>\n\n\n\n<p>2024-06-19 20:29<\/p>\n\n\n\n<p>\u4e0d\u60f3\u53d6\u540d&nbsp;\u56de\u590d&nbsp;\u9a6c\u4e01\uff1a\u9a6c\u54e5\uff0c\u8bf7\u95ee\u5982\u679c\u8fd9\u4e2a\u77ed\u94fe\u63a5\u4e2d\u5fc3\u9488\u5bf9\u7684\u662f\u4e2a\u4eba\u548c\u4f01\u4e1a\u7684api\u8c03\u7528\uff0c\u90a3\u4e48\u8fd9\u4e2a\u540e\u7ba1\u7cfb\u7edf\u9488\u5bf9\u7684\u662f\u8c01\u5462\uff1f<\/p>\n\n\n\n<p>2024-06-20 17:50<\/p>\n\n\n\n<p>TheTurtle&nbsp;\u56de\u590d&nbsp;\u4e0d\u60f3\u53d6\u540d\uff1a\u4e2a\u4eba\u554a \u4e5f\u5c31\u662f\u901a\u8fc7\u63a7\u5236\u53f0<\/p>\n\n\n\n<p>2024-07-11 22:45<\/p>\n\n\n\n<p>TheTurtle&nbsp;\u56de\u590d&nbsp;\u4e0d\u60f3\u53d6\u540d\uff1a\u5bf9\u4f01\u4e1a\u5c31\u76f8\u5f53\u4e8e\u67d0\u9879\u76ee\u5185\u67e5\u7535\u8bdd\u53f7\u7801\u7684\u5f52\u5c5e\u5730\u9700\u8981\u8bbf\u95ee\u8fd0\u8425\u5546\u90a3\u8fb9\u63d0\u4f9b\u7684API\uff0c\u6362\u5230\u8fd9\u91cc\u5c31\u662f\u76f4\u63a5\u8bf7\u6c42\u77ed\u94fe\u63a5\u4e2d\u5fc3\u7684 API \u3002\u8fd9\u79cd\u5e76\u53d1\u91cf\u53d6\u51b3\u4e8e\u4f01\u4e1a\uff08\u8bf7\u6c42\u65b9\uff09\u90a3\u8fb9\u7684\u5e76\u53d1\u91cf\u3002<\/p>\n\n\n\n<p>2024-07-11 22:47<\/p>\n\n\n\n<p>\u4e0d\u60f3\u53d6\u540d&nbsp;\u56de\u590d&nbsp;TheTurtle\uff1a\u8fd9\u6837\u8bbe\u8ba1\u7684\u610f\u4e49\u662f\u4ec0\u4e48\u5462\uff0c\u4e3a\u4ec0\u4e48\u4e0d\u90fd\u76f4\u63a5\u901a\u8fc7\u540e\u7ba1\u7cfb\u7edf\u8bbf\u95ee<\/p>\n\n\n\n<p>2024-07-13 23:03<\/p>\n\n\n\n<p>MayDay&nbsp;\u56de\u590d&nbsp;\u4e0d\u60f3\u53d6\u540d\uff1a\u6211\u7684\u7406\u89e3\u662f\uff0c\u7528\u6237\u90fd\u662f\u7edf\u4e00\u901a\u8fc7\u767b\u5f55\u540e\u7ba1\u6765\u83b7\u53d6\u670d\u52a1\uff0c\u767b\u5f55\u540e\u7ba1\u7684\u7528\u6237\uff0c\u4e00\u79cd\u65b9\u5f0f\u662f\u76f4\u63a5\u5728\u540e\u7ba1\u70b9\u70b9\u70b9\u64cd\u4f5c\u751f\u6210\u77ed\u94fe\u63a5\uff1b\u8fd8\u6709\u4e00\u79cd\u901a\u8fc7api\u8c03\u7528\u751f\u6210\uff0c\u5c31\u662f\u751f\u6210\u4e00\u4e2a\u5c5e\u4e8e\u8be5\u7528\u6237\u7684\u5bc6\u94a5\uff0c\u7528\u6237\u53ef\u4ee5\u81ea\u5df1\u518d\u5f00\u53d1\u4e00\u4e2a\u7a0b\u5e8f\u53bb\u8c03\u7528\u8fd9\u4e2aapi\uff0c\u914d\u7f6e\u597d\u6b63\u786e\u7684\u5bc6\u94a5\u5c31\u4f7f\u7528\u751f\u6210\u77ed\u94fe\u7684\u670d\u52a1\u3002 \u6240\u4ee5\u540e\u7ba1\u53ea\u662f\u7ed9\u7528\u6237\u6216\u4f01\u4e1a\u4e00\u4e2a\u7edf\u4e00\u5165\u53e3\uff0c\u65e2\u53ef\u4ee5\u5728\u4e0a\u9762\u751f\u6210\u77ed\u94fe\uff08\u4e00\u822c\u662f\u5c11\u91cf\u7684\uff09\uff0c\u4e5f\u53ef\u5728\u4e0a\u9762\u7533\u8bf7\u5bc6\u94a5\u7136\u540e\u8c03\u7528api\u53bb\u751f\u6210\u77ed\u94fe\uff08\u4e00\u822c\u662f\u5927\u91cf\u7684\uff09\u3002\u7533\u8bf7\u5230\u5bc6\u94a5\u540e\uff0c\u540e\u7eed\u4e0d\u9700\u8981\u7528\u6237\u8ba4\u8bc1\u4e5f\u53ef\u4ee5\u8c03\u7528\u77ed\u94fe\u670d\u52a1\u3002<\/p>\n\n\n\n<p>2024-07-20 14:07<\/p>\n\n\n\n<p>TheTurtle&nbsp;\u56de\u590d&nbsp;\u4e0d\u60f3\u53d6\u540d\uff1a\u6bd4\u5982\u4f60\u9700\u8981\u5728\u9879\u76ee\u4e2d\u83b7\u53d6\u9ad8\u5fb7\u5730\u56fe\u7684 IP \u5b9a\u4f4d\u670d\u52a1 \u90a3\u4e0d\u53ef\u80fd\u53bb\u63a7\u5236\u53f0\u624b\u52a8\u70b9\u51fb\u83b7\u53d6\u5427 \u800c\u662f\u901a\u8fc7\u8bbf\u95ee\u9ad8\u5fb7\u7684\u63a5\u53e3 \u7136\u540e\u4f60\u628a\u77ed\u94fe\u63a5\u9879\u76ee\u60f3\u6210\u8fd9\u6837\u5c31\u884c\u4e86 \u522b\u4eba\u7684\u4e00\u4e9b\u9879\u76ee\u53ef\u4ee5\u8c03\u7528\u77ed\u94fe\u63a5\u4e2d\u53f0\u7684\u63d0\u4f9b API \u670d\u52a1<\/p>\n\n\n\n<p>2024-07-24 17:38<\/p>\n\n\n\n<p>\u5fae\u8fa3&nbsp;\u56de\u590d&nbsp;MayDay\uff1a\u5c31\u662f\u81ea\u5df1\u518d\u5f00\u53d1\u4e00\u4e2asdk\u7ed9\u522b\u4eba\u7528\uff0c\u522b\u4eba\u62ff\u5230sdk\uff0c\u7136\u540e\u914d\u7f6e\u4e00\u4e0b\u4ece\u6211\u4eec\u8fd9\u513f\u83b7\u5f97\u7684\u5bc6\u94a5\uff0c\u5c31\u53ef\u4ee5\u8c03\u7528\u6211\u4eec\u7684\u63a5\u53e3\u4e86<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>&nbsp;Required request body is missing: public com.nageoffer.shortlink.project.convention.result.Result&lt;com.baomidou.mybatisplus.<\/p>\n\n\n\n<p>core.metadata.IPage&lt;com.nageoffer.shortlink.project.dto.resp.ShortLinkPageRespDTO&gt;&gt; \uff0c\u8bf7\u95ee\u9047\u5230\u8fd9\u4e2a\u9519\u8bef\u5417\uff1f\u5728admin\u91cc\u9762\u7684\u5206\u9875\u67e5\u8be2\u529f\u80fd\u62a5\u8fd9\u4e2a\u9519\u8bef\uff0c\u8c03\u7528project\u91cc\u9762\u7684\u8fd8\u80fd\u6b63\u5e38\u8fd0\u884c<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u89c6\u9891\u91cc\u9762\u8bf7\u6c42\u65f6\u7684validDate\u662f\u7a7a\u5b57\u7b26\u4e32\uff0c\u5728\u540e\u7ba1\u4e2d\u63d2\u5165\u77ed\u94fe\u63a5\u4f1a\u62a5\u9519\uff0c\u662f JSON.toJSONString \u89e3\u6790\u7684\u65e5\u671f\u683c\u5f0f\u4e0d\u5bf9\uff0c\u6dfb\u52a0\u7ea2\u6846\u4e2d\u7684\u51e0\u884c\u5373\u53ef\uff0c\u4f46\u4ecd\u7136\u5b58\u5728 bug\uff0c\"validDate\"\u4e3a\"2002-10-07T16:11:46\",\u5728\u540e\u7ba1\u4e2d\u53d1\u8d77\u8bf7\u6c42\u5199\u5165\u6570\u636e\u5e93\u662f 2002-10-08 08:11:46\uff0c\u540c\u6837\u7684 validDate \u76f4\u63a5\u901a\u8fc7\u4e2d\u53f0\u53d1\u8d77\u8bf7\u6c42\u5199\u5165\u6570\u636e\u5e93\u662f 2002-10-08 00:11:46\uff0c \u60f3\u95ee\u4e0b\uff0c\u4e3a\u4ec0\u4e48 2002-10-07T16:11:46\u30012002-10-08 08:11:46\u30012002-10-08 00:11:46\u8fd9\u4e09\u4e2a\u65f6\u95f4\u4e0d\u4e00\u81f4\uff0c\u5982\u679c\u60f3\u8981\u4e00\u81f4\uff0c\u8be5\u5982\u4f55\u5904\u7406\uff1f<\/p>\n\n\n\n<p>\u5728application.yml \u4e2d\u914d\u7f6e\u65f6\u533a\u597d\u50cf\u5c31\u597d\u4e86&nbsp;<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u4e3a\u4ec0\u4e48\u4e0d\u76f4\u63a5\u4f7f\u7528openfeign\u8fdb\u884c\u8c03\u7528\uff1f\u8fd9\u6837\u641e\u7684\u597d\u9ebb\u70e6\u554a\uff0c\u6211\u8bb0\u5f97\u4f7f\u7528openfeign\u8fdb\u884c\u672c\u5730\u8c03\u7528\u4e5f\u662f\u53ef\u4ee5\u7684\u554a\uff0c\u5730\u5740\u6539\u6210\u672c\u5730\u7684\uff0c\u4e4b\u524d\u770b\u9ed1\u9a6c\u7684\u79d1\u7684\u65f6\u5019\u6709\u4e2a\u8001\u5e08\u8fd9\u6837\u641e\u8fc7\uff0c\uff0c\uff0c\uff0c\u9a6c\u4e01\u54e5\u8fd9\u6837\u641e\u611f\u89c9\u5b9e\u5728\u662f\u592a\u81c3\u80bf\u4e86&nbsp;<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>&nbsp;\u4f7f\u7528JSON.toJSONString\u5bf9requestParam\u5bf9\u8c61\u5e8f\u5217\u5316\u4e3aJSON\u5b57\u7b26\u4e32\u540e\uff0c\u8c03\u7528HttpUtil.post\uff08\uff09\u540e\u51fa\u73b0validDate\u683c\u5f0f\u4e0d\u6b63\u786e\u7684\u95ee\u9898\u3002 \u89e3\u51b3\u65b9\u6cd5\uff1a\u5728com.nageoffer.shortlink.project.dto.req\u7684ShortLinkCreateReqDTO\u7c7b\u4e2d\u4e3avalidDate\u6dfb\u52a0@JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\",timezone = \"GMT+8\")\u5373\u53ef\u89e3\u51b3<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u62a5\u9519\u63d0\u793agid==null\uff0c\u63a5\u6536\u4e0d\u5230\u53c2\u6570\uff0c\u539f\u56e0\u662f\u5728Apifox\u4e2d\u662f\u4ee5Body\u4e2djson\u7684\u65b9\u5f0f\u63d0\u4ea4\u6570\u636e\uff0c\u7136\u540e\u628aApifox\u4e2d\u7684\u8bf7\u6c42\u6539\u4e3aPost\uff0c\u5e76\u4e14\u5c06admin\u4e2d\u7684ShortLinkController\u76f8\u5e94\u7684\u8bf7\u6c42\u6539\u4e3aPost+@RequestBody\uff0c\u6d4b\u8bd5\u901a\u8fc7\u4e86\uff1b\u540e\u9762\u53c8\u5c06Apifox\u4e2d\u7684\u8bf7\u6c42\u6539\u4e3aGet\uff0c\u5c06admin\u4e2d\u7684ShortLinkController\u76f8\u5e94\u7684\u8bf7\u6c42\u6539\u4e3aGet\u5e76\u4e14\u53bb\u6389@RequestBody\uff0c\u4e5f\u901a\u8fc7\u4e86\u6d4b\u8bd5\u3002\u6240\u4ee5\u5c31\u662f\u8bf7\u6c42\u4e0e\u8bf7\u6c42\u683c\u5f0f\u4e0d\u5339\u914d\u7684\u95ee\u9898\uff0c\u8fd9\u91cc\u4f1a\u51fa\u9519\u662f\u56e0\u4e3a@GetMapping(\"\/api\/short-link\/admin\/v1\/page\") public Result&lt;IPage&lt;LinkPageRespDTO&gt;&gt; pageLink(LinkPageReqDTO requestParam)\u662f\u8bf7\u6c42\u4e86\u4e00\u4e2a\u5bf9\u8c61\uff0c\u6240\u4ee5\u60f3\u5f53\u7136\u5c31\u7528\u4e0abody+@RequestBody \u4f46\u8fd9\u662f\u5728Spring Boot\u4e2d\uff0c\u5f53\u5728Controller\u65b9\u6cd5\u53c2\u6570\u4e2d\u4f7f\u7528\u4e00\u4e2a\u81ea\u5b9a\u4e49\u5bf9\u8c61\uff08\u5982LinkPageReqDTO\uff09\u5e76\u4e14\u6ca1\u6709\u6dfb\u52a0\u4efb\u4f55\u6ce8\u89e3\uff08\u5982@RequestParam\u6216@RequestBody\uff09\u65f6\uff0cSpring\u4f1a\u9ed8\u8ba4\u4f7f\u7528**\u53c2\u6570\u7ed1\u5b9a\uff08Data&nbsp;Binding\uff09\u673a\u5236\u6765\u81ea\u52a8\u5c06HTTP\u8bf7\u6c42\u53c2\u6570\u6620\u5c04\u5230\u8be5\u5bf9\u8c61\u7684\u5b57\u6bb5\u4e0a\u3002\u8fd9\u662fSpring MVC\u7684\u4e00\u4e2a\u7279\u6027\uff0c\u79f0\u4e3a\u547d\u4ee4\u5bf9\u8c61\uff08Command&nbsp;Object\uff09**\u7ed1\u5b9a\u3002&nbsp;<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">\u4fee\u6b63\u9519\u8bef<\/h2>\n\n\n\n<p>\u4ece&nbsp;ShortLinkPageRespDTO.java\u7684&nbsp;&nbsp; &nbsp; private Integer validDateType;\u8fd8\u6709&nbsp;private String originUrl;\u4e0d\u8981\u5199\u9519\uff08\u4e0d\u8981\u8fc7\u4e8e\u76f8\u4fe1Tab\u554a\uff09<\/p>\n\n\n\n<p>ShortLinkDO\u91cc\u9762\u662fInteger\u4e0d\u662fint\u554a<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u7b2c11\u8282\uff1a\u521b\u5efa\u7528\u6237\u540e\u9ed8\u8ba4\u6dfb\u52a0\u77ed\u94fe\u63a5\u5206\u7ec4\uff08\u4e0a\uff09<\/h2>\n\n\n\n<p>\u77ed\u94fe\u63a5\u5206\u7ec4\u7684\u4e00\u4e2a\u4e8b\u60c5\u3002\u5f53\u6211\u4eec\u7528\u6237\u6ce8\u518c\u5b8c\u6210\u4e4b\u540e\uff0c\u6211\u4eec\u80af\u5b9a\u662f\u8981\u6709\u4e00\u4e2a\u9ed8\u8ba4\u7684\u77ed\u8fde\u63a5\u5206\u7ec4\u7684\uff0c\u56e0\u4e3a\u5982\u679c\u8bf4\u4f60\u6ca1\u6709\u77ed\u94fe\u63a5\u5206\u7ec4\uff0c\u5b83\u80af\u5b9a\u5c31\u662f\u8bf4\u5b83\u6ca1\u529e\u6cd5\u8fdb\u884c\u76f8\u5e94\u7684\u77ed\u94fe\u63a5\u7684\u521b\u5efa\uff0c\u56e0\u4e3a\u6211\u4eec\u77ed\u94fe\u63a5\u5206\u7ec4\u5728\u521b\u5efa\u77ed\u94fe\u63a5\u7684\u65f6\u5019\u662f\u5fc5\u586b\u7684\u4e5f\u5c31\u662f\u8bf4\u4f60\u5728\u767b\u5f55\u8fc7\u7a0b\u4e4b\u540e\uff0c\u5b83\u8981\u6709\u4e00\u4e2a\u9ed8\u8ba4\u7684\u4e00\u4e2a\u53eb\u505a\u9ed8\u8ba4\u5206\u7ec4\u7684\u4e00\u4e2a\u5c31\u662f\u5206\u7ec4\u7684\u8fd9\u6761\u8bb0\u5f55\uff0c\u6240\u4ee5\u8bf4\u6211\u4eec\u5728\u7528\u6237\u521b\u5efa\u5b8c\uff0c\u6211\u4eec\u5c31\u8981\u53bb\u6267\u884c\u8fd9\u4e2a\u64cd\u4f5c\u3002<\/p>\n\n\n\n<p>\u8fd9\u6837\u7684\u8bdd\u6211\u4eec\u9996\u5148\u5bf9\u5427\uff0c\u6211\u4eec\u9700\u8981\u8003\u8651\u7684\u7b2c\u4e00\u4e2a\u4e8b\u60c5\u7528\u6237\u90fd\u5206\u8868\u4e86\uff0c\u4f60\u5982\u679c\u8bf4\u77ed\u94fe\u63a5\u5206\u7ec4\uff0c\u4f60\u5982\u679c\u8981\u505a\u7684\u8bdd\uff0c\u4ed6\u80af\u5b9a\u4e5f\u662f\u8981\u5206\u8868\u7684\uff0c\u6240\u4ee5\u8bf4\u6211\u4eec\u9996\u5148\u8981\u5bf9\u77ed\u94fe\u63a5\u8fdb\u884c\u5206\u7ec4\uff0c\u7528\u6237\u5bf9\u5427\uff1f\u4f60\u5982\u679c\u7528\u6237\u90fd\u5df2\u7ecf\u5206\u4e8616\u5f20\u8868\uff0c\u5982\u679c\u8bf4\u77ed\u65f6\u95f4\u5206\u8868\uff0c\u53ea\u80fd\u77ed\u94fe\u63a5\u5206\u7ec4\uff0c\u5982\u679c\u5206\u8868\u53ea\u80fd\u6bd4\u4ed6\u591a\u4e0d\u80fd\u6bd4\u4ed6\u5c11\uff0c\u56e0\u4e3a\u4f60\u4e00\u4e2a\u7528\u6237\u81f3\u5c11\u6709\u4e00\u4e2a\u77ed\u94fe\u63a5\u5206\u7ec4\uff0c1\u4e2a\u7528\u6237\u591a\u7684\u8bdd\uff0c\u6211\u4eec\u9ed8\u8ba4\u5b83\u8bbe\u7f6e\u5b83\u53ef\u4ee5\u6700\u591a\u670910\u4e2a\uff0c\u6240\u4ee5\u8bf4\u6211\u4eec\u5c3d\u91cf\u53bb\u628a\u5206\u7ec4\u8bbe\u7f6e\u7684\u5206\u771f\u5b9e\u53bb\u5206\u8868\u7684\u8bdd\u8981\u8bbe\u7f6e\u7684\u5927\u4e00\u4e9b\uff0c\u4f46\u662f\u56e0\u4e3a\u6211\u4eec\u73b0\u5728\u662f\u5728\u6d4b\u8bd5\uff0c\u6240\u4ee5\u8bf4\u4e5f\u662f\u520616\u4e2a\u4fdd\u6301\u4e00\u81f4\uff0c\u56e0\u4e3a\u4f60\u5982\u679c\u8bf4\u5728\u6211\u4eec\u5b9e\u6218\u91cc\u9762\u53bb\u5199\u5bf9\u5e94\u7684\u5206\u8868\u6570\u592a\u591a\u7684\u8bdd\uff0c\u4f60\u6570\u636e\u5e93\u5c55\u793a\u7684\u5c31\u6bd4\u8f83\u9ebb\u70e6\u4e00\u70b9\uff0c\u6240\u4ee5\u8bf4\u6211\u4eec\u5c31\u5148\u520616\u4e2a\uff0c\u5206\u8868\u7684\u8bdd\uff0c\u6211\u4eec\u8fd9\u91cc\u8fd8\u662f\u8001\u6837\u5b50\uff0c\u6211\u4eec\u53bb\u521b\u5efa\u4e00\u4e0b\u5148\u521b\u5efa\u4e00\u4e0b\u6211\u4eec\u7684\u5206\u8868<\/p>\n\n\n\n<p>\u4e3at_group\u5206\u8868&nbsp;\uff0c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.nageoffer.shortlink.admin.test;\n\npublic class UserTableShardingTest {\n\n    public static final String SQL = \"CREATE TABLE `t_group_%d` (\\n\" +\n            \"  `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ID',\\n\" +\n            \"  `gid` varchar(32) DEFAULT NULL COMMENT '\u5206\u7ec4\u6807\u8bc6',\\n\" +\n            \"  `name` varchar(64) DEFAULT NULL COMMENT '\u5206\u7ec4\u540d\u79f0',\\n\" +\n            \"  `username` varchar(256) DEFAULT NULL COMMENT '\u521b\u5efa\u5206\u7ec4\u7528\u6237\u540d',\\n\" +\n            \"  `sort_order` int DEFAULT NULL COMMENT '\u5206\u7ec4\u6392\u5e8f',\\n\" +\n            \"  `create_time` datetime DEFAULT NULL COMMENT '\u521b\u5efa\u65f6\u95f4',\\n\" +\n            \"  `update_time` datetime DEFAULT NULL COMMENT '\u4fee\u6539\u65f6\u95f4',\\n\" +\n            \"  `del_flag` tinyint(1) DEFAULT NULL COMMENT '\u5220\u9664\u6807\u8bc6 0\uff1a\u672a\u5220\u9664 1\uff1a\u5df2\u5220\u9664',\\n\" +\n            \"  PRIMARY KEY (`id`),\\n\" +\n            \"  UNIQUE KEY `idx_unique_username_gid` (`gid`,`username`) USING BTREE\\n\" +\n            \") ENGINE=InnoDB AUTO_INCREMENT=1924109143078203394 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;\";\n\n    public static void main(String&#91;] args) {\n        for (int i = 0; i &lt; 16; i++) {\n            System.out.printf((SQL) + \"%n\", i);\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u7528\u4ec0\u4e48\u6765\u5206\u952e\u5462\uff1f\u80af\u5b9a\u662f\u4e0d\u80fd\u7528gid\u7684\uff0c\u6211\u67e5\u5f53\u524d\u7528\u6237\u4e0b\u7684\u6240\u6709\u7684\u77ed\u94fe\u63a5\u5206\u7ec4\u6ca1\u6709gid\u53ea\u6709username\uff0c\u6240\u4ee5\u8bf4\u662fusernname\u3002\u4fee\u6539shardingsphere-config-dev.yaml<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># \u6570\u636e\u6e90\u96c6\u5408\ndataSources:\n  ds_0:\n    dataSourceClassName: com.zaxxer.hikari.HikariDataSource\n    driverClassName: com.mysql.cj.jdbc.Driver\n    jdbcUrl: jdbc:mysql:\/\/127.0.0.1:3306\/link?useUnicode=true&amp;characterEncoding=UTF-8&amp;rewriteBatchedStatements=true&amp;allowMultiQueries=true&amp;serverTimezone=Asia\/Shanghai\n    username: root\n    password: root\n\nrules:\n  - !SHARDING\n    tables:\n      # \u771f\u5b9e\u6570\u636e\u8282\u70b9\uff0c\u6bd4\u5982\u6570\u636e\u5e93\u6e90\u4ee5\u53ca\u6570\u636e\u5e93\u5728\u6570\u636e\u5e93\u4e2d\u771f\u5b9e\u5b58\u5728\u7684\n      t_user:\n        # \u5206\u8868\u7b56\u7565\n        actualDataNodes: ds_0.t_user_${0..15}\n        tableStrategy:\n          # \u7528\u4e8e\u5355\u5206\u7247\u952e\u7684\u6807\u51c6\u5206\u7247\u573a\u666f\n          standard:\n            # \u5206\u7247\u952e\n            shardingColumn: username\n            # \u5206\u7247\u7b97\u6cd5\uff0c\u5bf9\u5e94 rules[0].shardingAlgorithms\n            shardingAlgorithmName: user_table_hash_mod\n      t_group:\n        actualDataNodes: ds_0.t_group_${0..15}\n        tableStrategy:\n          standard:\n            shardingColumn: username\n            shardingAlgorithmName: group_table_hash_mod\n    # \u5206\u7247\u7b97\u6cd5\n    shardingAlgorithms:\n      # \u6570\u636e\u8868\u5206\u7247\u7b97\u6cd5\n      user_table_hash_mod:\n        # \u6839\u636e\u5206\u7247\u952e Hash \u5206\u7247\n        type: HASH_MOD\n        # \u5206\u7247\u6570\u91cf\n        props:\n          sharding-count: 16\n      group_table_hash_mod:\n        type: HASH_MOD\n        props:\n          sharding-count: 16\n\n  - !ENCRYPT\n    # \u52a0\u5bc6\u8868\u96c6\u5408\uff08\u9876\u5c42\uff09\n    tables:\n      # \u7528\u6237\u8868\n      t_user:\n        # \u7528\u6237\u8868\u4e2d\u54ea\u4e9b\u5b57\u6bb5\u9700\u8981\u8fdb\u884c\u52a0\u5bc6\n        columns:\n          # \u624b\u673a\u53f7\u5b57\u6bb5\uff0c\u903b\u8f91\u5b57\u6bb5\uff0c\u4e0d\u4e00\u5b9a\u662f\u5728\u6570\u636e\u5e93\u4e2d\u771f\u5b9e\u5b58\u5728\n          phone:\n            # \u624b\u673a\u53f7\u5b57\u6bb5\u5b58\u50a8\u7684\u5bc6\u6587\u5b57\u6bb5\uff0c\u8fd9\u4e2a\u662f\u6570\u636e\u5e93\u4e2d\u771f\u5b9e\u5b58\u5728\u7684\u5b57\u6bb5\n            cipherColumn: phone\n            encryptorName: common_encryptor\n          mail:\n            cipherColumn: mail\n            encryptorName: common_encryptor\n        # \u662f\u5426\u6309\u7167\u5bc6\u6587\u5b57\u6bb5\u67e5\u8be2\n        queryWithCipherColumn: true\n\n    # \u52a0\u5bc6\u7b97\u6cd5\u5b9a\u4e49\uff08\u9876\u5c42\uff09\n    encryptors:\n      common_encryptor:\n        # \u52a0\u5bc6\u7b97\u6cd5\u7c7b\u578b\n        type: AES\n        props:\n          # AES \u52a0\u5bc6\u5bc6\u94a5\n          aes-key-value: d6oadClrrb9A3GWo\n\nprops:\n  sql-show: true<\/pre>\n\n\n\n<p>\u7531\u4e8e\u90a3\u4e2a\u5f88\u9ebb\u70e6\u554a\uff0c\u6211\u628aredis\u6e05\u7a7a\u4e86\uff0c\u6211\u4eec\u91cd\u65b0\u6ce8\u518c\u4e00\u4e2a\u7528\u6237<\/p>\n\n\n\n<p>\u4f18\u5316\u7528\u6237\u65b0\u589e\u91cd\u590d\u63d0\u793a\u62a5\u9519\uff1aUserServiceImpl\u4fee\u6539\u5982\u4e0b<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">try {\n    if (lock.tryLock()) {\n        try {\n            int inserted = baseMapper.insert(BeanUtil.toBean(requestParam, UserDO.class));\n            if (inserted &lt; 1) {\n                throw new ClientException(USER_SAVE_ERROR);\n            }\n        } catch (DuplicateKeyException ex) {\n            throw new ClientException(USER_EXIST);\n        }\n        userRegisterCachePenetrationBloomFilter.add(requestParam.getUsername());\n        return;\n    }\n    throw new ClientException(USER_NAME_EXIST);\n} finally {\n    lock.unlock();\n}<\/pre>\n\n\n\n<p>&nbsp;\u4fe1\u606f\u5982\u4e0b\uff1a\u8bf7\u6c42\u5934\u4e5f\u8981\u914d<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n    \"username\":\"test529\",\n    \"password\":\"test\",\n    \"realName\":\"\u6d4b\u8bd5\",\n    \"phone\":\"15198765432\",\n    \"mail\":\"114514@qq.com\"\n}\n\"token\": \"6de85325-110a-4c3a-9687-2c3867778024\"<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><img loading=\"lazy\" decoding=\"async\" height=\"187\" width=\"614\" src=\"https:\/\/i-blog.csdnimg.cn\/direct\/201dd46f9aec4282aeff5cb50f454665.png\" alt=\"\"><\/h2>\n\n\n\n<p>header\u53ea\u670911\u4e2a\uff0c\u63a5\u53e3\u4e5f\u8981\u8f93\u5bf9\u554a&nbsp;<\/p>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" height=\"890\" width=\"1250\" src=\"https:\/\/i-blog.csdnimg.cn\/direct\/8fd0d3ddb281418e84a2cc0aee096fed.png\" alt=\"\"><\/p>\n\n\n\n<p>\u00a0\u63d2\u5165\u52306\u8868\u91cc\u9762\u4e86\uff0c\u6211\u4eec\u770b\u6570\u636e\u5e93\u5730\u533a\u6210\u529f\u4e86\uff1b\u6211\u4eec\u5728\u65b0\u5efa\u4e00\u4e2a\u201c\u6d4b\u8bd5\u5206\u7ec42\u201d\uff0c\u67e5\u8be2\u5206\u7ec4\u96c6\u5408\uff0c\u51fa\u73b0\u4e86<img loading=\"lazy\" decoding=\"async\" height=\"1072\" width=\"1230\" src=\"https:\/\/i-blog.csdnimg.cn\/direct\/3d75805b465a4cbf9d0689846e980a78.png\" alt=\"\"><\/p>\n\n\n\n<p>username\u662f\u4e0d\u5fc5\u8981\u7684\u5728&nbsp;ShortLinkGroupRespDTO.java\u5220\u9664\u4ed6\uff0c\u6dfb\u52a0\u4e00\u4e2a\u5206\u7ec4\u4e0b\u77ed\u94fe\u63a5\u6570\u91cfprivate String shortLinkCount;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \u4f18\u5316\u77ed\u94fe\u63a5\u5206\u7ec4\u67e5\u8be2\u8fd4\u56de\u5b9e\u4f53<\/p>\n\n\n\n<p>\u5728project\u4e2ddto\u7684resp\u521b\u5efa\u5982\u4e0b<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">package com.nageoffer.shortlink.project.dto.resp;\n\nimport lombok.Data;\n\n@Data\npublic class ShortLinkGroupCountQueryRespDTO {\n    \/**\n     * \u5206\u7ec4\u6807\u8bc6\n     *\/\n    private String gid;\n    \/**\n     * \u5f53\u524d\u5206\u7ec4\u77ed\u94fe\u63a5\u6570\u91cf\n     *\/\n    private Integer shortLinkCount;\n} &nbsp;<\/pre>\n\n\n\n<p>&nbsp;ShortLinkController\uff0cservice\uff0cimpl\u4fee\u6539\u5982\u4e0b<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\/**\n * \u67e5\u8be2\u77ed\u94fe\u63a5\u5206\u7ec4\u5185\u94fe\u63a5\u6570\u91cf\n *\/\n@GetMapping(\"\/api\/short-link\/v1\/count\")\npublic Result&lt;List&lt;ShortLinkGroupCountQueryRespDTO&gt;&gt; listGroupShortLinkCount(List&lt;String&gt;requestParam) {\n    return Results.success(shortLinkService.listGroupShortLinkCount(requestParam));\n}\n<\/pre>\n\n\n\n<pre class=\"wp-block-preformatted\">\/**\n * \u67e5\u8be2\u77ed\u94fe\u63a5\u5206\u7ec4\u5185\u6570\u91cf\n * @param requestParam \u67e5\u8be2\u77ed\u94fe\u63a5\u5206\u7ec4\u5185\u6570\u91cf\u8bf7\u6c42\u53c2\u6570\n * @return \u67e5\u8be2\u77ed\u94fe\u63a5\u5206\u7ec4\u5185\u6570\u91cf\u54cd\u5e94\n *\/\nList&lt;ShortLinkGroupCountQueryRespDTO&gt; listGroupShortLinkCount(List&lt;String&gt; requestParam);<\/pre>\n\n\n\n<p>&nbsp;mp\u4e0d\u597d\u5199\uff1bgid \u662f\u4e0d\u5141\u8bb8\u53d8\u66f4\u7684<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    private final ShortLinkMapper shortLinkMapper;\n\n\n\n    @Override\n    public List&lt;ShortLinkGroupCountQueryRespDTO&gt; listGroupShortLinkCount(List&lt;String&gt; requestParam) {\n        QueryWrapper&lt;ShortLinkDO&gt; queryWrapper = Wrappers.query(new ShortLinkDO())\n                .select(\"gid as gid, count(*) as shortLinkCount\")\n                .in(\"gid\", requestParam)\n                .eq(\"enable_status\", 0)\n                .groupBy(\"gid\");\n        List&lt;Map&lt;String, Object&gt;&gt; shortLinkDOList = baseMapper.selectMaps(queryWrapper);\n        return BeanUtil.copyToList(shortLinkDOList, ShortLinkGroupCountQueryRespDTO.class);\n    }<\/code><\/pre>\n\n\n\n<p>&nbsp;\u4f18\u5316\u77ed\u94fe\u63a5\u540e\u7ba1\u8fdc\u7a0b\u8c03\u7528\u5305\u76ee\u5f55<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>&nbsp;\u6700\u540e\u8fdb\u884c\u8ba1\u6570\u67e5\u8be2\u7684\u65f6\u5019\u5b9e\u9645sql\u663e\u793a\u67e5\u8be2\u4e86create_type\u548cvalid_date_type\u5bfc\u81f4\u6700\u540e\u67e5\u8be2\u4e0d\u51fa\u6765\u7ed3\u679c\uff0c\u4f46\u6211\u5e76\u6ca1\u6709\u4f20\u8fd9\u4e24\u4e2a\u5b57\u6bb5\uff0c\u6709\u540c\u6837\u9047\u5230\u8fd9\u4e2a\u95ee\u9898\u7684\u4e48<\/p>\n\n\n\n<p>\u628aShortLinkDO\u7684enable_status\u3001create_type\u548cvalid_date_type\u5bf9\u5e94\u5c5e\u6027\u7684\u7c7b\u578b\u6539\u6210Integer\u5c31\u884c\u4e86\uff0c\u539f\u6765\u8fd9\u4e09\u4e2a\u5c5e\u6027\u90fd\u662fint\uff1a\u5728MyBatisPlus\u4e2d\uff0c\u5f53\u5b9e\u4f53\u7c7b\u7684\u5c5e\u6027\u662f\u57fa\u672c\u6570\u636e\u7c7b\u578b\uff08\u5982int\uff09\u800c\u4e0d\u662f\u5176\u5305\u88c5\u7c7b\u578b\uff08\u5982Integer\uff09\u65f6\uff0c\u53ef\u80fd\u4f1a\u9047\u5230\u4e00\u4e9b\u7279\u6b8a\u884c\u4e3a\uff0c\u5c24\u5176\u662f\u5728\u52a8\u6001SQL\u751f\u6210\u7684\u573a\u666f\u4e2d\u3002\u8fd9\u662f\u56e0\u4e3a\u57fa\u672c\u6570\u636e\u7c7b\u578b\u4e0d\u80fd\u88ab\u8d4b\u4e88null\u503c\uff0c\u800c\u5305\u88c5\u7c7b\u578b\u53ef\u4ee5\u3002 \u5f53MyBatisPlus\u4f7f\u7528AbstractWrapper\uff08\u5982QueryWrapper\uff09\u6765\u6784\u5efa\u52a8\u6001SQL\u7684where\u6761\u4ef6\u65f6\uff0c\u5b83\u4f1a\u68c0\u67e5\u5b9e\u4f53\u7c7b\u5c5e\u6027\u7684\u503c\u6765\u51b3\u5b9a\u662f\u5426\u5c06\u8be5\u6761\u4ef6\u52a0\u5165\u5230SQL\u8bed\u53e5\u4e2d\u3002\u5982\u679c\u5c5e\u6027\u662fInteger\u7c7b\u578b\u4e14\u503c\u4e3anull\uff0cMyBatisPlus\u4f1a\u7406\u89e3\u4e3a\u4f60\u4e0d\u60f3\u6839\u636e\u8fd9\u4e2a\u5b57\u6bb5\u8fc7\u6ee4\u6570\u636e\uff0c\u56e0\u6b64\u4e0d\u4f1a\u5728\u751f\u6210\u7684SQL\u4e2d\u5305\u542b\u8fd9\u4e2a\u6761\u4ef6\u3002\u4f46\u5982\u679c\u662fint\u7c7b\u578b\uff0c\u7531\u4e8e\u5b83\u4e0d\u80fd\u4e3anull\uff0c\u5728\u5b9e\u4f53\u7c7b\u5b9e\u4f8b\u5316\u65f6\uff0c\u9ed8\u8ba4\u503c\u4e3a0\uff0c\u8fd9\u53ef\u80fd\u5bfc\u81f4\u4ee5\u4e0b\u60c5\u51b5\uff1a \u5982\u679c\u4f60\u672c\u610f\u662f\u60f3\u6839\u636e\u67d0\u4e2a\u6761\u4ef6\u52a8\u6001\u5730\u51b3\u5b9a\u662f\u5426\u6dfb\u52a0\u5230\u67e5\u8be2\u4e2d\uff0c\u800c\u8fd9\u4e2a\u6761\u4ef6\u5bf9\u5e94\u7684\u5b9e\u4f53\u7c7b\u5c5e\u6027\u662fint\u7c7b\u578b\uff0c\u9ed8\u8ba4\u503c0\u4f1a\u88ab\u8bef\u89e3\u4e3a\u6709\u6548\u7684\u67e5\u8be2\u6761\u4ef6\uff0c\u5373where\u5b50\u53e5\u4e2d\u4f1a\u5305\u542b\u8fd9\u4e2a\u5b57\u6bb5\u7b49\u4e8e0\u7684\u6761\u4ef6\u3002 \u5373\u4f7f\u4f60\u4e0d\u6253\u7b97\u57fa\u4e8e\u8fd9\u4e2a\u5b57\u6bb5\u8fdb\u884c\u8fc7\u6ee4\uff0c\u56e0\u4e3a\u6ca1\u6709null\u7684\u6982\u5ff5\uff0c\u8be5\u5b57\u6bb5\u7684\u9ed8\u8ba4\u503c\uff08\u901a\u5e38\u662f0\uff09\u4f1a\u88ab\u89c6\u4e3a\u6709\u6548\u503c\u5e76\u5f71\u54cd\u67e5\u8be2\u7ed3\u679c\u3002 \u56e0\u6b64\uff0c\u4e3a\u4e86\u66f4\u7075\u6d3b\u5730\u5904\u7406\u53ef\u9009\u7684\u67e5\u8be2\u6761\u4ef6\uff0c\u63a8\u8350\u5728\u5b9e\u4f53\u7c7b\u4e2d\u4f7f\u7528\u5305\u88c5\u7c7b\u578b\uff08\u5982Integer\u3001Long\u7b49\uff09\uff0c\u8fd9\u6837\u53ef\u4ee5\u5229\u7528null\u503c\u6765\u660e\u786e\u8868\u793a\u201c\u4e0d\u8003\u8651\u6b64\u6761\u4ef6\u201d\u7684\u610f\u56fe\u3002<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>qwer\uff1a\u8fd9\u91cc\u628ausername\u4f5c\u4e3at_group\u7684\u5206\u7247\u952e\uff0c\u5728\u521b\u5efagroup\u7684\u65f6\u5019\uff0c\u968f\u673a\u751f\u6210gid\u5e76\u67e5\u627e\u6570\u636e\u5e93\u662f\u5426\u5b58\u5728\u7684\u64cd\u4f5c\u4f1a\u5bfc\u81f4\u8bfb\u6269\u6563\u626b\u63cf\u6240\u6709\u8868\u5427<\/p>\n\n\n\n<p>start&nbsp;\u56de\u590d&nbsp;qwer\uff1a\u5728\u521b\u5efagroup\u7684\u65f6\u5019\uff0c\u968f\u673a\u751f\u6210gid\u5e76\u67e5\u627e\u6570\u636e\u5e93\u7684\u65f6\u5019\uff0c\u4e0d\u662f\u628ausername\u4e5f\u4f20\u8fdb\u53bb\u4e86\u5417<\/p>\n\n\n\n<p>\u3002&nbsp;\u56de\u590d&nbsp;qwer\uff1a\u662f\u7684\uff0c\u903b\u8f91SQL\u548c\u5b9e\u9645SQL\u4e00\u6837<\/p>\n\n\n\n<p>\u82b1\u5f00\u5bcc\u8d35&nbsp;\u56de\u590d&nbsp;qwer\uff1a\u628ausername\u4f5c\u4e3at_group\u7684\u5206\u7247\u952e\uff0c\u5728\u521b\u5efagroup\u7684\u65f6\u5019\uff0c\u968f\u673a\u751f\u6210gid\u5e76\u67e5\u627e\u6570\u636e\u5e93\u5e76\u4e0d\u4f1a\u5b58\u5728\u7684\u64cd\u4f5c\u4f1a\u5bfc\u81f4\u8bfb\u6269\u6563\u626b\u63cf\u6240\u6709\u8868\uff0c\u56e0\u4e3a\u6211\u4eec\u5728\u521b\u5efa\u77ed\u94fe\u63a5\u7ec4saveGroup\u7684\u65f6\u5019\uff0c\u4ece\u6211\u4eec\u7684gid\u662f\u968f\u673a\u751f\u6210\u7684\uff0c\u4f46\u662f\u6211\u4eec\u5224\u65adgid\u662f\u5426\u5b58\u5728\u662f\u901a\u8fc7username\u548cgid\u4e00\u5757\u67e5hasGid\u7684\uff0c\u800c\u6211\u4eec\u6b64\u65f6\u4f7f\u7528username\u4f5c\u4e3a\u5206\u7247\u952e\uff0c\u56e0\u6b64\u5c31\u4e0d\u5b58\u5728\u626b\u63cf\u6240\u6709\u7684\u8868\u5224\u65adgid\u662f\u5426\u53ef\u7528\u3002 \u53ef\u4ee5\u521b\u5efa\u65b0\u7684\u77ed\u94fe\u63a5\u5206\u7ec4\u9a8c\u8bc1\u4e00\u4e0b\uff0c\u9996\u5148\u6267\u884chasGid\u5224\u65ad\u968f\u673a\u751f\u6210\u7684gid\u662f\u5426\u53ef\u7528\uff0c\u53ef\u4ee5\u770b\u5230\u6267\u884c\u7684logic sql\u548cactual sql\u4e0d\u4e00\u6837\uff0clogic sql\u662ffrom t_group\uff0c\u800cactual sql\u662ffrom t_group_x\uff0c\u56e0\u6b64\u8fdb\u4e00\u6b65\u9a8c\u8bc1\u4e86\u6ca1\u6709\u626b\u63cf\u5168\u8868\u3002<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>&nbsp;\u6211\u8bb0\u5f97\u4e4b\u524dgid\u8bbe\u7f6e\u7684\u4e0d\u662f\u5168\u5c40\u552f\u4e00\uff0c\u800c\u662f\u7528\u6237\u4e0b\u552f\u4e00\uff0c\u90a3\u4e48\u5982\u679c\u8fd9\u91cc\u4e24\u4e2a\u7528\u6237\u5de7\u5408gid\u76f8\u540c\uff0c\u662f\u600e\u4e48\u533a\u5206\u7684\u5462\uff1f\u4e0d\u4f1a\u67e5\u51fa\u9519\u8bef\u7684\u6570\u91cf\u5417\uff1fGet\uff0c\u6700\u65b0\u4ee3\u7801\u4f1a\u4f18\u5316\u8be5\u95ee\u9898<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">\u7b2c12\u8282\uff1a\u521b\u5efa\u7528\u6237\u540e\u9ed8\u8ba4\u6dfb\u52a0\u77ed\u94fe\u63a5\u5206\u7ec4\uff08\u4e0b\uff09<\/h2>\n\n\n\n<p>&nbsp;ShortLinkRemoteService.java\u65b0\u589e\u5982\u4e0b\u51fd\u6570<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\/**\n * \u67e5\u8be2\u5206\u7ec4\u77ed\u94fe\u63a5\u603b\u91cf\n * @param requestParam \u5206\u7ec4\u77ed\u94fe\u63a5\u603b\u91cf\u8bf7\u6c42\u53c2\u6570\n * @return \u67e5\u8be2\u5206\u7ec4\u77ed\u94fe\u63a5\u603b\u91cf\u54cd\u5e94\n *\/\ndefault Result&lt;List&lt;ShortLinkGroupCountQueryRespDTO&gt;&gt; listGroupShortLinkCount(List&lt;String&gt; requestParam) {\n    Map&lt;String, Object&gt; requestMap = new HashMap&lt;&gt;();\n    requestMap.put(\"requestParam\", requestParam);\n    String resultPageStr =HttpUtil.get(\"http:\/\/127.0.0.1:8001\/api\/short-link\/v1\/count\", requestMap);\n    return JSON.parseObject(resultPageStr, new TypeReference&lt;&gt;() {\n    });\n}<\/pre>\n\n\n\n<p>GroupServicelmpl.java\u5982\u4e0b&nbsp;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n    ShortLinkRemoteService shortLinkRemoteService =new ShortLinkRemoteService() {\n    };\n\n\n\n    @Override\n    public List&lt;ShortLinkGroupRespDTO&gt; listGroup(){\n\n        LambdaQueryWrapper&lt;GroupDO&gt; queryWrapper = Wrappers.lambdaQuery(GroupDO.class)\n                .eq(GroupDO::getDelFlag, 0)\n                .eq(GroupDO::getUsername,UserContext.getUsername())\n                .orderByDesc(GroupDO::getSortOrder, GroupDO::getUpdateTime);\n        List&lt;GroupDO&gt; groupDOList = baseMapper.selectList(queryWrapper);\n        Result&lt;List&lt;ShortLinkGroupCountQueryRespDTO&gt;&gt; listResult=shortLinkRemoteService.(groupDOList.stream().map(GroupDO::getGid).toList());\n        return BeanUtil.copyToList(groupDOList, ShortLinkGroupRespDTO.class);\n    }<\/code><\/pre>\n\n\n\n<p>&nbsp;\u6211\u4eec\u7684GID\u662f\u4e0d\u4f1a\u91cd\u590d\u7684\uff0c\u5982\u679c\u4e0d\u4f1a\u91cd\u590d\u7684\u8bdd\u6211\u4eec\u4e0d\u5982\u8ba9\u5b83\u8fd4\u56de\u4e00\u4e2amap\uff0cShortLinkGroupCountQueryRespDTO\u5982\u4e0b<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">package com.nageoffer.shortlink.admin.remote.dto.resp;\n@Data\npublic class ShortLinkGroupCountQueryRespDTO {\n    private String gid;\n    private Integer shortLinkCount;\n}\n<\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>    @Override\n    public List&lt;ShortLinkGroupRespDTO&gt; listGroup() {\n\n        LambdaQueryWrapper&lt;GroupDO&gt; queryWrapper = Wrappers.lambdaQuery(GroupDO.class)\n                .eq(GroupDO::getDelFlag, 0)\n                .eq(GroupDO::getUsername, UserContext.getUsername())\n                .orderByDesc(GroupDO::getSortOrder, GroupDO::getUpdateTime);\n        List&lt;GroupDO&gt; groupDOList = baseMapper.selectList(queryWrapper);\n        Result&lt;List&lt;ShortLinkGroupCountQueryRespDTO&gt;&gt; listResult = shortLinkRemoteService\n                .listGroupShortLinkCount(groupDOList.stream().map(GroupDO::getGid).toList());\n        List&lt;ShortLinkGroupRespDTO&gt; shortLinkGroupRespDTOList = BeanUtil.copyToList(groupDOList, ShortLinkGroupRespDTO.class);\n        shortLinkGroupRespDTOList.forEach(each -&gt; {\n            Optional&lt;ShortLinkGroupCountQueryRespDTO&gt; first = listResult.getData().stream()\n                    .filter(item -&gt; Objects.equals(item.getGid(), each.getGid()))\n                    .findFirst();\n            first.ifPresent(item -&gt; each.setShortLinkCount(first.get().getShortLinkCount()));\n        });\n        return shortLinkGroupRespDTOList;\n    }<\/code><\/pre>\n\n\n\n<p>&nbsp;\u91cc\u9762ShortLinkGroupRespDTO\u662f&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;private Integer shortLinkCount;\u4e0d\u662fstring<\/p>\n\n\n\n<p>\u77ed\u94fe\u63a5\u5206\u7ec4\u5217\u8868\u67e5\u8be2\u8fd4\u56de\u77ed\u94fe\u63a5\u6570\u91cf<\/p>\n\n\n\n<p>&nbsp;\u63a5\u4e0b\u6765\u521b\u5efa\u5b8c\u7528\u6237\u4e4b\u540e\u7ed9\u5bf9\u5e94\u7684\u5206\u7ec4\u8fdb\u884c\u521b\u5efa\uff0cUserServiceImpl\u4fee\u6539\u8fd9\u4e2a\u51fd\u6570<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    @Override\n    public void Register(UserRegisterReqDTO requestParam) {\n        if (!hasUsername(requestParam.getUsername())) {\n            throw new ClientException(USER_NAME_EXIST);\n        }\n        RLock lock = redissonClient.getLock(LOCK_USER_REGISTER_KEY + requestParam.getUsername());\n        try {\n            if (lock.tryLock()) {\n                try {\n                    int inserted = baseMapper.insert(BeanUtil.toBean(requestParam, UserDO.class));\n                    if (inserted &lt; 1) {\n                        throw new ClientException(USER_SAVE_ERROR);\n                    }\n                } catch (DuplicateKeyException ex) {\n                    throw new ClientException(USER_EXIST);\n                }\n                userRegisterCachePenetrationBloomFilter.add(requestParam.getUsername());\n                groupService.saveGroup(requestParam.getUsername(),\"\u9ed8\u8ba4\u5206\u7ec4\");\n                return;\n            }\n            throw new ClientException(USER_NAME_EXIST);\n        } finally {\n            lock.unlock();\n        }\n    }<\/code><\/pre>\n\n\n\n<p>feature\uff1a\u6ce8\u518c\u7528\u6237\u540e\u9ed8\u8ba4\u521b\u5efa\u5bf9\u5e94\u5206\u7ec4<\/p>\n\n\n\n<p>\u62a5\u9519\u4e86\uff0cGroupServiceImpl\u5982\u4e0b<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">@Override\npublic void saveGroup(String groupName) {\n    saveGroup(UserContext.getUsername(), groupName);\n}\n@Override\npublic void saveGroup(String username, String groupName) {\n    String gid;\n    do {\n        gid = RandomGenerator.generateRandom();\n    } while (!hasGid(username,gid));\n    GroupDO groupDO = GroupDO.builder()\n            .gid(gid)\n            .sortOrder(0)\n            .username(username)\n            .name(groupName)\n            .build();\n    baseMapper.insert(groupDO);\n}\n\nprivate boolean hasGid(String username,String gid) {\n    LambdaQueryWrapper&lt;GroupDO&gt; queryWrapper = Wrappers.lambdaQuery(GroupDO.class)\n            .eq(GroupDO::getGid, gid)\n            .eq(GroupDO::getUsername, Optional.ofNullable(username).orElse(UserContext.getUsername()));\n    GroupDO hasGroupFlag = baseMapper.selectOne(queryWrapper);\n    return hasGroupFlag == null;\n}<\/pre>\n\n\n\n<p>&nbsp;&nbsp;GroupService.java\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\/**\n * \u65b0\u589e\u77ed\u94fe\u63a5\u5206\u7ec4\n * @param groupName \u77ed\u94fe\u63a5\u5206\u7ec4\u540d\n *\/\nvoid saveGroup(String groupName);\n\n\/**\n * \u65b0\u589e\u77ed\u94fe\u63a5\u5206\u7ec4\n * @param username \u7528\u6237\u540d\n * @param groupName \u77ed\u94fe\u63a5\u5206\u7ec4\u540d\n *\/\nvoid saveGroup(String username,String groupName);<\/pre>\n\n\n\n<p>\u8fd0\u884c\u6ce8\u518c\u7528\u6237<\/p>\n\n\n\n<p>&nbsp; &nbsp; \"username\":\"test531\",<br>&nbsp; &nbsp; \"password\":\"test\",<br>&nbsp; &nbsp; \"realName\":\"\u6d4b\u8bd5\",<br>&nbsp; &nbsp; \"phone\":\"15198765432\",<br>&nbsp; &nbsp; \"mail\":\"114514@qq.com\"<\/p>\n\n\n\n<p>\u00a0\u6570\u636e\u5e93\u4e2dtest531\u7684gid\u662f 1k91Uw\uff0c\u540d\u5b57\u662f\u9ed8\u8ba4\u5206\u7ec4\uff0ctoken\u00a0\u00a078687be5-2914-4f82-b813-6c76582fdc77<img loading=\"lazy\" decoding=\"async\" height=\"80\" width=\"669\" src=\"https:\/\/i-blog.csdnimg.cn\/direct\/c4c20dbc3fda43b3bd412316ec2a6afa.png\" alt=\"\"><\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>&nbsp;Ahci\uff1a8.45\uff1a\u6bd4\u8f83\u4f18\u96c5\u7684\u5199\u6cd5 ```java public List&lt;GroupRespDTO&gt; listGroup() { LambdaQueryWrapper&lt;GroupDO&gt; queryWrapper = Wrappers.lambdaQuery(GroupDO.class) .eq(GroupDO::getUsername, UserContext.getUsername()) .orderByAsc(GroupDO::getSort) .orderByAsc(GroupDO::getUpdateTime); List&lt;GroupDO&gt; groups = baseMapper.selectList(queryWrapper); List&lt;LinkCountRespDTO&gt; gids = shortLInkRemoteService.count(groups.stream().map(GroupDO::getGid).toList()).getData(); List&lt;GroupRespDTO&gt; results = BeanUtil.copyToList(groups, GroupRespDTO.class); Map&lt;String, Integer&gt; counts = gids.stream().collect(Collectors.toMap(LinkCountRespDTO::getGid, LinkCountRespDTO::getCount)); return results.stream().peek(result -&gt; result.setCount(counts.get(result.getGid()))).toList(); } ```<\/p>\n\n\n\n<p>Zzz&nbsp;\u56de\u590d&nbsp;Ahci\uff1a\u4f18\u96c5<\/p>\n\n\n\n<p>\u9cb8&nbsp;\u56de\u590d&nbsp;Ahci\uff1aqueryWrapper \u5c11\u4e86.eq(GroupDO::getDelFlag, 0)<\/p>\n\n\n\n<p>Ahci&nbsp;\u56de\u590d&nbsp;\u9cb8\uff1a\u8fd9\u4e2a\u6211\u914d\u7f6e\u4e86\u903b\u8f91\u5220\u9664\uff0c\u8fd9\u91cc\u5c31\u4e0d\u7528\u5199\u4e86\u3002<\/p>\n\n\n\n<p>Pandakai&nbsp;\u56de\u590d&nbsp;Ahci\uff1a\u611f\u89c9\u6709bug\uff0c\u5982\u679c\u7528\u6237\u65b0\u589e\u5206\u7ec4\uff0c\u4f46\u662f\u6ca1\u6709\u65b0\u589e\u94fe\u63a5\u6570\u636e\uff0c\u4f1a\u5f97\u5230\u7a7a\u5bf9\u8c61<\/p>\n\n\n\n<p>\u521d\u5f26&nbsp;\u56de\u590d&nbsp;Pandakai\uff1acounts.getOrDefault(result.getGid(), 0)\u5c31\u53ef\u4ee5\u4e86<\/p>\n\n\n\n<p>\u70ed\u5fc3\u5e02\u6c11a&nbsp;\u56de\u590d&nbsp;Ahci\uff1a\u8fd9\u91cc\u7528Integer::sum\u4f1a\u4e0d\u4f1a\u597d\u4e00\u70b9\uff0c\u6bd5\u7adf\u5982\u679c\u51b2\u7a81\u597d\u50cf\u4f1a\u62a5\u9519 Map&lt;String, Integer&gt; gidCountMap = list.stream() .collect(Collectors.toMap(ShortLinkGroupCountQueryRespDTO::getGid, ShortLinkGroupCountQueryRespDTO::getShortLinkCount, Integer::sum, () -&gt; Maps.newHashMapWithExpectedSize(list.size())));<\/p>\n\n\n\n<p>\u6a58\u5582\u4fac\u7cd6boice&nbsp;\u56de\u590d&nbsp;Ahci\uff1a@Override public List&lt;ShortLinkGroupRespDTO&gt; listGroup() { LambdaQueryWrapper&lt;GroupDO&gt; listGroupWrapper = Wrappers.lambdaQuery(GroupDO.class) .eq(GroupDO::getDelFlag, 0) .eq(GroupDO::getUsername, UserContext.getUsername()) .orderByDesc(GroupDO::getSortOrder, GroupDO::getUpdateTime); List&lt;GroupDO&gt; groups = baseMapper.selectList(listGroupWrapper); Result&lt;Map&lt;String, ShortLinkGroupCountQueryRespDTO&gt;&gt; listResult = shortLinkRemoteService.groupCount(groups.stream().map(GroupDO::getGid).toList()); List&lt;ShortLinkGroupRespDTO&gt; shortLinkGroupResp = BeanUtil.copyToList(groups, ShortLinkGroupRespDTO.class); shortLinkGroupResp.forEach(each -&gt; each.setShortLinkCount(listResult.getData().get(each.getGid()).getShortLinkCount())); return shortLinkGroupResp; }<\/p>\n\n\n\n<p>\u6a58\u5582\u4fac\u7cd6boice&nbsp;\u56de\u590d&nbsp;Ahci\uff1a@Override public Map&lt;String, ShortLinkGroupCountQueryRespDTO&gt; groupCount(List&lt;String&gt; requestParam) { QueryWrapper&lt;ShortLinkDO&gt; shortLinkQueryWrapper = Wrappers.query(new ShortLinkDO()) .select(\"gid, count(*) as shortLinkCount\") .in(\"gid\", requestParam) .eq(\"enable_status\", 0) .groupBy(\"gid\"); List&lt;Map&lt;String, Object&gt;&gt; maps = baseMapper.selectMaps(shortLinkQueryWrapper); Map&lt;String, ShortLinkGroupCountQueryRespDTO&gt; result = new HashMap&lt;&gt;(16); maps.forEach(each -&gt; result.put((String) each.get(\"gid\"), BeanUtil.toBean(each, ShortLinkGroupCountQueryRespDTO.class))); requestParam.forEach(each -&gt; result.putIfAbsent(each, ShortLinkGroupCountQueryRespDTO.builder() .shortLinkCount(0) .gid(each) .build())); return result; }<\/p>\n\n\n\n<p>MayDay&nbsp;\u56de\u590d&nbsp;Ahci\uff1a\u6709\u4e00\u8bf4\u4e00\uff0clambda\u5199\u6cd5\u53ef\u8bfb\u6027\u592a\u5dee\u4e86<\/p>\n\n\n\n<p>\u76ae\u86cb\u7626\u8089\u7ca5\u3002&nbsp;\u56de\u590d&nbsp;MayDay\uff1a\u6ca1\u70b9\u529f\u5e95,\u8fd8\u771f\u7684\u770b\u633a\u4e45\u3002\u4f46\u662f\u8fd9\u79cd\u5199\u6cd5\u65b9\u4fbf\u592a\u591a\u4e86<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>&nbsp;\u5982\u679c\u4e24\u4e2a\u7528\u6237 \u6709\u76f8\u540c\u7684 gid \u90a3\u67e5\u8be2\u5206\u7ec4\u4e0b\u77ed\u94fe\u63a5\u6570\u91cf \u4e0d\u5c31\u6709\u95ee\u9898\u4e86\u5417<\/p>\n\n\n\n<p>\u540e\u9762\u597d\u50cf\u4f1a\u57fa\u4e8e\u5e03\u9686\u8fc7\u6ee4\u5668\u5b9e\u73b0gid\u5168\u5c40\u552f\u4e00\u5c31\u53ef\u4ee5\u4e86<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>&nbsp;\u64cd\u4f5c\u4e24\u5f20\u8868\u4e86\uff0c\u5982\u4f55\u4fdd\u8bc1\u6570\u636e\u4e00\u81f4\u6027\uff1f<\/p>\n\n\n\n<p>\u6dfb\u52a0\u4e8b\u52a1\u6ce8\u89e3\u5c31\u597d\uff0c\u4f1a\u5728\u6700\u65b0\u4ee3\u7801\u63d0\u4ea4<\/p>\n\n\n\n<p>\u8fd9\u91cc\u5206\u5e03\u5f0f\u9501\u5728\u4e8b\u52a1\u63d0\u4ea4\u524d\u91ca\u653e\u4e86\u4e0d\u4f1a\u6709\u95ee\u9898\u5417\uff1f<\/p>\n\n\n\n<p>\u8fd9\u91ccgid\u548cusername\u90fd\u5728\u63d0\u4ea4\u4e8b\u52a1\u524d\u6ce8\u518c\u4e86\u5e03\u9686\u8fc7\u6ee4\u5668\uff0c\u6240\u4ee5\u5373\u4f7f\u6ca1\u6709\u63d0\u4ea4\u4e8b\u52a1\uff0c\u4e5f\u4f1a\u88ab\u6321\u4f4f<\/p>\n<\/blockquote>\n\n\n\n<p><img loading=\"lazy\" decoding=\"async\" height=\"291\" width=\"380\" src=\"https:\/\/i-blog.csdnimg.cn\/direct\/d2f40d971cf74ef8a31bc90dfba8105c.png\" alt=\"\"><\/p>\n\n\n\n<p>&nbsp;fix:\u4fee\u590d\u7528\u6237\u521b\u5efa\u5206\u7ec4\u65f6\u7528\u6237\u4e0a\u4e0b\u6587\u83b7\u53d6\u4e0d\u5230\u7528\u6237\u4fe1\u606f \u200b<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u7b2c01\u8282\uff1a\u77ed\u94fe\u63a5\u6a21\u5757\u529f\u80fd\u5206\u6790 \u529f\u80fd\u5206\u6790 \u7b2c02\u8282\uff1a\u77ed\u94fe\u63a5\u8df3\u8f6c\u539f\u59cb\u94fe\u63a5\u539f\u7406 &nbsp; \u6bd4\u5982\u8bf4\u4f60\u5728\u67d0\u5b9d\u6216\u8005\u67d0\u4e1c\u4e0a\u9762\u53bb\u8bbf\u95ee\u4ed6\u4eec\u7684\u5546\u5bb6 &#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"emotion":"","emotion_color":"","title_style":"","license":"","footnotes":""},"categories":[3],"tags":[16,20],"class_list":["post-1181","post","type-post","status-publish","format-standard","hentry","category-3","tag-sql","tag-20"],"_links":{"self":[{"href":"https:\/\/eve2333.top\/index.php?rest_route=\/wp\/v2\/posts\/1181","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/eve2333.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/eve2333.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/eve2333.top\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/eve2333.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1181"}],"version-history":[{"count":1,"href":"https:\/\/eve2333.top\/index.php?rest_route=\/wp\/v2\/posts\/1181\/revisions"}],"predecessor-version":[{"id":1186,"href":"https:\/\/eve2333.top\/index.php?rest_route=\/wp\/v2\/posts\/1181\/revisions\/1186"}],"wp:attachment":[{"href":"https:\/\/eve2333.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1181"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/eve2333.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1181"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/eve2333.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1181"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}