{"id":1840,"date":"2025-05-30T19:13:57","date_gmt":"2025-05-30T11:13:57","guid":{"rendered":"https:\/\/note.ui11.cc\/?p=1840"},"modified":"2025-06-01T21:23:36","modified_gmt":"2025-06-01T13:23:36","slug":"%e9%bb%91%e9%a9%ac%e7%82%b9%e8%af%84","status":"publish","type":"post","link":"https:\/\/note.ui11.cc\/index.php\/2025\/05\/30\/%e9%bb%91%e9%a9%ac%e7%82%b9%e8%af%84\/","title":{"rendered":"Redis\u5b66\u4e60"},"content":{"rendered":"\n<p>\u57fa\u4e8esession\u5b9e\u73b0\u767b\u5f55<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-6-1024x552.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"552\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-6-1024x552.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1841\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>ThreadLocal\uff1a\u5b9a\u4e49<\/p>\n\n\n\n<p><code>ThreadLocal<\/code>\u662f Java \u4e2d\u7684\u4e00\u4e2a\u7ebf\u7a0b\u5c40\u90e8\u53d8\u91cf\u5de5\u5177\u7c7b\uff0c\u5b83\u4e3a\u6bcf\u4e2a\u4f7f\u7528\u8be5\u53d8\u91cf\u7684\u7ebf\u7a0b\u90fd\u63d0\u4f9b\u4e00\u4e2a\u72ec\u7acb\u7684\u53d8\u91cf\u526f\u672c\uff0c\u6bcf\u4e2a\u7ebf\u7a0b\u90fd\u53ef\u4ee5\u72ec\u7acb\u5730\u6539\u53d8\u81ea\u5df1\u7684\u526f\u672c\uff0c\u800c\u4e0d\u4f1a\u5f71\u54cd\u5176\u4ed6\u7ebf\u7a0b\u6240\u5bf9\u5e94\u7684\u526f\u672c\u3002\u53ef\u4ee5\u628a\u5b83\u7c7b\u6bd4\u6210\u6bcf\u4e2a\u7ebf\u7a0b\u90fd\u6709\u4e00\u4e2a\u5c5e\u4e8e\u81ea\u5df1\u7684\u201c\u79c1\u4eba\u50a8\u7269\u67dc\u201d\uff0c\u5b58\u653e\u5728\u91cc\u9762\u7684\u4e1c\u897f\u53ea\u6709\u81ea\u5df1\u80fd\u8bbf\u95ee\u548c\u4fee\u6539\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u5de5\u4f5c\u539f\u7406<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u6570\u636e\u5b58\u50a8<\/strong>\uff1a<code>ThreadLocal<\/code>\u5185\u90e8\u901a\u8fc7<code>ThreadLocalMap<\/code>\u6765\u5b58\u50a8\u6bcf\u4e2a\u7ebf\u7a0b\u7684\u53d8\u91cf\u526f\u672c\u3002\u6bcf\u4e2a<code>Thread<\/code>\u5bf9\u8c61\u90fd\u6709\u4e00\u4e2a<code>ThreadLocalMap<\/code>\u7c7b\u578b\u7684\u6210\u5458\u53d8\u91cf\uff0c\u5f53\u7ebf\u7a0b\u4f7f\u7528<code>ThreadLocal<\/code>\u8bbe\u7f6e\u503c\u65f6\uff0c\u5b9e\u9645\u4e0a\u662f\u5c06\u503c\u5b58\u50a8\u5230\u8be5\u7ebf\u7a0b\u7684<code>ThreadLocalMap<\/code>\u4e2d\uff0c\u5176\u4e2d<code>ThreadLocal<\/code>\u5b9e\u4f8b\u672c\u8eab\u4f5c\u4e3a\u952e\uff0c\u53d8\u91cf\u526f\u672c\u4f5c\u4e3a\u503c\u3002<\/li>\n\n\n\n<li><strong>\u8bbf\u95ee\u673a\u5236<\/strong>\uff1a\u5f53\u7ebf\u7a0b\u9700\u8981\u83b7\u53d6<code>ThreadLocal<\/code>\u53d8\u91cf\u7684\u503c\u65f6\uff0c\u5b83\u4f1a\u5148\u83b7\u53d6\u81ea\u8eab\u7684<code>ThreadLocalMap<\/code>\uff0c\u7136\u540e\u4ee5<code>ThreadLocal<\/code>\u5b9e\u4f8b\u4e3a\u952e\u4ece<code>ThreadLocalMap<\/code>\u4e2d\u67e5\u627e\u5bf9\u5e94\u7684\u503c\u3002<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u4f7f\u7528\u573a\u666f<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u6570\u636e\u5e93\u8fde\u63a5\u7ba1\u7406<\/strong>\uff1a\u5728\u591a\u7ebf\u7a0b\u73af\u5883\u4e0b\u8fdb\u884c\u6570\u636e\u5e93\u64cd\u4f5c\u65f6\uff0c\u6bcf\u4e2a\u7ebf\u7a0b\u90fd\u9700\u8981\u4e00\u4e2a\u72ec\u7acb\u7684\u6570\u636e\u5e93\u8fde\u63a5\uff0c\u4ee5\u907f\u514d\u4e0d\u540c\u7ebf\u7a0b\u4e4b\u95f4\u7684\u8fde\u63a5\u5e72\u6270\u3002\u4f7f\u7528<code>ThreadLocal<\/code>\u53ef\u4ee5\u4e3a\u6bcf\u4e2a\u7ebf\u7a0b\u521b\u5efa\u4e00\u4e2a\u72ec\u7acb\u7684\u6570\u636e\u5e93\u8fde\u63a5\u526f\u672c\uff0c\u786e\u4fdd\u7ebf\u7a0b\u5b89\u5168\u3002<\/li>\n\n\n\n<li><strong>\u4f1a\u8bdd\u7ba1\u7406<\/strong>\uff1a\u5728 Web \u5e94\u7528\u4e2d\uff0c\u6bcf\u4e2a\u7528\u6237\u7684\u4f1a\u8bdd\u4fe1\u606f\u901a\u5e38\u9700\u8981\u72ec\u7acb\u7ba1\u7406\u3002\u53ef\u4ee5\u4f7f\u7528<code>ThreadLocal<\/code>\u6765\u5b58\u50a8\u6bcf\u4e2a\u7528\u6237\u7684\u4f1a\u8bdd\u4fe1\u606f\uff0c\u4f7f\u5f97\u6bcf\u4e2a\u7ebf\u7a0b\u90fd\u80fd\u72ec\u7acb\u8bbf\u95ee\u548c\u64cd\u4f5c\u81ea\u5df1\u7684\u4f1a\u8bdd\u6570\u636e\u3002<\/li>\n\n\n\n<li><strong>\u4e8b\u52a1\u7ba1\u7406<\/strong>\uff1a\u5728\u5206\u5e03\u5f0f\u7cfb\u7edf\u4e2d\uff0c\u6bcf\u4e2a\u4e8b\u52a1\u53ef\u80fd\u9700\u8981\u72ec\u7acb\u7684\u4e0a\u4e0b\u6587\u4fe1\u606f\u3002\u901a\u8fc7<code>ThreadLocal<\/code>\u53ef\u4ee5\u4e3a\u6bcf\u4e2a\u4e8b\u52a1\u7ebf\u7a0b\u63d0\u4f9b\u72ec\u7acb\u7684\u4e8b\u52a1\u4e0a\u4e0b\u6587\uff0c\u786e\u4fdd\u4e8b\u52a1\u7684\u72ec\u7acb\u6027\u548c\u4e00\u81f4\u6027\u3002<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>public class ThreadLocalExample {\n    \/\/ \u521b\u5efa\u4e00\u4e2a ThreadLocal \u5b9e\u4f8b\n    private static final ThreadLocal&lt;Integer&gt; threadLocal = new ThreadLocal&lt;&gt;();\n\n    public static void main(String&#91;] args) {\n        \/\/ \u521b\u5efa\u4e24\u4e2a\u7ebf\u7a0b\n        Thread thread1 = new Thread(() -&gt; {\n            \/\/ \u8bbe\u7f6e\u7ebf\u7a0b 1 \u7684\u503c\n            threadLocal.set(1);\n            System.out.println(\"Thread 1: \" + threadLocal.get());\n            \/\/ \u79fb\u9664\u7ebf\u7a0b 1 \u7684\u503c\n            threadLocal.remove();\n        });\n\n        Thread thread2 = new Thread(() -&gt; {\n            \/\/ \u8bbe\u7f6e\u7ebf\u7a0b 2 \u7684\u503c\n            threadLocal.set(2);\n            System.out.println(\"Thread 2: \" + threadLocal.get());\n            \/\/ \u79fb\u9664\u7ebf\u7a0b 2 \u7684\u503c\n            threadLocal.remove();\n        });\n\n        \/\/ \u542f\u52a8\u7ebf\u7a0b\n        thread1.start();\n        thread2.start();\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u5728\u4e0a\u8ff0\u793a\u4f8b\u4e2d\uff0c<code>threadLocal<\/code>\u662f\u4e00\u4e2a<code>ThreadLocal<\/code>\u5b9e\u4f8b\uff0c\u7ebf\u7a0b 1 \u548c\u7ebf\u7a0b 2 \u5206\u522b\u8bbe\u7f6e\u4e86\u4e0d\u540c\u7684\u503c\uff0c\u5e76\u4e14\u53ef\u4ee5\u72ec\u7acb\u5730\u83b7\u53d6\u548c\u79fb\u9664\u81ea\u5df1\u7684\u503c\uff0c\u5f7c\u6b64\u4e4b\u95f4\u4e0d\u4f1a\u76f8\u4e92\u5f71\u54cd\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u6ce8\u610f\u4e8b\u9879<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u5185\u5b58\u6cc4\u6f0f\u95ee\u9898<\/strong>\uff1a\u7531\u4e8e<code>ThreadLocalMap<\/code>\u4e2d\u7684\u952e\u662f<code>ThreadLocal<\/code>\u5b9e\u4f8b\u7684\u5f31\u5f15\u7528\uff0c\u800c\u503c\u662f\u5f3a\u5f15\u7528\u3002\u5982\u679c<code>ThreadLocal<\/code>\u5b9e\u4f8b\u88ab\u5783\u573e\u56de\u6536\uff0c\u952e\u4e3a<code>null<\/code>\uff0c\u4f46\u503c\u4ecd\u7136\u5b58\u5728\uff0c\u53ef\u80fd\u4f1a\u5bfc\u81f4\u5185\u5b58\u6cc4\u6f0f\u3002\u56e0\u6b64\uff0c\u5728\u4f7f\u7528\u5b8c<code>ThreadLocal<\/code>\u540e\uff0c\u5e94\u8be5\u53ca\u65f6\u8c03\u7528<code>remove()<\/code>\u65b9\u6cd5\u6e05\u9664\u6570\u636e\u3002<\/li>\n\n\n\n<li><strong>\u4f7f\u7528\u8303\u56f4<\/strong>\uff1a<code>ThreadLocal<\/code>\u9002\u7528\u4e8e\u6bcf\u4e2a\u7ebf\u7a0b\u9700\u8981\u72ec\u7acb\u7ef4\u62a4\u81ea\u5df1\u7684\u53d8\u91cf\u526f\u672c\u7684\u573a\u666f\uff0c\u4f46\u4e0d\u9002\u5408\u9700\u8981\u5171\u4eab\u6570\u636e\u7684\u573a\u666f\u3002\u5982\u679c\u591a\u4e2a\u7ebf\u7a0b\u9700\u8981\u5171\u4eab\u6570\u636e\uff0c\u5e94\u8be5\u4f7f\u7528\u5176\u4ed6\u5e76\u53d1\u5de5\u5177\uff0c\u5982<code>Synchronized<\/code>\u5173\u952e\u5b57\u6216<code>ReentrantLock<\/code>\u3002<\/li>\n<\/ul>\n\n\n\n<p><code>ThreadLocalMap<\/code>\u7684remove\u5e76\u4e0d\u4f1a\u79fb\u9664\u6240\u6709\u7c7b\u578b\u7684\u503c\uff0c\u800c\u662f\u79fb\u9664\u8be5\u7ebf\u6027\u7684Threadmap\u5b9e\u4f8b\u7684\u503c<\/p>\n\n\n\n<p>\u6ce8\u610f\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-8-1024x626.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"626\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-8-1024x626.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1843\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-9-1024x273.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"273\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-9-1024x273.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1844\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>threadLocal\u53ea\u80fd\u4fdd\u5b58\u4e00\u4e2a\u503c\uff0c\u5982\u679c\u60f3\u8981\u4fdd\u5b58\u591a\u4e2a\u503c\u53ef\u4ee5\u7528<\/p>\n\n\n\n<p>ThreadLocal \u5b9e\u4f8b\u5728\u6bcf\u4e2a\u7ebf\u7a0b\u4e2d\u53ea\u4f1a\u5173\u8054\u4e00\u4e2a\u503c\uff0c\u800c\u4e0d\u662f\u591a\u4e2a\u503c\u3002\u4f46\u5982\u679c\u4f60\u4f7f\u7528\u7684\u662f\u50cf ThreadLocal&gt; \u8fd9\u79cd\u65b9\u5f0f\uff0c\u5728 ThreadLocal \u4e2d\u5b58\u50a8\u4e86\u4e00\u4e2a\u6620\u5c04\uff08Map\uff09\uff0c\u91cc\u9762\u6709\u591a\u4e2a\u952e\u503c\u5bf9\uff0c\u90a3\u4e48\u53ef\u4ee5\u6309\u7167\u4e0b\u9762\u7684\u65b9\u6cd5\u7cbe\u51c6\u79fb\u9664\u5176\u4e2d\u67d0\u4e2a\u503c\u3002<br>\u79fb\u9664 ThreadLocal&gt; \u4e2d\u7684\u7279\u5b9a\u503c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import java.util.HashMap;\nimport java.util.Map;\n\npublic class ThreadLocalMapValueRemoval {\n    \/\/ \u5b9a\u4e49\u4e00\u4e2a\u5b58\u50a8 Map \u7684 ThreadLocal \u5b9e\u4f8b\n    private static final ThreadLocal&lt;Map&lt;String, String&gt;&gt; threadLocalMap = ThreadLocal.withInitial(HashMap::new);\n\n    public static void main(String&#91;] args) {\n        Thread thread = new Thread(() -&gt; {\n            \/\/ \u83b7\u53d6\u5f53\u524d\u7ebf\u7a0b\u7684 Map\n            Map&lt;String, String&gt; map = threadLocalMap.get();\n            \/\/ \u5411 Map \u4e2d\u6dfb\u52a0\u4e00\u4e9b\u952e\u503c\u5bf9\n            map.put(\"key1\", \"value1\");\n            map.put(\"key2\", \"value2\");\n            map.put(\"key3\", \"value3\");\n\n            System.out.println(\"\u79fb\u9664\u524d\u7684 Map: \" + map);\n\n            \/\/ \u7cbe\u51c6\u79fb\u9664\u7279\u5b9a\u952e\u5bf9\u5e94\u7684\u503c\n            removeValueFromThreadLocalMap(\"key2\");\n\n            System.out.println(\"\u79fb\u9664\u540e\u7684 Map: \" + map);\n\n            \/\/ \u6e05\u9664 ThreadLocal \u4e2d\u7684 Map\n            threadLocalMap.remove();\n        });\n        thread.start();\n    }\n\n    public static void removeValueFromThreadLocalMap(String key) {\n        \/\/ \u83b7\u53d6\u5f53\u524d\u7ebf\u7a0b\u7684 Map\n        Map&lt;String, String&gt; map = threadLocalMap.get();\n        if (map != null) {\n            \/\/ \u79fb\u9664\u6307\u5b9a\u952e\u5bf9\u5e94\u7684\u503c\n            map.remove(key);\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<p>\u5173\u4e8esession:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Slf4j\n@Service\npublic class UserServiceImpl extends ServiceImpl&lt;UserMapper, User&gt; implements IUserService {\n\n    @Override\n    public Result sendCode(String phone, HttpSession session) {\n\/\/        1,\u6821\u9a8c\u624b\u673a\u53f7,\u8fd9\u91cc\u9a8c\u8bc1\u7684\u662f\u65e0\u6548\u7684\u624b\u673a\u683c\u5f0f\n        if(RegexUtils.isPhoneInvalid(phone)){\/\/\u5982\u679c\u662ftrue\u8bf4\u660e\u65e0\u6548\n            \/\/        2\uff0c\u5982\u679c\u4e0d\u7b26\u5408\uff0c\u8fd4\u56de\u9519\u8bef\u4fe1\u606f\n        return Result.fail(\"\u624b\u673a\u53f7\u683c\u5f0f\u9519\u8bef\uff01\");\n        }\n\/\/        \u7b26\u5408\uff0c\u751f\u6210\u9a8c\u8bc1\u5417\n        String code = RandomUtil.randomNumbers(6);\/\/\u751f\u6210\u4e00\u4e2a6\u4f4d\u968f\u673a\u6570\u5b57\n\n\/\/        \u4fdd\u5b58\u9a8c\u8bc1\u7801\u5230session\n        session.setAttribute(\"code\",code);\/\/\u4fdd\u5b58\u5230session\u7684Api\n\/\/        \u53d1\u9001\u9a8c\u8bc1\u7801\n\n        log.info(\"\u53d1\u9001\u6210\u529f{}\",code);\n\n\/\/        \u8fd4\u56deok\n\n        return Result.ok(code);\n    }\n}\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-11.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"895\" height=\"360\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-11.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1846\"  sizes=\"auto, (max-width: 895px) 100vw, 895px\" \/><\/div><\/figure>\n\n\n\n<p class=\"has-vivid-red-color has-text-color has-link-color wp-elements-8d2c4d2bbe643a9f0ef7e512f865564a\">\u5728\u4f60\u63d0\u4f9b\u7684 UserServiceImpl \u7c7b\u7684 sendCode \u65b9\u6cd5\u4e2d\uff0c\u4f1a\u6d89\u53ca\u5230 HttpSession \u7684\u4f7f\u7528\u60c5\u51b5\uff0c\u4e0b\u9762\u8be6\u7ec6\u5206\u6790\u662f\u5426\u4f1a\u521b\u5efa\u65b0\u7684 HttpSession \u4ee5\u53ca\u6574\u4e2a\u65b9\u6cd5\u7684\u6267\u884c\u903b\u8f91\uff1a<br>\u662f\u5426\u521b\u5efa\u65b0\u7684 HttpSession<br>\u5f53\u8c03\u7528 session.setAttribute(&#8220;code&#8221;, code); \u65f6\uff0c\u5982\u679c\u4f20\u5165\u7684 session \u5bf9\u8c61\u5df2\u7ecf\u5b58\u5728\uff08\u5373\u5f53\u524d\u8bf7\u6c42\u5df2\u7ecf\u5173\u8054\u4e86\u4e00\u4e2a HttpSession\uff09\uff0c\u5219\u4e0d\u4f1a\u521b\u5efa\u65b0\u7684 HttpSession\uff0c\u800c\u662f\u76f4\u63a5\u4f7f\u7528\u5df2\u6709\u7684 HttpSession \u6765\u5b58\u50a8\u9a8c\u8bc1\u7801\u3002<br>\u4f46\u5982\u679c\u5f53\u524d\u8bf7\u6c42\u8fd8\u6ca1\u6709\u5173\u8054\u4efb\u4f55 HttpSession\uff0c\u5728 Spring MVC \u4e2d\uff0c\u5f53\u4f60\u901a\u8fc7\u65b9\u6cd5\u53c2\u6570\u83b7\u53d6 HttpSession \u65f6\uff0c\u5b9e\u9645\u4e0a\u662f\u901a\u8fc7 request.getSession() \u6765\u83b7\u53d6\u7684\uff0c\u5176\u7b49\u540c\u4e8e request.getSession(true)\uff0c\u8fd9\u610f\u5473\u7740\u5982\u679c\u5f53\u524d\u8bf7\u6c42\u6ca1\u6709\u5bf9\u5e94\u7684 HttpSession\uff0c\u670d\u52a1\u5668\u4f1a\u521b\u5efa\u4e00\u4e2a\u65b0\u7684 HttpSession \u5bf9\u8c61\u3002\u6240\u4ee5\uff0c\u5982\u679c\u662f\u9996\u6b21\u8bf7\u6c42\u4e14\u6ca1\u6709\u643a\u5e26\u6709\u6548\u7684 JSESSIONID\uff0c\u5c31\u4f1a\u521b\u5efa\u4e00\u4e2a\u65b0\u7684 HttpSession \u5e76\u5b58\u50a8\u9a8c\u8bc1\u7801\u3002<\/p>\n\n\n\n<p><strong>Cookie\u548csession\u7684\u5173\u7cfb\uff1a<\/strong><\/p>\n\n\n\n<p>\u5728Web\u5f00\u53d1\u4e2d\uff0c<code>session<\/code>\u548c<code>cookie<\/code>\u90fd\u662f\u7528\u4e8e\u5728\u5ba2\u6237\u7aef\u548c\u670d\u52a1\u5668\u4e4b\u95f4\u4fdd\u5b58\u548c\u4f20\u9012\u4fe1\u606f\u7684\u673a\u5236\uff0c\u4e8c\u8005\u7d27\u5bc6\u76f8\u5173\uff0c\u540c\u65f6\u53c8\u6709\u660e\u663e\u533a\u522b\uff0c\u4ee5\u4e0b\u5c06\u4ece\u5173\u8054\u3001\u533a\u522b\u3001\u534f\u4f5c\u6d41\u7a0b\u7b49\u65b9\u9762\u8be6\u7ec6\u4ecb\u7ecd\u5b83\u4eec\u7684\u5173\u7cfb\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u5b9e\u73b0\u4f1a\u8bdd\u8ddf\u8e2a<\/strong>\uff1a<code>session<\/code>\u548c<code>cookie<\/code>\u5171\u540c\u670d\u52a1\u4e8eWeb\u5e94\u7528\u7684\u4f1a\u8bdd\u8ddf\u8e2a\u3002<code>session<\/code> \u662f\u670d\u52a1\u5668\u7aef\u8ddf\u8e2a\u7528\u6237\u4f1a\u8bdd\u72b6\u6001\u7684\u673a\u5236\uff0c\u800c<code>cookie<\/code> \u662f\u5ba2\u6237\u7aef\u5b58\u50a8\u4fe1\u606f\u7684\u65b9\u5f0f\uff0c\u4e8c\u8005\u76f8\u4e92\u914d\u5408\uff0c\u4f7f\u5f97\u670d\u52a1\u5668\u80fd\u591f\u8bc6\u522b\u4e0d\u540c\u7684\u5ba2\u6237\u7aef\uff0c\u4e3a\u7528\u6237\u63d0\u4f9b\u8fde\u7eed\u7684\u670d\u52a1\u4f53\u9a8c\u3002\u4f8b\u5982\uff0c\u5728\u4e00\u4e2a\u7535\u5546\u7f51\u7ad9\u4e2d\uff0c\u7528\u6237\u767b\u5f55\u540e\uff0c\u670d\u52a1\u5668\u901a\u8fc7<code>session<\/code> \u8bb0\u5f55\u7528\u6237\u7684\u767b\u5f55\u72b6\u6001\uff0c\u540c\u65f6\u501f\u52a9<code>cookie<\/code> \u5c06\u4f1a\u8bdd\u6807\u8bc6\u4f20\u9012\u7ed9\u5ba2\u6237\u7aef\uff0c\u540e\u7eed\u5ba2\u6237\u7aef\u6bcf\u6b21\u8bf7\u6c42\u65f6\u643a\u5e26\u8be5\u6807\u8bc6\uff0c\u670d\u52a1\u5668\u5c31\u80fd\u8bc6\u522b\u51fa\u662f\u54ea\u4e2a\u7528\u6237\u5728\u64cd\u4f5c\u3002<\/li>\n\n\n\n<li><strong>\u4f9d\u8d56\u5173\u7cfb<\/strong>\uff1a\u901a\u5e38\u60c5\u51b5\u4e0b\uff0c<code>session<\/code> \u7684\u5b9e\u73b0\u4f9d\u8d56\u4e8e<code>cookie<\/code>\u3002\u670d\u52a1\u5668\u5728\u521b\u5efa<code>session<\/code> \u540e\uff0c\u4f1a\u751f\u6210\u4e00\u4e2a\u552f\u4e00\u7684\u4f1a\u8bddID\uff08\u5982<code>JSESSIONID<\/code>\uff09\uff0c\u5e76\u901a\u8fc7<code>Set - Cookie<\/code> \u5934\u4fe1\u606f\u5c06\u8fd9\u4e2a\u4f1a\u8bddID\u4ee5<code>cookie<\/code> \u7684\u5f62\u5f0f\u53d1\u9001\u7ed9\u5ba2\u6237\u7aef\u3002\u5ba2\u6237\u7aef\u5728\u540e\u7eed\u7684\u8bf7\u6c42\u4e2d\u4f1a\u81ea\u52a8\u643a\u5e26\u8fd9\u4e2a<code>cookie<\/code>\uff0c\u670d\u52a1\u5668\u6839\u636e<code>cookie<\/code> \u4e2d\u7684\u4f1a\u8bddID\u6765\u67e5\u627e\u5bf9\u5e94\u7684<code>session<\/code>\uff0c\u4ece\u800c\u5b9e\u73b0\u4f1a\u8bdd\u7684\u8ddf\u8e2a\u548c\u7ba1\u7406\u3002<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u533a\u522b<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u5b58\u50a8\u4f4d\u7f6e<\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li><strong>session<\/strong>\uff1a<code>session<\/code> \u6570\u636e\u5b58\u50a8\u5728\u670d\u52a1\u5668\u7aef\uff0c\u670d\u52a1\u5668\u4f1a\u4e3a\u6bcf\u4e2a\u5ba2\u6237\u7aef\u521b\u5efa\u4e00\u4e2a\u72ec\u7acb\u7684<code>session<\/code> \u5bf9\u8c61\uff0c\u7528\u4e8e\u5b58\u50a8\u4e0e\u8be5\u5ba2\u6237\u7aef\u76f8\u5173\u7684\u4f1a\u8bdd\u4fe1\u606f\u3002\u4f8b\u5982\uff0c\u5728\u4e00\u4e2a\u5728\u7ebf\u8bba\u575b\u4e2d\uff0c\u670d\u52a1\u5668\u4f1a\u4e3a\u6bcf\u4e2a\u767b\u5f55\u7684\u7528\u6237\u521b\u5efa\u4e00\u4e2a<code>session<\/code>\uff0c\u5b58\u50a8\u7528\u6237\u7684\u7528\u6237\u540d\u3001\u6743\u9650\u7b49\u4fe1\u606f\u3002<\/li>\n\n\n\n<li><strong>cookie<\/strong>\uff1a<code>cookie<\/code> \u6570\u636e\u5b58\u50a8\u5728\u5ba2\u6237\u7aef\u7684\u6d4f\u89c8\u5668\u4e2d\u3002\u6d4f\u89c8\u5668\u4f1a\u6309\u7167\u670d\u52a1\u5668\u7684\u6307\u793a\uff0c\u5c06<code>cookie<\/code> \u4fe1\u606f\u4fdd\u5b58\u5728\u672c\u5730\u6587\u4ef6\u6216\u5185\u5b58\u4e2d\u3002\u6bd4\u5982\uff0c\u5f53\u7528\u6237\u8bbf\u95ee\u67d0\u4e2a\u7f51\u7ad9\u65f6\uff0c\u7f51\u7ad9\u53ef\u80fd\u4f1a\u5728\u7528\u6237\u7684\u6d4f\u89c8\u5668\u4e2d\u5b58\u50a8\u4e00\u4e2a<code>cookie<\/code>\uff0c\u8bb0\u5f55\u7528\u6237\u7684\u504f\u597d\u8bbe\u7f6e\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u5b89\u5168\u6027<\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li><strong>session<\/strong>\uff1a\u7531\u4e8e<code>session<\/code> \u6570\u636e\u5b58\u50a8\u5728\u670d\u52a1\u5668\u7aef\uff0c\u76f8\u5bf9\u6765\u8bf4\u66f4\u5b89\u5168\u3002\u670d\u52a1\u5668\u53ef\u4ee5\u5bf9<code>session<\/code> \u6570\u636e\u8fdb\u884c\u52a0\u5bc6\u3001\u9a8c\u8bc1\u7b49\u64cd\u4f5c\uff0c\u9632\u6b62\u6570\u636e\u88ab\u7be1\u6539\u6216\u7a83\u53d6\u3002\u4f8b\u5982\uff0c\u94f6\u884c\u7f51\u7ad9\u5728\u5904\u7406\u7528\u6237\u7684\u654f\u611f\u4fe1\u606f\u65f6\uff0c\u901a\u5e38\u4f1a\u4f7f\u7528<code>session<\/code> \u6765\u5b58\u50a8\u7528\u6237\u7684\u767b\u5f55\u72b6\u6001\u548c\u4ea4\u6613\u4fe1\u606f\u3002<\/li>\n\n\n\n<li><strong>cookie<\/strong>\uff1a<code>cookie<\/code> \u5b58\u50a8\u5728\u5ba2\u6237\u7aef\uff0c\u5bb9\u6613\u88ab\u7528\u6237\u6216\u6076\u610f\u7a0b\u5e8f\u8bbf\u95ee\u548c\u4fee\u6539\uff0c\u5b89\u5168\u6027\u8f83\u4f4e\u3002\u4f8b\u5982\uff0c\u4e00\u4e9b\u6076\u610f\u7f51\u7ad9\u53ef\u80fd\u4f1a\u901a\u8fc7\u811a\u672c\u8bfb\u53d6\u7528\u6237\u6d4f\u89c8\u5668\u4e2d\u7684<code>cookie<\/code> \u4fe1\u606f\uff0c\u4ece\u800c\u83b7\u53d6\u7528\u6237\u7684\u9690\u79c1\u6570\u636e\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u6570\u636e\u5927\u5c0f\u9650\u5236<\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li><strong>session<\/strong>\uff1a<code>session<\/code> \u5b58\u50a8\u5728\u670d\u52a1\u5668\u7aef\uff0c\u670d\u52a1\u5668\u5bf9<code>session<\/code> \u6570\u636e\u7684\u5927\u5c0f\u9650\u5236\u901a\u5e38\u53d6\u51b3\u4e8e\u670d\u52a1\u5668\u7684\u914d\u7f6e\u548c\u53ef\u7528\u8d44\u6e90\uff0c\u4e00\u822c\u6765\u8bf4\u53ef\u4ee5\u5b58\u50a8\u76f8\u5bf9\u8f83\u5927\u7684\u6570\u636e\u91cf\u3002<\/li>\n\n\n\n<li><strong>cookie<\/strong>\uff1a\u6bcf\u4e2a<code>cookie<\/code> \u7684\u5927\u5c0f\u901a\u5e38\u9650\u5236\u57284KB\u5de6\u53f3\uff0c\u5e76\u4e14\u6d4f\u89c8\u5668\u5bf9\u6bcf\u4e2a\u57df\u540d\u4e0b\u7684<code>cookie<\/code> \u6570\u91cf\u4e5f\u6709\u9650\u5236\uff08\u4e00\u822c\u4e3a20\u4e2a\u5de6\u53f3\uff09\u3002\u56e0\u6b64\uff0c<code>cookie<\/code> \u4e0d\u9002\u5408\u5b58\u50a8\u5927\u91cf\u7684\u6570\u636e\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u534f\u4f5c\u6d41\u7a0b<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5ba2\u6237\u7aef\u9996\u6b21\u8bf7\u6c42<\/strong>\uff1a\u5ba2\u6237\u7aef\u5411\u670d\u52a1\u5668\u53d1\u9001\u8bf7\u6c42\uff0c\u670d\u52a1\u5668\u63a5\u6536\u5230\u8bf7\u6c42\u540e\uff0c\u53d1\u73b0\u5ba2\u6237\u7aef\u6ca1\u6709\u643a\u5e26\u6709\u6548\u7684\u4f1a\u8bddID\uff08<code>cookie<\/code> \u4e2d\u6ca1\u6709<code>JSESSIONID<\/code>\uff09\uff0c\u4e8e\u662f\u521b\u5efa\u4e00\u4e2a\u65b0\u7684<code>session<\/code> \u5bf9\u8c61\uff0c\u5e76\u751f\u6210\u4e00\u4e2a\u552f\u4e00\u7684\u4f1a\u8bddID\u3002<\/li>\n\n\n\n<li><strong>\u670d\u52a1\u5668\u53d1\u9001<code>cookie<\/code><\/strong>\uff1a\u670d\u52a1\u5668\u5728\u54cd\u5e94\u4e2d\u901a\u8fc7<code>Set - Cookie<\/code> \u5934\u4fe1\u606f\u5c06\u4f1a\u8bddID\u4ee5<code>cookie<\/code> \u7684\u5f62\u5f0f\u53d1\u9001\u7ed9\u5ba2\u6237\u7aef\u3002\u4f8b\u5982\uff0c\u54cd\u5e94\u5934\u4e2d\u53ef\u80fd\u4f1a\u5305\u542b <code>Set - Cookie: JSESSIONID = 1234567890abcdef; Path=\/; HttpOnly<\/code>\u3002<\/li>\n\n\n\n<li><strong>\u5ba2\u6237\u7aef\u540e\u7eed\u8bf7\u6c42<\/strong>\uff1a\u5ba2\u6237\u7aef\u5728\u63a5\u6536\u5230<code>cookie<\/code> \u540e\uff0c\u4f1a\u5c06\u5176\u4fdd\u5b58\u5230\u672c\u5730\u3002\u5728\u540e\u7eed\u7684\u8bf7\u6c42\u4e2d\uff0c\u5ba2\u6237\u7aef\u4f1a\u81ea\u52a8\u5728\u8bf7\u6c42\u5934\u4e2d\u643a\u5e26\u8fd9\u4e2a<code>cookie<\/code> \u4fe1\u606f\u3002\u670d\u52a1\u5668\u63a5\u6536\u5230\u8bf7\u6c42\u540e\uff0c\u4ece<code>cookie<\/code> \u4e2d\u83b7\u53d6\u4f1a\u8bddID\uff0c\u7136\u540e\u6839\u636e\u4f1a\u8bddID\u67e5\u627e\u5bf9\u5e94\u7684<code>session<\/code> \u5bf9\u8c61\uff0c\u4ece\u800c\u83b7\u53d6\u8be5\u5ba2\u6237\u7aef\u7684\u4f1a\u8bdd\u4fe1\u606f\u3002<\/li>\n<\/ol>\n\n\n\n<p><strong>\u6bcf\u4e00\u4e2a\u5230\u8fbetomcat\u7684\u8bf7\u6c42\u90fd\u662f\u4e00\u4e2a\u72ec\u7acb\u7684\u7ebf\u7a0b<\/strong><\/p>\n\n\n\n<p><strong>\u767b\u5f55\u9a8c\u8bc1<\/strong>\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-12-1024x507.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"507\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-12-1024x507.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1847\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>\u62e6\u622a\u5668\u7c7b\u9700\u8981\u5b9e\u73b0\u4e00\u4e2a\u63a5\u53e3HandlerInterceptor\uff0c\u5b9e\u73b0\u63a5\u53e3\u65b9\u6cd5\u662f\uff1actrl+i<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.hmdp.utils;\n\nimport com.hmdp.dto.UserDTO;\nimport com.hmdp.entity.User;\nimport org.springframework.web.servlet.HandlerInterceptor;\n\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport javax.servlet.http.HttpSession;\n\npublic class LoginInterceptor implements HandlerInterceptor {\n\n\n    @Override\n    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {\n\/\/      \u83b7\u53d6session\n        HttpSession session = request.getSession();\n\/\/        \u83b7\u53d6session\u4e2d\u7684\u7528\u6237\n        Object user = session.getAttribute(\"user\");\n\/\/        \u5224\u65ad\u7528\u6237\u662f\u5426\u5b58\u5728\n        if(user==null){\n            \/\/        \u4e0d\u5b58\u5728\u3002\u62e6\u622a,\u8fd4\u56de\u4e00\u4e2a401\u72b6\u6001\u7801\n            response.setStatus(401);\n        return false;\n        }\n        UserHolder.saveUser((UserDTO)user);\/\/\u628auser\u7684\u4fe1\u606f\u4fdd\u5b58\u5230ThreadLocal\n        return true;\n\n    }\n\n    @Override\n    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {\n\/\/        \u79fb\u9664\u7528\u6237\u4fe1\u606f\uff0c\u907f\u514d\u6cc4\u9732\n\n        UserHolder.removeUser();\n\n    }\n}\n<\/code><\/pre>\n\n\n\n<p><strong>\u96c6\u7fa4\u7684session\u5171\u4eab\u95ee\u9898<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-14-1024x535.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"535\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-14-1024x535.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1849\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p><strong>redis\u7684\u6570\u636e\u7ed3\u6784<\/strong>\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><ol><li><strong>String\uff08\u5b57\u7b26\u4e32\uff09<\/strong><ul><li><strong>\u63cf\u8ff0<\/strong>\uff1aRedis\u6700\u57fa\u672c\u7684\u6570\u636e\u7c7b\u578b\uff0c\u662f\u4e8c\u8fdb\u5236\u5b89\u5168\u7684\uff0c\u53ef\u5b58\u653e\u4efb\u4f55\u6570\u636e\uff0c\u5982\u7ecf\u8fc7base64\u7f16\u7801\u7684\u56fe\u7247\u6216\u5e8f\u5217\u5316\u7684\u5bf9\u8c61\u7b49\u3002\u4e0d\u8fc7\uff0c\u7cfb\u7edf\u5185\u5b58\u6709\u9650\uff0c\u4e14\u5b57\u7b26\u4e32\u7c7b\u578b\u7684\u503c\u6700\u591a\u80fd\u5b58\u50a8512MB\u5b57\u8282\u7684\u5185\u5bb9\uff0c\u6240\u4ee5\u4e0d\u9002\u5408\u5b58\u5165\u8fc7\u5927\u7684\u6587\u4ef6\u3002<strong>\u4f7f\u7528\u573a\u666f<\/strong>\uff1a\u9002\u5408\u7528\u4e8e\u7f13\u5b58\u7b80\u5355\u7684\u952e\u503c\u5bf9\u6570\u636e\uff0c\u5982\u4f1a\u8bdd\u4fe1\u606f\u3001\u8ba1\u6570\u5668\u7b49\uff1b\u8fd8\u80fd\u7ed3\u5408SETNX\u547d\u4ee4\u5b9e\u73b0\u7b80\u5355\u7684\u5206\u5e03\u5f0f\u9501\u3002<strong>\u7279\u6b8a\u64cd\u4f5c<\/strong>\uff1a\u6709INCR\u3001DECR\u7b49\u64cd\u4f5c\uff0c\u53ef\u9012\u589e\u6216\u9012\u51cf\u6570\u5b57\u578b\u5b57\u7b26\u4e32\u7684\u503c\u3002\u8fd8\u5305\u62ecset\uff08\u8bbe\u7f6e\u6307\u5b9a\u7684key\u503c\uff09\u3001get\uff08\u83b7\u53d6\u6307\u5b9akey\u7684\u503c\uff09\u3001getrange\uff08\u8fd4\u56dekey\u4e2d\u5b57\u7b26\u4e32\u7684\u5b50\u5b57\u7b26\uff09\u7b49\u547d\u4ee4\u3002<\/li><\/ul><strong>List\uff08\u5217\u8868\uff09<\/strong><ul><li><strong>\u63cf\u8ff0<\/strong>\uff1a\u4e00\u4e2a\u952e\u5bf9\u5e94\u4e00\u4e2a\u53cc\u5411\u94fe\u8868\uff0c\u652f\u6301\u4ece\u5934\u90e8\u6216\u5c3e\u90e8\u6dfb\u52a0\u6216\u5f39\u51fa\u5143\u7d20\uff0c\u540c\u65f6Redis\u8fd8\u652f\u6301\u963b\u585e\u64cd\u4f5c\uff0c\u5728\u6ca1\u6709\u5143\u7d20\u65f6\u53ef\u4ee5\u963b\u585e\u7b49\u5f85\u3002<strong>\u4f7f\u7528\u573a\u666f<\/strong>\uff1a\u9002\u7528\u4e8e\u6d88\u606f\u961f\u5217\u3001\u6700\u8fd1\u6700\u5c11\u4f7f\u7528\uff08LRU\uff09\u7f13\u5b58\u3001\u5386\u53f2\u8bb0\u5f55\u3001\u52a8\u6001\u6570\u636e\u6d41\u7b49\u573a\u666f\u3002\u6bd4\u5982\u5728\u5f02\u6b65\u4efb\u52a1\u5206\u53d1\u7cfb\u7edf\u4e2d\uff0c\u53ef\u5c06\u4efb\u52a1\u653e\u5165\u961f\u5217\uff0c\u7531\u591a\u4e2a\u6d88\u8d39\u8005\u6d88\u8d39\u3002<strong>\u7279\u6b8a\u64cd\u4f5c<\/strong>\uff1aLPUSH\u3001RPUSH\u53ef\u5728\u5217\u8868\u5934\u90e8\u6216\u5c3e\u90e8\u6dfb\u52a0\u5143\u7d20\uff1bLPOP\u3001RPOP\u80fd\u4ece\u5217\u8868\u5934\u90e8\u6216\u5c3e\u90e8\u5f39\u51fa\u5143\u7d20\uff1b\u8fd8\u6709BLPOP\u3001BRPOP\u7b49\u963b\u585e\u64cd\u4f5c\u547d\u4ee4\u3002<\/li><\/ul><strong>Set\uff08\u96c6\u5408\uff09<\/strong><ul><li><strong>\u63cf\u8ff0<\/strong>\uff1a\u4e00\u4e2a\u952e\u5bf9\u5e94\u4e00\u4e2a\u65e0\u5e8f\u3001\u4e0d\u91cd\u590d\u7684\u5b57\u7b26\u4e32\u96c6\u5408\uff0c\u652f\u6301\u4ea4\u3001\u5e76\u3001\u5dee\u7b49\u96c6\u5408\u8fd0\u7b97\u3002<strong>\u4f7f\u7528\u573a\u666f<\/strong>\uff1a\u9002\u5408\u7528\u4e8e\u5b58\u50a8\u552f\u4e00\u5143\u7d20\u7684\u96c6\u5408\uff0c\u5982\u6807\u7b7e\u3001\u597d\u53cb\u5217\u8868\u7b49\u3002\u5728\u535a\u5ba2\u6216\u5546\u54c1\u7cfb\u7edf\u4e2d\uff0c\u53ef\u7528Set\u5b58\u50a8\u6587\u7ae0\u6216\u5546\u54c1\u6807\u7b7e\uff0c\u65b9\u4fbf\u5206\u7c7b\u548c\u641c\u7d22\uff1b\u5728\u793e\u4ea4\u5e94\u7528\u4e2d\uff0c\u53ef\u5229\u7528Set\u5b58\u50a8\u7528\u6237\u597d\u53cb\u5217\u8868\uff0c\u901a\u8fc7\u6c42\u4ea4\u96c6\u627e\u51fa\u5171\u540c\u597d\u53cb\u3002<strong>\u7279\u6b8a\u64cd\u4f5c<\/strong>\uff1aSADD\u53ef\u6dfb\u52a0\u5143\u7d20\u5230\u96c6\u5408\uff1bSMEMBERS\u7528\u4e8e\u83b7\u53d6\u96c6\u5408\u7684\u6240\u6709\u5143\u7d20\uff1bSINTER\u3001SUNION\u3001SDIFF\u53ef\u8fdb\u884c\u96c6\u5408\u7684\u4ea4\u96c6\u3001\u5e76\u96c6\u3001\u5dee\u96c6\u8fd0\u7b97\u3002<\/li><\/ul><strong>Hash\uff08\u54c8\u5e0c\uff09<\/strong><ul><li><strong>\u63cf\u8ff0<\/strong>\uff1a\u4e00\u4e2a\u952e\u5bf9\u5e94\u4e00\u4e2a\u5b57\u6bb5 &#8211; \u503c\u5bf9\u7684\u6620\u5c04\uff0c\u7c7b\u4f3c\u4e8e\u5b57\u5178\u6216\u5173\u8054\u6570\u7ec4\u3002<strong>\u4f7f\u7528\u573a\u666f<\/strong>\uff1a\u9002\u5408\u7528\u4e8e\u5b58\u50a8\u7ed3\u6784\u5316\u7684\u6570\u636e\uff0c\u5982\u7528\u6237\u4fe1\u606f\u3001\u4ea7\u54c1\u8be6\u60c5\u3001\u914d\u7f6e\u9879\u7b49\u3002\u53ef\u4ee5\u5c06\u7528\u6237ID\u4f5c\u4e3a\u952e\uff0c\u7528\u6237\u7684\u5c5e\u6027\uff08\u59d3\u540d\u3001\u5e74\u9f84\u3001\u6027\u522b\u7b49\uff09\u4f5c\u4e3a\u5b57\u6bb5\uff0c\u907f\u514d\u5c06\u6574\u4e2a\u7528\u6237\u5bf9\u8c61\u5e8f\u5217\u5316\u6210\u5b57\u7b26\u4e32\u3002<strong>\u7279\u6b8a\u64cd\u4f5c<\/strong>\uff1aHSET\u3001HGET\u53ef\u8bbe\u7f6e\u6216\u83b7\u53d6\u54c8\u5e0c\u4e2d\u7684\u5b57\u6bb5\u503c\uff1bHGETALL\u7528\u4e8e\u83b7\u53d6\u54c8\u5e0c\u4e2d\u6240\u6709\u5b57\u6bb5\u7684\u503c\u3002<\/li><\/ul><strong>Sorted Set\uff08\u6709\u5e8f\u96c6\u5408\uff09<\/strong><ul><li><strong>\u63cf\u8ff0<\/strong>\uff1a\u7c7b\u4f3c\u4e8e\u96c6\u5408\uff0c\u4f46\u6bcf\u4e2a\u6210\u5458\u90fd\u5173\u8054\u4e86\u4e00\u4e2a\u5206\u6570\uff0c\u7528\u4e8e\u6392\u5e8f\u3002<strong>\u4f7f\u7528\u573a\u666f<\/strong>\uff1a\u9002\u5408\u7528\u4e8e\u6392\u884c\u699c\u3001\u8bc4\u5206\u7cfb\u7edf\u3001\u65f6\u95f4\u5e8f\u5217\u6570\u636e\u7b49\u3002\u4f8b\u5982\u5728\u6e38\u620f\u4e2d\u53ef\u6839\u636e\u73a9\u5bb6\u5206\u6570\u8fdb\u884c\u6392\u540d\u3002<strong>\u7279\u6b8a\u64cd\u4f5c<\/strong>\uff1aZADD\u53ef\u6dfb\u52a0\u5143\u7d20\u5230\u6709\u5e8f\u96c6\u5408\uff1bZRANGE\u3001ZREVRANGE\u7528\u4e8e\u83b7\u53d6\u6392\u5e8f\u540e\u7684\u5143\u7d20\uff1bZSCORE\u53ef\u83b7\u53d6\u5143\u7d20\u7684\u5206\u6570\u3002<\/li><\/ul><strong>BitMap\uff08\u4f4d\u56fe\uff09<\/strong>\uff1a\u5b83\u4e0d\u662f\u4e00\u79cd\u5b9e\u9645\u7684\u6570\u636e\u7c7b\u578b\uff0c\u800c\u662f\u57fa\u4e8eString\u7c7b\u578b\u7684\u4f4d\u64cd\u4f5c\u3002\u53ef\u4ee5\u7528\u6781\u5c0f\u7684\u7a7a\u95f4\u6765\u5b58\u50a8\u5927\u91cf\u7684\u5e03\u5c14\u4fe1\u606f\uff0c\u6bd4\u5982\u8bb0\u5f55\u7528\u6237\u7684\u7b7e\u5230\u60c5\u51b5\u3002<strong>HyperLogLog<\/strong>\uff1a\u7528\u4e8e\u8fdb\u884c\u57fa\u6570\u7edf\u8ba1\u7684\u6982\u7387\u6027\u6570\u636e\u7ed3\u6784\u3002\u5b83\u80fd\u4ee5\u6781\u5c0f\u7684\u7a7a\u95f4\u5f00\u9500\uff0c\u7edf\u8ba1\u5927\u91cf\u6570\u636e\u7684\u552f\u4e00\u5143\u7d20\u6570\u91cf\uff0c\u5982\u7edf\u8ba1\u7f51\u7ad9\u7684\u65e5\u6d3b\u8dc3\u7528\u6237\u6570\u3002<strong>GEO\uff08\u5730\u7406\u7a7a\u95f4\u7d22\u5f15\uff09<\/strong>\uff1a\u53ef\u7528\u4e8e\u5b58\u50a8\u5730\u7406\u4f4d\u7f6e\u4fe1\u606f\uff0c\u5e76\u8fdb\u884c\u5730\u7406\u4f4d\u7f6e\u7684\u8ba1\u7b97\uff0c\u5982\u67e5\u627e\u9644\u8fd1\u7684\u4eba\u6216\u5730\u70b9\uff0c\u9002\u7528\u4e8e\u5916\u5356\u3001\u6253\u8f66\u7b49\u9700\u8981\u5730\u7406\u5b9a\u4f4d\u7684\u5e94\u7528\u3002<strong>Stream<\/strong>\uff1a\u662fRedis 5.0\u5f15\u5165\u7684\u4e00\u79cd\u65b0\u7684\u6570\u636e\u7c7b\u578b\uff0c\u5b83\u662f\u4e00\u4e2a\u652f\u6301\u591a\u64ad\u7684\u53ef\u6301\u4e45\u5316\u6d88\u606f\u961f\u5217\uff0c\u9002\u5408\u7528\u4e8e\u5b9e\u73b0\u6d88\u606f\u961f\u5217\u548c\u4e8b\u4ef6\u6d41\u5904\u7406\u3002<\/li><\/ol><\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-15-1024x526.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"526\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-15-1024x526.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1850\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>\u76f8\u5173\u4ee3\u7801\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Slf4j\n@Service\npublic class UserServiceImpl extends ServiceImpl&lt;UserMapper, User&gt; implements IUserService {\n@Resource\nprivate StringRedisTemplate stringRedisTemplate;\/\/\u6ce8\u5165redis\u64cd\u4f5c\u7684api\n    @Override\n    public Result sendCode(String phone, HttpSession session) {\n\/\/        1,\u6821\u9a8c\u624b\u673a\u53f7,\u8fd9\u91cc\u9a8c\u8bc1\u7684\u662f\u65e0\u6548\u7684\u624b\u673a\u683c\u5f0f\n        if(RegexUtils.isPhoneInvalid(phone)){\/\/\u5982\u679c\u662ftrue\u8bf4\u660e\u65e0\u6548\n            \/\/        2\uff0c\u5982\u679c\u4e0d\u7b26\u5408\uff0c\u8fd4\u56de\u9519\u8bef\u4fe1\u606f\n        return Result.fail(\"\u624b\u673a\u53f7\u683c\u5f0f\u9519\u8bef\uff01\");\n        }\n\/\/        \u7b26\u5408\uff0c\u751f\u6210\u9a8c\u8bc1\u5417\n        String code = RandomUtil.randomNumbers(6);\/\/\u751f\u6210\u4e00\u4e2a6\u4f4d\u968f\u673a\u6570\u5b57\n\/\/        \u4fdd\u5b58\u9a8c\u8bc1\u7801\u5230session\n\/\/        session.setAttribute(\"code\",code);\/\/\u4fdd\u5b58\u5230session\u7684Api\n\n\/\/        \u4fdd\u5b58\u9a8c\u8bc1\u7801\u5230redis,\u5e76\u8bbe\u7f6e\u6709\u6548\u671f\n        stringRedisTemplate.opsForValue().set(RedisConstants.LOGIN_CODE_KEY+phone,code,RedisConstants.LOGIN_CODE_TTL, TimeUnit.MINUTES);\n\n\/\/        \u53d1\u9001\u9a8c\u8bc1\u7801\n        log.info(\"\u53d1\u9001\u6210\u529f{}\",code);\n\/\/        \u8fd4\u56deok\n        return Result.ok(code);\n    }\n\n    @Override\n    public Result login(LoginFormDTO loginForm, HttpSession session) {\n    \/\/ 1 \u6821\u9a8c\u624b\u673a\u53f7\n        String phone = loginForm.getPhone();\n\/\/        1,\u6821\u9a8c\u624b\u673a\u53f7,\u8fd9\u91cc\u9a8c\u8bc1\u7684\u662f\u65e0\u6548\u7684\u624b\u673a\u683c\u5f0f\n        if(RegexUtils.isPhoneInvalid(phone)){\/\/\u5982\u679c\u662ftrue\u8bf4\u660e\u65e0\u6548\n            \/\/        2\uff0c\u5982\u679c\u4e0d\u7b26\u5408\uff0c\u8fd4\u56de\u9519\u8bef\u4fe1\u606f\n            return Result.fail(\"\u624b\u673a\u53f7\u683c\u5f0f\u9519\u8bef\uff01\");\n        }\n\/\/     2 \u6821\u9a8c\u9a8c\u8bc1\u7801\n\/\/        Object cacheCode = session.getAttribute(\"code\");\n\/\/\u4eceredis\u83b7\u53d6\u9a8c\u8bc1\u7801\u5e76\u6821\u9a8c\n        String cacheCode = stringRedisTemplate.opsForValue().get(RedisConstants.LOGIN_CODE_KEY + phone);\n\n        String code = loginForm.getCode();\n\/\/        if(cacheCode==null||!cacheCode.toString().equals(code)){\/\/\u5982\u679c\u503c\u662fString\u5c31\u4e0d\u9700\u8981\u7528toString()\u8fdb\u884c\u6821\u9a8c\n\/\/    3 \u4e0d\u4e00\u81f4 \u62a5\u9519\n        if(cacheCode==null||!cacheCode.equals(code)){\n\n        return Result.fail(\"\u9a8c\u8bc1\u7801\u9519\u8bef\uff01\");\n        }\n\/\/    4    \u4e00\u81f4\uff0c\u6839\u636e\u624b\u673a\u53f7\u67e5\u8be2\u7528\u6237  select *from tb_user where phone =?\n\/\/        List&lt;User&gt; phone1 = query().eq(\"phone\", phone).list();\u5982\u679c\u67e5\u51fa\u591a\u4e2a\u503c\u53ef\u4ee5\u8fd4\u56de\u4e3a\u4e00\u4e2a\u5217\u8868\n        User user = query().eq(\"phone\", phone).one();\n\/\/        \u5224\u65ad\u7528\u6237\u662f\u5426\u5b58\u5728\n        if(user==null){\n\/\/            \u4e0d\u5b58\u5728\uff0c\u521b\u5efa\u65b0\u7528\u6237\u5e76\u4fdd\u5b58\n        user=createUserWithPhone(phone);\n        }\n        \/\/1\u4fdd\u5b58\u7528\u6237\u4fe1\u606f\u5230redis\u4e2d\n        String token = UUID.randomUUID().toString(true);\n\/\/        3\u5c06user\u5bf9\u8c61\u4f5c\u4e3ahash\u5b58\u50a8\n        UserDTO userDTO = BeanUtil.copyProperties(user, UserDTO.class);\n\/\/        2\u968f\u673a\u751f\u6210\u5b57\u7b26\u4e32\u4f5c\u4e3akey,\u4f5c\u4e3a\u767b\u5f55\u4ee4\u724c\n\n          \/\/4\u5b58\u50a8.\u5c06user\u8f6c\u4e3amap\u5b58\u50a8,\u5c06userDto\u4e2d\u7684\u6570\u636e\u7c7b\u578b\u8f6c\u4e3aString\n        Map&lt;String, Object&gt; userMap = BeanUtil.beanToMap(userDTO,new HashMap&lt;&gt;(), CopyOptions.create()\n                .setIgnoreNullValue(true)\n                .setFieldValueEditor((fieldName,fieldValue)-&gt;fieldValue.toString())\n\n        );\n\n        stringRedisTemplate.opsForHash().putAll(LOGIN_USER_KEY+token,userMap);\n\n        stringRedisTemplate.expire(LOGIN_USER_KEY+token,LOGIN_USER_TTL,TimeUnit.MINUTES);\/\/\u8bbe\u7f6e\u6709\u6548\u671f\n\n\/\/        session.setAttribute(\"user\", BeanUtil.copyProperties(user, UserDTO.class));\n\/\/\u8fd4\u56detoken\n\n\n\n        return Result.ok(token);\/\/\u628atoken\u00b7\u8fd4\u56de\u7ed9\u524d\u7aef\uff0c\u524d\u7aef\u901a\u8fc7sessionStorage\u5c06token\u5b58\u50a8\u5230\u8bf7\u6c42\u5934\u4e2d\n    }\n\n    private User createUserWithPhone(String phone) {\n        User user = new User();\n        user.setPhone(phone);\n        String NickName = RandomUtil.randomString(8);\n        user.setNickName(SystemConstants.USER_NICK_NAME_PREFIX +NickName);\n        save(user);\n        log.info(\"\u65b0\u589e\u7528\u6237{}\",user);\n        return user;\n    }\n}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>public class LoginInterceptor implements HandlerInterceptor {\n\nprivate StringRedisTemplate stringRedisTemplate;\n\n    public LoginInterceptor(StringRedisTemplate stringRedisTemplate) {\n        this.stringRedisTemplate = stringRedisTemplate;\n    }\n\n    @Override\n    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {\n\/\/      \u83b7\u53d6session\n\/\/        HttpSession session = request.getSession();\n\/\/        \u83b7\u53d6session\u4e2d\u7684\u7528\u6237\n\/\/        todo :new \u83b7\u53d6\u8bf7\u6c42\u5934\u4e2d\u7684token\n        String token = request.getHeader(\"authorization\");\n        if (StringUtil.isNullOrEmpty(token)) {\n\/\/            token\u4e3a\u7a7a\uff0c\u62e6\u622a\n            response.setStatus(401);\n            return false;\n        }\n\n\/\/        Object user = session.getAttribute(\"user\");\n\/\/        \u5224\u65ad\u7528\u6237\u662f\u5426\u5b58\u5728\n        Map&lt;Object, Object&gt; userMap = stringRedisTemplate.opsForHash().entries(LOGIN_USER_KEY + token);\n        if(userMap.isEmpty()){\n            \/\/        \u4e0d\u5b58\u5728\u3002\u62e6\u622a,\u8fd4\u56de\u4e00\u4e2a401\u72b6\u6001\u7801\n            response.setStatus(401);\n        return false;\n        }\n\/\/        \u5c06usermap\u8f6c\u6362\u4e3aUserDto\n\n        UserDTO user = BeanUtil.fillBeanWithMap(userMap, new UserDTO(), false);\n        UserHolder.saveUser((UserDTO)user);\/\/\u628auser\u7684\u4fe1\u606f\u4fdd\u5b58\u5230ThreadLocal\n\n\n        \/\/\u6bcf\u6b21\u8bf7\u6c42\u90fd\u5237\u65b0\u6709\u6548\u671f\n        stringRedisTemplate.expire(LOGIN_USER_KEY+token,LOGIN_USER_TTL, TimeUnit.MINUTES);\n        return true;\n\n    }\n\n    @Override\n    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {\n\/\/        \u79fb\u9664\u7528\u6237\u4fe1\u606f\uff0c\u907f\u514d\u6cc4\u9732\n\n        UserHolder.removeUser();\n\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>\u7531\u4e8e\u8fd9\u6837\u5199\u7684\u8bdd\u8fd9\u4e2a\u62e6\u622a\u5668\u53ea\u4f1a\u62e6\u622a\u767b\u5f55\uff0c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  \"\/user\/code\",\n                \"\/shop\/**\",\n                \"\/shop-type\/**\",\n                \"\/upload\/**\",\n                \"\/voucher\/**\",\n                \"\/user\/login\",\n                \"\/blog\/hot\"<\/code><\/pre>\n\n\n\n<p>\u53ea\u4f1a\u62e6\u622a\u8fd9\u4e9b\u8def\u5f84\uff0c\u5176\u4ed6\u8def\u5f84\u4e0d\u62e6\u622a\uff0c\u8fd9\u6837\u5c31\u65e0\u6cd5\u5237\u65b0token\u4e2d\u7684\u6709\u6548\u671f\u4e86\uff0c\u89e3\u51b3\u529e\u6cd5\u5c31\u662f\u518d\u5199\u4e00\u4e2a\u62e6\u622a\u5668\uff0c\u62e6\u622a\u6240\u6709\u8def\u5f84\uff0c\u901a\u8fc7order\u65b9\u6cd5\u628a\u8fd9\u4e2a\u62e6\u622a\u5668\u653e\u5728\u767b\u5f55\u6821\u9a8c\u62e6\u622a\u5668\u524d\u9762\uff0c\u5982\u679c\u6ca1\u6709\u8bf7\u6c42\u5934\u643a\u5e26token\u5c31\u653e\u884c\uff0c\u56e0\u4e3a\u5c31\u7b97\u653e\u884c\u5728\u7b2c\u4e8c\u4e2a\u62e6\u622a\u5668\u4e5f\u4f1a\u62e6\u622a\uff0c\u7b2c\u4e00\u4e2a\u62e6\u622a\u5668\u53ea\u9700\u8981\u5237\u65b0token\uff08\u5047\u8bbe\u6709token\uff09\u60c5\u51b5\u4e0b\uff0c\u5e76\u4fdd\u5b58user\u4fe1\u606f\u5230ThreadLocal<\/p>\n\n\n\n<p>\u76f8\u5173\u4ee3\u7801\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.hmdp.config;\n\nimport com.hmdp.utils.LoginInterceptor;\nimport com.hmdp.utils.RefreshInterceptor;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.data.redis.core.StringRedisTemplate;\nimport org.springframework.web.servlet.config.annotation.InterceptorRegistry;\nimport org.springframework.web.servlet.config.annotation.WebMvcConfigurer;\n\nimport javax.annotation.Resource;\n\n@Configuration\npublic class MvcConfig implements WebMvcConfigurer {\n    @Resource\n    private StringRedisTemplate stringRedisTemplate;\n\n    @Override\n    public void addInterceptors(InterceptorRegistry registry) {\n        registry.addInterceptor(new LoginInterceptor())\/\/\u9ed8\u8ba4\u62e6\u622a\u4e00\u5207\n        .excludePathPatterns(\n                \"\/user\/code\",\n                \"\/shop\/**\",\n                \"\/shop-type\/**\",\n                \"\/upload\/**\",\n                \"\/voucher\/**\",\n                \"\/user\/login\",\n                \"\/blog\/hot\"\n\n        ).order(2);\n\n        registry.addInterceptor(new RefreshInterceptor(stringRedisTemplate)).order(0);\/\/\u9ed8\u8ba4\u62e6\u622a\u6240\u6709\u8bf7\u6c42\n\n    }\n}\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>\n\npublic class RefreshInterceptor implements HandlerInterceptor {\n\nprivate StringRedisTemplate stringRedisTemplate;\n\n    public RefreshInterceptor(StringRedisTemplate stringRedisTemplate) {\n        this.stringRedisTemplate = stringRedisTemplate;\n    }\n\n    @Override\n    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {\n\/\/      \u83b7\u53d6session\n\/\/        HttpSession session = request.getSession();\n\/\/        \u83b7\u53d6session\u4e2d\u7684\u7528\u6237\n\/\/        todo :new \u83b7\u53d6\u8bf7\u6c42\u5934\u4e2d\u7684token\n        String token = request.getHeader(\"authorization\");\n        if (StringUtil.isNullOrEmpty(token)) {\n\/\/            token\u4e3a\u7a7a\uff0c\u62e6\u622a\n            return true;\n        }\n\/\/        Object user = session.getAttribute(\"user\");\n\/\/        \u5224\u65ad\u7528\u6237\u662f\u5426\u5b58\u5728,\u6839\u636e\u952e\u53bb\u67e5\u627e\u503c\n        Map&lt;Object, Object&gt; userMap = stringRedisTemplate.opsForHash().entries(LOGIN_USER_KEY + token);\n        if(userMap.isEmpty()){\n            \/\/       \u5982\u679c\u7528\u6237\u4e3a\u7a7a\uff0c\u4e0d\u62e6\u622a\u76f4\u63a5\u653e\u884c\n\n        return true;\n        }\n\/\/        \u5c06usermap\u8f6c\u6362\u4e3aUserDto\n\n        UserDTO user = BeanUtil.fillBeanWithMap(userMap, new UserDTO(), false);\n        UserHolder.saveUser((UserDTO)user);\/\/\u628auser\u7684\u4fe1\u606f\u4fdd\u5b58\u5230ThreadLocal\n\n        \/\/\u6bcf\u6b21\u8bf7\u6c42\u90fd\u5237\u65b0\u6709\u6548\u671f\n        stringRedisTemplate.expire(LOGIN_USER_KEY+token,LOGIN_USER_TTL, TimeUnit.MINUTES);\n        return true;\n\n    }\n\n    @Override\n    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {\n\/\/        \u79fb\u9664\u7528\u6237\u4fe1\u606f\uff0c\u907f\u514d\u6cc4\u9732\n\n        UserHolder.removeUser();\n\n    }\n}\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.hmdp.utils;\n\n\n\nimport static com.hmdp.utils.RedisConstants.LOGIN_USER_KEY;\nimport static com.hmdp.utils.RedisConstants.LOGIN_USER_TTL;\n\npublic class LoginInterceptor implements HandlerInterceptor {\n\n\n\n    @Override\n    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {\n\n\n\n        \/\/todo \u5224\u65ad\u662f\u5426\u9700\u8981\u62e6\u622a\uff08ThreadLocal\u4e2d\u662f\u5426\u6709\u7528\u6237\n        if(UserHolder.getUser()==null){\n            \/\/\u6ca1\u6709\uff0c\u62e6\u622a\n            response.setStatus(401);\n            return false;\n        }\n\/\/\u6709\u7528\u6237 \u653e\u884c\n        return true;\n    }\n\n    @Override\n    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {\n\/\/        \u79fb\u9664\u7528\u6237\u4fe1\u606f\uff0c\u907f\u514d\u6cc4\u9732\n\n        UserHolder.removeUser();\n\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>\u4ec0\u4e48\u662f\u7f13\u5b58\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-17-1024x505.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"505\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-17-1024x505.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1853\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-18-1024x509.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"509\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-18-1024x509.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1854\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-19-1024x505.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"505\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-19-1024x505.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1855\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>\u5bf9\u8c61\u8f6cjson:JSONUtil.<em>toJsonStr<\/em>(shop)<\/p>\n\n\n\n<p>json\u8f6c\u5bf9\u8c61\uff1aJSONUtil.<em>toBean<\/em>(shopJson,Shop.class)<\/p>\n\n\n\n<p>\u5546\u94fa\u7f13\u5b58\u5b9e\u73b0\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@RestController\n@RequestMapping(\"\/shop-type\")\npublic class ShopTypeController {\n    @Resource\n    private StringRedisTemplate stringRedisTemplate;\n    @Resource\n    private IShopTypeService typeService;\n\n    @GetMapping(\"list\")\n    public Result queryTypeList() {\n\/\/        \u67e5\u8be2\u5e97\u94fa\u7c7b\u578b\uff0c\u67e5\u5230\u540e\u8fdb\u884c\u7f13\u5b58\n        String shopType = stringRedisTemplate.opsForValue().get(LOCK_SHOP_KEY);\n        if (StrUtil.isNotBlank(shopType)) {\n            JSONArray jsonArray = JSONUtil.parseArray(shopType);\n            List&lt;ShopType&gt; shopList = jsonArray.toList(ShopType.class);\n\n            return Result.ok(shopList);\n        }\n        \/\/redis\u91cc\u9762\u6ca1\u6709\u8fd9\u4e2a\u6570\u636e\uff0c\u53bb\u6570\u636e\u5e93\u67e5\u8be2\n        List&lt;ShopType&gt; typeList = typeService\n                .query().orderByAsc(\"sort\").list();\n\n\n\n        String shopList = JSONUtil.toJsonStr(typeList);\n        stringRedisTemplate.opsForValue().set(LOCK_SHOP_KEY,shopList,60, TimeUnit.MINUTES);\n\n\n        return Result.ok(shopList);\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>\u7f13\u5b58\u66f4\u65b0\u7b56\u7565\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-20-1024x572.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"572\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-20-1024x572.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1856\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-21-1024x466.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"466\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-21-1024x466.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1857\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-22-1024x476.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"476\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-22-1024x476.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1858\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p class=\"has-vivid-purple-color has-text-color has-link-color wp-elements-5a506b2d666209dd841403cab933ccbf\"><strong>\u7f13\u5b58\u7a7f\u900f\uff1a<\/strong>\u5e03\u9686\u8fc7\u6ee4\u6216\u8005\u7f13\u5b58\u7a7a\u5bf9\u8c61<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-24-1024x499.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"499\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-24-1024x499.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1860\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>\u7f13\u5b58\u7a7a\u5bf9\u8c61\uff1a\u5982\u679c\u6570\u636e\u5e93\u548c\u7f13\u5b58\u90fd\u6ca1\u6709\u8fd9\u4e2a\u503c\uff0c\u5c31\u628a\u7a7a\u503c\u7f13\u5b58\u5230redis\u91cc\uff0c\u53ef\u80fd\u6709\u989d\u5916\u7684\u5185\u5b58\u6d88\u8017\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u8fc7\u671f\u65f6\u95f4\u8fdb\u884c\u89e3\u51b3\uff0c\u53ef\u80fd\u4f1a\u9020\u6210\u77ed\u671f\u4e0d\u4e00\u81f4\u6027\uff08\u63a7\u5236ttl\u65f6\u95f4\u5373\u53ef\uff09\uff0c\u4e5f\u53ef\u4ee5\u5728\u65b0\u589e\u4e00\u6761\u6570\u636e\u5ba4\u4e3b\u52a8\u53bb\u66f4\u65b0<\/p>\n\n\n\n<p>\u5e03\u9686\u8fc7\u6ee4\u5668\uff1a\u5728\u5ba2\u6237\u7aef\u548credis\u4e4b\u95f4\u52a0\u5e03\u9686\u8fc7\u6ee4\u5668\uff0c\u5148\u53bb\u5e03\u9686\u8fc7\u6ee4\u5668\u91cc\u67e5\u3002\u3002\u3002\u5176\u5b9e\u5e03\u9686\u8fc7\u6ee4\u5668\u91cc\u653e\u7684\u5e76\u4e0d\u662f\u771f\u5b9e\u7684\u6570\u636e\uff0c\u800c\u662f\u6570\u636e\u7684hash\u503c\uff0c\u518d\u628ahash\u503c\u8f6c\u5316\u4e3a\u4e8c\u8fdb\u5236\u653e\u5230\u5e03\u9686\u8fc7\u6ee4\u5668\u91cc<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-25-1024x506.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"506\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-25-1024x506.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1862\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>\u7f13\u5b58\u7a7f\u900f\u95ee\u9898\uff1a\u57fa\u4e8e\u5546\u94fa\u67e5\u8be2\u5b9e\u73b0<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GetMapping(\"\/{id}\")\n    public Result queryShopById(@PathVariable(\"id\") Long id) {\n        \/\/todo \u6dfb\u52a0\u7f13\u5b58\n\/\/        1 \u8bf7\u6c42\u8fc7\u6765\uff0c\u5148\u4eceredis\u91cc\u53bb\u67e5\u8be2\u5546\u94fa\u7f13\u5b58\n        String shopJson = stringRedisTemplate.opsForValue().get(CACHE_SHOP_KEY + id);\n\/\/        \u5224\u65ad\u662f\u5426\u5b58\u5728\n        if (StrUtil.isNotBlank(shopJson)) {\/\/StrUtil.isNotBlank\u7528\u6765\u5224\u65ad\u662f\u5426\u4e3anull\u6216\u8005\u7a7a\u5b57\u7b26\u4e32\n            \/\/        2 \u5982\u679credis\u6709\uff0c\u76f4\u63a5\u8fd4\u56de\n            return Result.ok( JSONUtil.toBean(shopJson,Shop.class));\/\/\u5c06json\u683c\u5f0f\u8f6c\u5316\u4e3a\u7c7b\u5bf9\u8c61\n        }\n        if(shopJson!=null){\n            return Result.ok(\"\u5e97\u94fa\u4fe1\u606f\u4e0d\u5b58\u5728\");\n        }\n\/\/        3 \u5982\u679credis\u6ca1\u6709\uff0c\u6839\u636e\u5546\u6237id\u53bb\u6570\u636e\u5e93\u67e5\u8be2\n        Shop shop = shopService.getById(id);\n        if(shop==null){\n            \/\/\u5c06\u7a7a\u503c\u5199\u5165redis\n            stringRedisTemplate.opsForValue().set(CACHE_SHOP_KEY + id,\"null\",3, TimeUnit.MINUTES);\n\n\n            return Result.fail(\"\u4e0d\u5b58\u5728\u8be5\u5546\u6237\");\n        }\n\/\/        6\uff0c\u5b58\u5728\uff0c\u5199\u5165redis\n        stringRedisTemplate.opsForValue().set(CACHE_SHOP_KEY + id,JSONUtil.toJsonStr(shop),CACHE_SHOP_TTL, TimeUnit.MINUTES);\n\n\/\/        7\uff0c\u8fd4\u56de\n        return Result.ok(shop);\/\/\u8fd9\u4e2a\u5730\u65b9\u7684getById\u662fIService\u63d0\u4f9b\n\n    }<\/code><\/pre>\n\n\n\n<p>\u5728\u5e97\u94fa\u67e5\u8be2\u7684\u65f6\u5019\uff0c\u5982\u679c\u8fd9\u4e2a\u6839\u636eid\u5728\u7f13\u5b58\u4e2d\u6ca1\u6709\u67e5\u5230\uff0c\u5e76\u4e14\u5728\u6570\u636e\u5e93\u4e5f\u6ca1\u67e5\u5230\uff0c\u5c31\u53ef\u4ee5\u8003\u8651\u7f13\u5b58\u7a7f\u900f\u7684\u95ee\u9898\u4e86\uff0c\u53ef\u4ee5\u628a\u503c\u8bbe\u7f6e\u4e3anull<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> 3 \u5982\u679credis\u6ca1\u6709\uff0c\u6839\u636e\u5546\u6237id\u53bb\u6570\u636e\u5e93\u67e5\u8be2\n        Shop shop = shopService.getById(id);\n        if(shop==null){\n            \/\/\u5c06\u7a7a\u503c\u5199\u5165redis\n            stringRedisTemplate.opsForValue().set(CACHE_SHOP_KEY + id,\"null\",3, TimeUnit.MINUTES);\n\n\n            return Result.fail(\"\u4e0d\u5b58\u5728\u8be5\u5546\u6237\");\n        }<\/code><\/pre>\n\n\n\n<p>\u5f53\u524d\u7aef\u4f20\u6765\u5b58\u5728\u7684\u6570\u5267\u65f6\uff0c\u53ef\u4ee5\u907f\u514d\u91cd\u590d\u53bb\u67e5\u8be2\u6570\u636e\u5e93\u7684\u538b\u529b<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-27-1024x498.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"498\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-27-1024x498.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1864\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p class=\"has-black-color has-text-color has-link-color wp-elements-c8781458e7e64edd20d96f20dc8b71e9\"><strong>\u7f13\u5b58\u96ea\u5d29\uff1a<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-28-1024x510.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"510\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-28-1024x510.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1865\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p><strong>\u7f13\u5b58\u51fb\u7a7f\uff1a<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-29-1024x509.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"509\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-29-1024x509.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1866\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-30-1024x560.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"560\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-30-1024x560.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1867\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-31-1024x476.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"476\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-31-1024x476.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1868\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p><strong>\u57fa\u4e8e\u4e92\u65a5\u9501\u7684\u65b9\u5f0f\u89e3\u51b3\u7f13\u5b58\u51fb\u7a7f\u95ee\u9898<\/strong><\/p>\n\n\n\n<p>\u601d\u8def\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-32-1024x552.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"552\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-32-1024x552.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1870\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>\u5229\u7528redis\u7684setnx\u547d\u4ee4\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-34-1024x570.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"570\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-34-1024x570.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1873\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>\u5b83\u53ea\u80fd\u7ed9key\u4e0d\u5b58\u5728\u7684\u65f6\u5019\u53bb\u6267\u884c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@RestController\n@RequestMapping(\"\/shop\")\npublic class ShopController {\n@Resource\nprivate StringRedisTemplate stringRedisTemplate;\n    @Resource\n    public IShopService shopService;\n\n    \/**\n     * \u6839\u636eid\u67e5\u8be2\u5546\u94fa\u4fe1\u606f\n     * @param id \u5546\u94faid\n     * @return \u5546\u94fa\u8be6\u60c5\u6570\u636e\n     *\/\n    @GetMapping(\"\/{id}\")\n    public Result queryShopById(@PathVariable(\"id\") Long id) {\n        Shop shop = queryWithMutex(id);\n        if(shop==null){\n            return Result.fail(\"\u5e97\u94fa\u4e0d\u5b58\u5728\");\n        }\n\/\/        7\uff0c\u8fd4\u56de\n        return Result.ok(shop);\/\/\u8fd9\u4e2a\u5730\u65b9\u7684getById\u662fIService\u63d0\u4f9b\n\n    }\n    \/\/\u7f13\u5b58\u51fb\u7a7f\n    public Shop queryWithMutex( Long id) {\n        \/\/todo \u6dfb\u52a0\u7f13\u5b58\u51fb\u7a7f\n\/\/        1 \u8bf7\u6c42\u8fc7\u6765\uff0c\u5148\u4eceredis\u91cc\u53bb\u67e5\u8be2\u5546\u94fa\u7f13\u5b58\n        String shopJson = stringRedisTemplate.opsForValue().get(CACHE_SHOP_KEY + id);\n\/\/        \u5224\u65ad\u662f\u5426\u5b58\u5728\n        if (StrUtil.isNotBlank(shopJson)) {\/\/StrUtil.isNotBlank\u7528\u6765\u5224\u65ad\u662f\u5426\u4e3anull\u6216\u8005\u7a7a\u5b57\u7b26\u4e32\n            \/\/        2 \u5982\u679credis\u6709\uff0c\u76f4\u63a5\u8fd4\u56de\n            Shop shop = JSONUtil.toBean(shopJson, Shop.class);\/\/\u5c06json\u683c\u5f0f\u8f6c\u5316\u4e3a\u7c7b\u5bf9\u8c61\n            return shop;\n        }\n\/\/        \u5224\u65ad\u547d\u4e2d\u7684\u662f\u5426\u4e3a\u7a7a\u503c\n\n        if(shopJson!=null){\n            return null;\n        }\n\/\/        \u5f00\u59cb\u5b9e\u73b0\u7f13\u5b58\u91cd\u5efa\n\/\/        \u83b7\u53d6\u4e92\u65a5\u9501\n        Shop shop = null;\n        try {\n            if (!tryLock(LOCK_SHOP_KEY+id)) {\/\/\u5982\u679c\u83b7\u53d6\u9501\u5931\u8d25\n                System.out.println(Thread.currentThread()+\"\u83b7\u53d6\u9501\u5931\u8d25\u5566\uff0c\u8be5\u7ebf\u7a0b\u5c06\u8fdb\u5165\u4f11\u772050\u6beb\u79d2\");\n                    Thread.sleep(50);\n                 return queryWithMutex(id);\/\/\u505a\u4e2a\u9012\u5f52\uff0c\u5982\u679c\u6ca1\u83b7\u53d6\u5230\u9501\u5c31\u518d\u91cd\u6765\u4e00\u904d\uff0c\u5982\u679c\u83b7\u53d6\u5230\u9501\uff0c\u5c31\u8df3\u51faif\u8bed\u53e5\n            }\n            System.out.println(Thread.currentThread()+\"\u83b7\u53d6\u9501\u6210\u529f\u5566\");\n\n\/\/        \u5224\u65ad\u662f\u5426\u6210\u529f\n\/\/        \u5931\u8d25\uff0c\u4f11\u7720\u5e76\u91cd\u8bd5\n\/\/        \u6210\u529f\uff0c\u6839\u636eid\u67e5\u8be2\u6570\u636e\u5e93\n\/\/        3 \u5982\u679credis\u6ca1\u6709\uff0c\u6839\u636e\u5546\u6237id\u53bb\u6570\u636e\u5e93\u67e5\u8be2\n            shop = shopService.getById(id);\n\n            Thread.sleep(200);\/\/\u6a21\u62df\u5ef6\u8fdf\u9ad8\u5e76\u53d1\n            if(shop==null){\n                \/\/\u5c06\u7a7a\u503c\u5199\u5165redis\n                stringRedisTemplate.opsForValue().set(CACHE_SHOP_KEY + id,\"null\",3, TimeUnit.MINUTES);\n                return null;\n            }\n\/\/        6\uff0c\u5b58\u5728\uff0c\u5199\u5165redis\n            stringRedisTemplate.opsForValue().set(CACHE_SHOP_KEY + id,JSONUtil.toJsonStr(shop),CACHE_SHOP_TTL, TimeUnit.MINUTES);\n        } catch (InterruptedException e) {\n            throw new RuntimeException(e);\n        } finally {\n            \/\/        \u91ca\u653e\u4e92\u65a5\u9501\n            unLock(LOCK_SHOP_KEY+id);\n        }\n\n\/\/        7\uff0c\u8fd4\u56de\n        return shop;\/\/\u8fd9\u4e2a\u5730\u65b9\u7684getById\u662fIService\u63d0\u4f9b\n\n    }\n\/\/\u7f13\u5b58\u7a7f\u900f\n    public Shop queryWithPassThrough( Long id) {\n        \/\/todo \u6dfb\u52a0\u7f13\u5b58\n\/\/        1 \u8bf7\u6c42\u8fc7\u6765\uff0c\u5148\u4eceredis\u91cc\u53bb\u67e5\u8be2\u5546\u94fa\u7f13\u5b58\n        String shopJson = stringRedisTemplate.opsForValue().get(CACHE_SHOP_KEY + id);\n\/\/        \u5224\u65ad\u662f\u5426\u5b58\u5728\n        if (StrUtil.isNotBlank(shopJson)) {\/\/StrUtil.isNotBlank\u7528\u6765\u5224\u65ad\u662f\u5426\u4e3anull\u6216\u8005\u7a7a\u5b57\u7b26\u4e32\n            \/\/        2 \u5982\u679credis\u6709\uff0c\u76f4\u63a5\u8fd4\u56de\n            Shop shop = JSONUtil.toBean(shopJson, Shop.class);\/\/\u5c06json\u683c\u5f0f\u8f6c\u5316\u4e3a\u7c7b\u5bf9\u8c61\n            return shop;\n        }\n        if(shopJson!=null){\n            return null;\n        }\n\/\/        3 \u5982\u679credis\u6ca1\u6709\uff0c\u6839\u636e\u5546\u6237id\u53bb\u6570\u636e\u5e93\u67e5\u8be2\n        Shop shop = shopService.getById(id);\n        if(shop==null){\n            \/\/\u5c06\u7a7a\u503c\u5199\u5165redis\n            stringRedisTemplate.opsForValue().set(CACHE_SHOP_KEY + id,\"null\",3, TimeUnit.MINUTES);\n\n\n            return null;\n        }\n\/\/        6\uff0c\u5b58\u5728\uff0c\u5199\u5165redis\n        stringRedisTemplate.opsForValue().set(CACHE_SHOP_KEY + id,JSONUtil.toJsonStr(shop),CACHE_SHOP_TTL, TimeUnit.MINUTES);\n\n\/\/        7\uff0c\u8fd4\u56de\n        return shop;\/\/\u8fd9\u4e2a\u5730\u65b9\u7684getById\u662fIService\u63d0\u4f9b\n\n    }\n    \/\/\u52a0\u9501\n    private boolean tryLock(String key){\n        Boolean flag = stringRedisTemplate.opsForValue().setIfAbsent(key, \"1\", 10, TimeUnit.SECONDS);\n        return BooleanUtil.isTrue(flag);\n\n    }\n    \/\/\u653e\u9501\n    private void unLock(String key){\n      stringRedisTemplate.delete(key);\n    }\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-35-1024x522.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"522\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-35-1024x522.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1874\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>\u5229\u7528Jemeter\u505a\u538b\u529b\u6d4b\u8bd5<\/p>\n\n\n\n<p><strong>\u57fa\u4e8e\u903b\u8f91\u8fc7\u671f\u65b9\u5f0f\u89e3\u51b3\u7f13\u5b58\u51fb\u7a7f\u95ee\u9898\uff1a<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-36-1024x545.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"545\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-36-1024x545.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1875\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>\u70ed\u70b9\u6570\u636e\u7684\u7f13\u5b58\u662f\u9700\u8981\u63d0\u524d\u5bfc\u5165\u7684\uff0c\u5373\u7f13\u5b58\u9884\u70ed<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> private static final ExecutorService CACHE_REBUILD_EXECUTOR= Executors.newFixedThreadPool(10);\n    public Shop queryWithLogicalExpire( Long id) {\n        \/\/todo \u7528\u903b\u8f91\u8fc7\u671f\u65b9\u5f0f\u89e3\u51b3\u7f13\u5b58\u51fb\u7a7f\u7684\u95ee\u9898\n\/\/        1 \u8bf7\u6c42\u8fc7\u6765\uff0c\u5148\u4eceredis\u91cc\u53bb\u67e5\u8be2\u5546\u94fa\u7f13\u5b58\n        String shopJson = stringRedisTemplate.opsForValue().get(CACHE_SHOP_KEY + id);\n\/\/        \u5224\u65ad\u662f\u5426\u5b58\u5728\n        if (StrUtil.isBlank(shopJson)) {\/\/StrUtil.isNotBlank\u7528\u6765\u5224\u65ad\u662f\u5426\u4e3anull\u6216\u8005\u7a7a\u5b57\u7b26\u4e32\n\/\/                    2 \u5982\u679credis\u6ca1\u6709\uff0c\u76f4\u63a5\u8fd4\u56de\n            return null;\n        }\n\/\/\u547d\u4e2d\uff0c\u5c06json\u53cd\u5e8f\u5217\u5316\u5bf9\u8c61\n        RedisData redisData = JSONUtil.toBean(shopJson, RedisData.class);\n        JSONObject data = (JSONObject) redisData.getData();\n        Shop shop = JSONUtil.toBean(data, Shop.class);\n        LocalDateTime expireTime = redisData.getExpireTime();\n\/\/\u5224\u65ad\u662f\u5426\u8fc7\u671f\n        if (expireTime.isAfter(LocalDateTime.now())) {\n\n\/\/\u672a\u8fc7\u671f,\u8fd4\u56de\u6570\u636e\u5373\u53ef\n        return shop;\n        }\n    \/\/\u5df2\u8fc7\u671f\uff0c\u9700\u8981\u7f13\u5b58\u91cd\u5efa\n\/\/        \u83b7\u53d6\u4e92\u65a5\u9501\n        String lockKey=LOCK_SHOP_KEY + id;\/\/\u9501\u7684\u952e\n        boolean isLock = tryLock(lockKey);\n\/\/        \u5224\u65ad\u662f\u5426\u83b7\u53d6\u6210\u529f\n        if(isLock){\n    \/\/        \u6210\u529f\uff0c\u5f00\u542f\u4e00\u4e2a\u7ebf\u7a0b\uff0c\u5b9e\u73b0\u7f13\u5b58\u91cd\u5efa\uff0c\u8fd4\u56de,\u8fd9\u91cc\u7528\u5230\u7684\u662f\u7ebf\u7a0b\u6c60\n            CACHE_REBUILD_EXECUTOR.submit(()-&gt;{\n                try {\n                    saveShopRedis( id,30L);\n                    System.out.println(Thread.currentThread()+\"\u66f4\u65b0\u6570\u636e\u4e86\");\n\n                } catch (Exception e) {\n                    throw new RuntimeException(e);\n                } finally {\n                    unLock(lockKey);\n                }\n            });\n        }\n\n\/\/        \u5931\u8d25\u3002\u8fd4\u56de\u8fc7\u671f\u4fe1\u606f\n\/\/        \u672a\u8fc7\u671f\uff0c\u76f4\u63a5\u8fd4\u56de\u5e97\u94fa\u4fe1\u606f\n\/\/        3 \u5982\u679credis\u6ca1\u6709\uff0c\u6839\u636e\u5546\u6237id\u53bb\u6570\u636e\u5e93\u67e5\u8be2\n\n        return shop;\/\/\u8fd9\u91cc\u8fd4\u56de\u7684\u8fd8\u662f\u8fc7\u671f\u6570\u636e\n\n\n    }<\/code><\/pre>\n\n\n\n<p><strong>\u7f13\u5b58\u5de5\u5177\u5c01\u88c5\uff1a<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-37-1024x385.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"385\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-37-1024x385.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1876\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>\u4ee3\u7801:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.hmdp.utils;\n\nimport cn.hutool.core.util.BooleanUtil;\nimport cn.hutool.core.util.StrUtil;\nimport cn.hutool.json.JSONObject;\nimport cn.hutool.json.JSONUtil;\nimport com.hmdp.entity.Shop;\nimport com.hmdp.service.IShopService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.data.redis.core.StringRedisTemplate;\nimport org.springframework.stereotype.Component;\n\nimport javax.annotation.Resource;\nimport java.time.LocalDateTime;\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.TimeUnit;\nimport java.util.function.Function;\n\nimport static com.hmdp.utils.RedisConstants.*;\nimport static com.hmdp.utils.RedisConstants.LOCK_SHOP_KEY;\n\n@Slf4j\n@Component\npublic class CacheClient {\n    @Resource\n    private StringRedisTemplate stringRedisTemplate;\n    @Resource\n    public IShopService shopService;\n\/\/\u5c06\u4efb\u610fjava\u5bf9\u8c61\u5e8f\u5217\u5316\u4e3ajson\u5e76\u5b58\u50a8\u5728String\u7c7b\u578b\u7684key\u4e2d\uff0c\u5e76\u4e14\u53ef\u4ee5\u8bbe\u7f6eTTL\u8fc7\u671f\u65f6\u95f4\npublic void set(String key, Object value, Long time, TimeUnit unit){\n    stringRedisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(value),time,unit);\n\n}\n\n\/\/\u5c06\u4efb\u610fjava\u5bf9\u8c61\u5e8f\u5217\u5316\u4e3ajson\u5e76\u5b58\u50a8\u5728String\u7c7b\u578b\u7684key\u4e2d\uff0c\u8bbe\u7f6e\u903b\u8f91\u8fc7\u671f\uff0c\u5e76\u53ef\u4ee5\u8bbe\u7f6e\u903b\u8f91\u8fc7\u671f\u65f6\u95f4\uff0c\u7528\u4e8e\u5904\u7406\u7f13\u5b58\u51fb\u7a7f\u95ee\u9898\npublic void setWithLogicalExpire(String key, Object value, Long time, TimeUnit unit){\n    RedisData redisData = new RedisData();\n    redisData.setData(value);\n\/\/    unit.toSeconds(time)\u628a\u65f6\u5c01\u88c5\u4e3a\u79d2\n    redisData.setExpireTime(LocalDateTime.now().plusSeconds(unit.toSeconds(time)));\n\/\/\u5199\u5165redis\n    stringRedisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(redisData));\n\n\n\n}\n\/\/\u65b9\u6cd5\u4e09\uff1a\u6839\u636e\u6307\u5b9a\u7684key\u67e5\u8be2\u7f13\u5b58\uff0c\u5e76\u53cd\u5e8f\u5217\u5316\u5236\u5b9a\u7c7b\u578b\uff0c\u5229\u7528\u7f13\u5b58\u7a7a\u503c\u7684\u65b9\u5f0f\u89e3\u51b3\u7f13\u5b58\u7a7f\u900f\u7684\u95ee\u9898\n\/\/\u7f13\u5b58\u7a7f\u900f\uff0c\u8fd4\u56de\u7a7a\u503c\u7684\u65b9\u5f0f\u5b9e\u73b0\npublic &lt;T,ID&gt; T queryWithPassThrough(String keyPrefix, ID id, Class&lt;T&gt; type,\n                                     Function&lt;ID,T&gt; dbFallback, Long time, TimeUnit unit) {\n    \/\/todo \u6dfb\u52a0\u7f13\u5b58\n\/\/        1 \u8bf7\u6c42\u8fc7\u6765\uff0c\u5148\u4eceredis\u91cc\u53bb\u67e5\u8be2\u5546\u94fa\u7f13\u5b58\n\/\/    Function\u4ee3\u8868\u6709\u53c2\u6709\u8fd4\u56de\u503c\u7684\u51fd\u6570\n    String key=keyPrefix+id;\n\/\/    \u5148\u4eceredis\u91cc\u67e5\u8be2\u5546\u94fa\u7f13\u5b58\n    String json = stringRedisTemplate.opsForValue().get(key);\n\/\/        \u5224\u65ad\u662f\u5426\u5b58\u5728\n    if (StrUtil.isNotBlank(json) &amp;&amp; json.startsWith(\"{\")) {\n        try {\n            return JSONUtil.toBean(json, type); \/\/ \u89e3\u6790JSON\u5bf9\u8c61\n        } catch (Exception e) {\n            log.error(\"JSON\u89e3\u6790\u5931\u8d25\uff0ckey\uff1a{}\uff0c\u5185\u5bb9\uff1a{}\", key, json, e);\n            return null; \/\/ \u89e3\u6790\u5931\u8d25\uff0c\u89c6\u4e3a\u7f13\u5b58\u65e0\u6548\n        }\n    }\n    \/\/ 2. \u5904\u7406\u7f13\u5b58\u7a7f\u900f\u6216\u7a7a\u503c\n    if (json != null) { \/\/ json\u4e3a\"\"\uff08\u7a7a\u503c\u7f13\u5b58\uff09\u6216\u975e\u6cd5\u683c\u5f0f\n        return null; \/\/ \u76f4\u63a5\u8fd4\u56denull\uff0c\u4e0d\u67e5DB\n    }\n\n    \/\/ 3. \u4ece\u6570\u636e\u5e93\u67e5\u8be2\n    T apply = dbFallback.apply(id);\n    if (apply == null) {\n        \/\/ \u7f13\u5b58\u7a7a\u503c\uff08\u7528\"\"\u8868\u793a\uff0c\u907f\u514dkey\u4e0d\u5b58\u5728\uff09\n        stringRedisTemplate.opsForValue().set(key, \"\", CACHE_NULL_TTL, TimeUnit.MINUTES);\n        return null;\n    }\n\n    \/\/ 4. \u5199\u5165Redis\u5e76\u8fd4\u56de\n    this.set(key, apply, time, unit);\n    return apply;\n}\n\n\nprivate static final ExecutorService CACHE_REBUILD_EXECUTOR= Executors.newFixedThreadPool(10);\n\n\/\/\u65b9\u6cd5\u56db\uff1a\u7f13\u5b58\u51fb\u7a7f \u6839\u636e\u6307\u5b9a\u7684key\u67e5\u8be2\u7f13\u5b58\uff0c\u5e76\u53cd\u5e8f\u5217\u5316\u5236\u5b9a\u7c7b\u578b\uff0c\u5229\u7528\u903b\u8f91\u8fc7\u671f\u89e3\u51b3\u7f13\u5b58\u51fb\u7a7f\u7684\u95ee\u9898,\u7528\u5230\u4e86\u51fd\u6570\u5f0f\u7f16\u7a0b\npublic &lt;T,ID&gt; T queryWithLogicalExpire(String keyPrefix , ID id,Class&lt;T&gt; type,Function&lt;ID,T&gt; dbFallback, Long time, TimeUnit unit) {\n    \/\/todo \u7528\u903b\u8f91\u8fc7\u671f\u65b9\u5f0f\u89e3\u51b3\u7f13\u5b58\u51fb\u7a7f\u7684\u95ee\u9898\n\/\/        1 \u8bf7\u6c42\u8fc7\u6765\uff0c\u5148\u4eceredis\u91cc\u53bb\u67e5\u8be2\u5546\u94fa\u7f13\u5b58\n    String key=keyPrefix+id;\n    String Json = stringRedisTemplate.opsForValue().get(key);\n\/\/        \u5224\u65ad\u662f\u5426\u5b58\u5728\n    if (StrUtil.isBlank(Json)) {\/\/StrUtil.isNotBlank\u7528\u6765\u5224\u65ad\u662f\u5426\u4e3anull\u6216\u8005\u7a7a\u5b57\u7b26\u4e32\n\/\/                    2 \u5982\u679credis\u6ca1\u6709\uff0c\u76f4\u63a5\u8fd4\u56de\n        return null;\n    }\n\/\/\/\/ \u8f6c\u6362\u4e3aJSON\u5b57\u7b26\u4e32\n\/\/        String jsonStr = JSONUtil.toJsonStr(user);\n\/\/\u547d\u4e2d\uff0c\u5c06json\u53cd\u5e8f\u5217\u5316\u5bf9\u8c61\n    RedisData redisData = JSONUtil.toBean(Json, RedisData.class);\n    JSONObject data = (JSONObject) redisData.getData();\n    T t = JSONUtil.toBean(data, type);\n    LocalDateTime expireTime = redisData.getExpireTime();\n\/\/\u5224\u65ad\u662f\u5426\u8fc7\u671f\n    if (expireTime.isAfter(LocalDateTime.now())) {\n\n\/\/\u672a\u8fc7\u671f,\u8fd4\u56de\u6570\u636e\u5373\u53ef\n        return t;\n    }\n    \/\/\u5df2\u8fc7\u671f\uff0c\u9700\u8981\u7f13\u5b58\u91cd\u5efa\n\/\/        \u83b7\u53d6\u4e92\u65a5\u9501\n    String lockKey=key;\/\/\u9501\u7684\u952e\n    boolean isLock = tryLock(lockKey);\n\/\/        \u5224\u65ad\u662f\u5426\u83b7\u53d6\u6210\u529f\n    if(isLock){\n        \/\/        \u6210\u529f\uff0c\u5f00\u542f\u4e00\u4e2a\u7ebf\u7a0b\uff0c\u5b9e\u73b0\u7f13\u5b58\u91cd\u5efa\uff0c\u8fd4\u56de,\u8fd9\u91cc\u7528\u5230\u7684\u662f\u7ebf\u7a0b\u6c60\n        CACHE_REBUILD_EXECUTOR.submit(()-&gt;{\n            try {\n\/\/                \u67e5\u8be2\u6570\u636e\u5e93\n                T apply = dbFallback.apply(id);\n\n\/\/                \u5bfc\u5165redis\n             this.setWithLogicalExpire(key,apply,time,unit);\n                System.out.println(Thread.currentThread()+\"\u66f4\u65b0\u6570\u636e\u4e86\");\n\n            } catch (Exception e) {\n                throw new RuntimeException(e);\n            } finally {\n                unLock(lockKey);\n            }\n        });\n    }\n\n\/\/        \u5931\u8d25\u3002\u8fd4\u56de\u8fc7\u671f\u4fe1\u606f\n\/\/        \u672a\u8fc7\u671f\uff0c\u76f4\u63a5\u8fd4\u56de\u5e97\u94fa\u4fe1\u606f\n\/\/        3 \u5982\u679credis\u6ca1\u6709\uff0c\u6839\u636e\u5546\u6237id\u53bb\u6570\u636e\u5e93\u67e5\u8be2\n\n    return t;\/\/\u8fd9\u91cc\u8fd4\u56de\u7684\u8fd8\u662f\u8fc7\u671f\u6570\u636e\n\n\n}\n    \/\/\u52a0\u9501\n    private boolean tryLock(String key){\n        Boolean flag = stringRedisTemplate.opsForValue().setIfAbsent(key, \"1\", 10, TimeUnit.SECONDS);\n        return BooleanUtil.isTrue(flag);\n\n    }\n    \/\/\u653e\u9501\n    private void unLock(String key){\n        stringRedisTemplate.delete(key);\n    }\n\n}\n<\/code><\/pre>\n\n\n\n<p>\u5168\u5c40\u552f\u4e00ID\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-38-1024x470.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"470\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-38-1024x470.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1880\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-39-1024x545.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"545\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-39-1024x545.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1881\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>@Component\npublic class RedisIdWorker {\n@Resource\nprivate StringRedisTemplate stringRedisTemplate;\n\nprivate static final long BEGIN_TIMESTAMP=1640995200L;\/\/\u5f00\u59cb\u65f6\u95f4\u6233\n\n    private static final int COUNT_BITS=32;\/\/\u5e8f\u5217\u53f7\u4f4d\u6570\n    \/\/keyPrefix   \u4e1a\u52a1\u524d\u7f00\npublic  long nextId(String keyPrefix){\n    \/\/  1 \u751f\u6210\u65f6\u95f4\u6233\n    long nowSecond = LocalDateTime.now().toEpochSecond(ZoneOffset.UTC);\/\/\u5f53\u524d\u79d2\u6570\n    long timestamp = nowSecond - BEGIN_TIMESTAMP;\n\n    \/\/\u83b7\u53d6\u5f53\u524d\u65e5\u671f\uff0c\u7cbe\u786e\u5230\u5929\n    LocalDate date = LocalDate.now();\n    DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(\"yyyy:MM:dd\");\n    String dateformat = date.format(dateTimeFormatter);\n    \/\/2 \u751f\u6210\u5e8f\u5217\u53f7,\u4f7f\u7528redis\u81ea\u589e\u957f\n    Long count = stringRedisTemplate.opsForValue().increment(\"icr:\" + keyPrefix + \":\" + dateformat);\n\n    \/\/    \u62fc\u63a5\u5e76\u8fd4\u56de\n\n    return  timestamp&lt;&lt; COUNT_BITS| count;\n\n}\n\n\/\/    public static void main(String&#91;] args) {\n\/\/        LocalDate now = LocalDate.now();\n\/\/\n\/\/        System.out.println(now);\n\/\/    }\n\n\n\n\n\n}<\/code><\/pre>\n\n\n\n<p>\u6d4b\u8bd5\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> public  void test2() throws InterruptedException {\n        CountDownLatch latch = new CountDownLatch(300);\/\/\u8fd9\u91cc\u628a\u521d\u59cb\u8ba1\u6570\u8bbe\u4e3a 300\uff0c\u8fd9\u610f\u5473\u7740\u9700\u8981\u6709 300 \u4e2a countDown() \u64cd\u4f5c\uff0c\u8ba1\u6570\u624d\u4f1a\u53d8\u4e3a 0\u3002\n\n             Runnable task=()-&gt;{\n            for (int i = 0; i &lt;100 ; i++) {\n                long l = redisIdWorker.nextId(\"roder\");\n                System.out.println(l);\n            }\n            latch.countDown();\/\/\u5f53\u6bcf\u4e2a\u7ebf\u7a0b\u5b8c\u6210\u81ea\u8eab\u4efb\u52a1\u65f6\uff0c\u90fd\u4f1a\u8c03\u7528 countDown() \u65b9\u6cd5\uff0c\u4f7f\u8ba1\u6570\u51cf 1\u3002\n        };\n        long begin = System.currentTimeMillis();\n        for (int i = 0; i &lt;300 ; i++) {\n            es.submit(task);\n        }\n        latch.await(); \/\/ \u4e3b\u7ebf\u7a0b\u4f1a\u5728\u6b64\u5904\u963b\u585e\uff0c\u76f4\u5230\u8ba1\u6570\u53d8\u4e3a 0\n        long end = System.currentTimeMillis();\n\n        System.out.println(\"time=\"+(end-begin));\n\n    }\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-40-1024x530.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"530\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-40-1024x530.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1882\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>\u5b9e\u73b0<strong>\u4f18\u60e0\u5238\uff1a<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-41-1024x449.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"449\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-41-1024x449.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1883\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>\u6d41\u7a0b\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-42-1024x593.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"593\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-42-1024x593.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1884\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>\u8d85\u5356\u95ee\u9898\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-43-1024x534.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"534\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-43-1024x534.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1885\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-44-1024x525.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"525\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-44-1024x525.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1886\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-45-1024x474.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"474\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-45-1024x474.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1887\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>\u4e00\u4eba\u4e00\u5355\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-46.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1004\" height=\"626\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-46.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1888\"  sizes=\"auto, (max-width: 1004px) 100vw, 1004px\" \/><\/div><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.hmdp.service.impl;\n\nimport com.hmdp.dto.Result;\nimport com.hmdp.entity.SeckillVoucher;\nimport com.hmdp.entity.VoucherOrder;\nimport com.hmdp.mapper.VoucherOrderMapper;\nimport com.hmdp.service.ISeckillVoucherService;\nimport com.hmdp.service.IVoucherOrderService;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport com.hmdp.utils.RedisIdWorker;\nimport com.hmdp.utils.UserHolder;\nimport org.springframework.aop.framework.AopContext;\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\nimport javax.annotation.Resource;\nimport java.time.LocalDateTime;\n\n\/**\n * &lt;p&gt;\n *  \u670d\u52a1\u5b9e\u73b0\u7c7b\n * &lt;\/p&gt;\n *\n * @author \u864e\u54e5\n * @since 2021-12-22\n *\/\n@Service\npublic class VoucherOrderServiceImpl extends ServiceImpl&lt;VoucherOrderMapper, VoucherOrder&gt; implements IVoucherOrderService {\n    @Resource\n    private ISeckillVoucherService seckillVoucherService;\n    @Resource\n    private RedisIdWorker redisIdWorker;\n    @Override\n    public   Result seckillVoucher(Long voucherId) {\n        \/\/ 1 \u67e5\u8be2\u4f18\u60e0\u5377\n        SeckillVoucher seckillVoucher = seckillVoucherService.getById(voucherId);\n\n        \/\/ 2 \u5224\u65ad\u4f18\u60e0\u5377\u662f\u5426\u5f00\u59cb\n        if (seckillVoucher.getBeginTime().isAfter(LocalDateTime.now())) {\n\/\/            \u5982\u679c\u5f00\u59cb\u65f6\u95f4\u5728\u5f53\u524d\u65f6\u95f4\u4e4b\u540e\u8bf4\u660e\u8fd8\u672a\u5f00\u59cb\n            return Result.fail(\"\u62a2\u5377\u65f6\u95f4\u5c1a\u672a\u5f00\u59cb\uff0c\u5f00\u59cb\u65f6\u95f4\u4e3a\" + seckillVoucher.getBeginTime());\n        }\n\n        \/\/3\u5224\u65ad\u4f18\u60e0\u5377\u662f\u5426\u7ed3\u675f\n        if (seckillVoucher.getEndTime().isBefore(LocalDateTime.now())) {\n\/\/            \u5982\u679c\u7ed3\u675f\u65f6\u95f4\u5728\u5f53\u524d\u65f6\u95f4\u4e4b\u524d\u8bf4\u660e\u5df2\u7ecf\u7ed3\u675f\n            return Result.fail(\"\u62a2\u5377\u65f6\u95f4\u5df2\u7ecf\u7ed3\u675f\u5f00\u59cb\uff0c\u7ed3\u675f\u65f6\u95f4\u4e3a\" + seckillVoucher.getEndTime());\n        }\n        \/\/4\u5224\u65ad\u5e93\u5b58\u662f\u5426\u5145\u8db3\n\n        if (seckillVoucher.getStock() &lt;= 0) {\n\/\/            \u5982\u679c\u5f00\u59cb\u65f6\u95f4\u5728\u5f53\u524d\u65f6\u95f4\u4e4b\u540e\u8bf4\u660e\u8fd8\u672a\u5f00\u59cb\n            return Result.fail(\"\u4f18\u60e0\u5377\u5df2\u88ab\u62a2\u5149\uff01\");\n        }\n        Long userId = UserHolder.getUser().getId();\/\/\u7528\u6237id\n        synchronized(userId.toString().intern()) { \/\/\u5bf9id\u4e0a\u9501\n            \/\/\u83b7\u53d6\u4ee3\u7406\u5bf9\u8c61\n            IVoucherOrderService proxy = (IVoucherOrderService) AopContext.currentProxy();\n            return proxy.createVoucherOrder(voucherId);\n        }\n    }\n    @Transactional\n    public  Result createVoucherOrder(Long voucherId){\n        \/\/\u4e00\u4eba\u4e00\u5355\n        \/\/\u62ff\u5230\u7528\u6237id\uff0c\u4f18\u60e0\u5377id\uff0c\u505a\u4e2a\u67e5\u8be2\uff0c\u6709\u7684\u8bdd\u8fd4\u56de\u5df2\u7ecf\u62a2\u8fc7\n        Long userId = UserHolder.getUser().getId();\/\/\u7528\u6237id\n            Integer count = query().eq(\"user_id\", userId).eq(\"voucher_id\", voucherId).count();\n            if (count &gt; 0) {\n                return Result.fail(\"\u7528\u6237\u5df2\u7ecf\u62a2\u8fc7\u5566\uff01\");\n            }\n\n\/\/        5\u6263\u51cf\u5e93\u5b58\n            boolean success = seckillVoucherService.update()\/\/\u5728\u66f4\u65b0\u6570\u636e\u7684\u65f6\u5019\u7528\u5230\u4e86\u60b2\u89c2\n                    .setSql(\"stock=stock-1\")\n                    .eq(\"voucher_id\", voucherId)\/\/\u8fd9\u662fwhere\u6761\u4ef6  where id =? and stock=?\n                    .gt(\"stock\", 0)\n                    .update();\n            if (!success) {\n                return Result.fail(\"\u4f18\u60e0\u5377\u5df2\u88ab\u62a2\u5149\uff01\");\n            }\n\n            \/\/6\u521b\u5efa\u8ba2\u5355\n            VoucherOrder voucherOrder = new VoucherOrder();\n            \/\/\u8ba2\u5355id\n\n            long orderId = redisIdWorker.nextId(\"order\");\n            voucherOrder.setId(orderId);\n            \/\/7\u7528\u6237id\n            voucherOrder.setUserId(userId);\n            \/\/8\u4ee3\u91d1\u5238id\n\n            voucherOrder.setVoucherId(voucherId);\n\n            \/\/9\u8fd4\u56de\u8ba2\u5355id\n\n\n            save(voucherOrder);\n\n\n            return Result.ok(orderId);\n\n\n\n\n    }\n\n\n\n\n\n}\n<\/code><\/pre>\n\n\n\n<p>\u91cd\u70b9\u89e3\u91ca\u4e00\u4e0b\u8fd9\u4e2a\u4ee3\u7801\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/\u83b7\u53d6\u4ee3\u7406\u5bf9\u8c61\n            IVoucherOrderService proxy = (IVoucherOrderService) AopContext.currentProxy();\n            return proxy.createVoucherOrder(voucherId);\n        }\u89e3\u91ca\u4e00\u4e0b\u8fd9\u4e2a\u4ee3\u7801<\/code><\/pre>\n\n\n\n<p>\u8fd9\u6bb5\u4ee3\u7801\u4e3b\u8981\u7528\u4e8e\u83b7\u53d6\u5f53\u524d\u5bf9\u8c61\u7684 AOP \u4ee3\u7406\u5b9e\u4f8b\uff0c\u5e76\u901a\u8fc7\u4ee3\u7406\u5b9e\u4f8b\u8c03\u7528&nbsp;<code>createVoucherOrder<\/code>&nbsp;\u65b9\u6cd5\u3002\u5176\u6838\u5fc3\u76ee\u7684\u662f\u786e\u4fdd\u5728&nbsp;<strong>\u540c\u6b65\u5757\u5185\u90e8\u89e6\u53d1 Spring \u7684\u4e8b\u52a1\u7ba1\u7406\u673a\u5236<\/strong>\uff0c\u8ba9&nbsp;<code>@Transactional<\/code>&nbsp;\u6ce8\u89e3\u751f\u6548\u3002\u4e0b\u9762\u8be6\u7ec6\u89e3\u91ca\u5176\u539f\u7406\u548c\u5fc5\u8981\u6027\uff1a<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>1. \u4e3a\u4ec0\u4e48\u9700\u8981 AOP \u4ee3\u7406\u5bf9\u8c61\uff1f<\/strong><\/h3>\n\n\n\n<p>Spring \u7684\u4e8b\u52a1\u7ba1\u7406\uff08\u5305\u62ec&nbsp;<code>@Transactional<\/code>&nbsp;\u6ce8\u89e3\uff09\u662f\u57fa\u4e8e&nbsp;<strong>AOP\uff08\u9762\u5411\u5207\u9762\u7f16\u7a0b\uff09<\/strong>&nbsp;\u5b9e\u73b0\u7684\u3002\u5f53\u4e00\u4e2a\u5e26\u6709&nbsp;<code>@Transactional<\/code>&nbsp;\u6ce8\u89e3\u7684\u65b9\u6cd5\u88ab\u8c03\u7528\u65f6\uff0cSpring \u9700\u8981\u901a\u8fc7&nbsp;<strong>\u4ee3\u7406\u5bf9\u8c61<\/strong>&nbsp;\u62e6\u622a\u8be5\u65b9\u6cd5\uff0c\u5e76\u5728\u65b9\u6cd5\u524d\u540e\u6dfb\u52a0\u4e8b\u52a1\u7ba1\u7406\u903b\u8f91\uff08\u5982\u5f00\u542f\u4e8b\u52a1\u3001\u63d0\u4ea4 \/ \u56de\u6eda\u4e8b\u52a1\uff09\u3002<\/p>\n\n\n\n<p><strong>\u5173\u952e\u70b9<\/strong>\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u53ea\u6709\u901a\u8fc7\u4ee3\u7406\u5bf9\u8c61\u8c03\u7528\u65b9\u6cd5\u65f6\uff0cAOP \u589e\u5f3a\u624d\u4f1a\u751f\u6548<\/strong>\u3002<\/li>\n\n\n\n<li><strong>\u82e5\u5728\u540c\u4e00\u4e2a\u7c7b\u7684\u65b9\u6cd5\u5185\u90e8\u76f4\u63a5\u8c03\u7528\u53e6\u4e00\u4e2a\u65b9\u6cd5\uff08\u5982&nbsp;<code>this.createVoucherOrder()<\/code>\uff09\uff0cAOP \u4ee3\u7406\u4f1a\u5931\u6548<\/strong>\uff0c\u5bfc\u81f4\u4e8b\u52a1\u6ce8\u89e3\u4e0d\u751f\u6548\u3002<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ \u83b7\u53d6\u5f53\u524d\u5bf9\u8c61\u7684 AOP \u4ee3\u7406\u5b9e\u4f8b\nIVoucherOrderService proxy = (IVoucherOrderService) AopContext.currentProxy();\n\/\/ \u901a\u8fc7\u4ee3\u7406\u5bf9\u8c61\u8c03\u7528\u5e26\u6709 @Transactional \u6ce8\u89e3\u7684\u65b9\u6cd5\nreturn proxy.createVoucherOrder(voucherId);<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong><code>AopContext.currentProxy()<\/code><\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li>\u8fd4\u56de\u5f53\u524d\u6b63\u5728\u6267\u884c\u7684 AOP \u4ee3\u7406\u5bf9\u8c61\uff08\u5373\u88ab\u589e\u5f3a\u540e\u7684\u5bf9\u8c61\uff09\u3002<\/li>\n\n\n\n<li>\u9700\u8981\u5728\u914d\u7f6e\u7c7b\u4e2d\u6dfb\u52a0&nbsp;<code>@EnableAspectJAutoProxy(exposeProxy = true)<\/code>&nbsp;\u624d\u80fd\u4f7f\u7528\uff0c\u5426\u5219\u4f1a\u629b\u51fa\u5f02\u5e38\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u4e3a\u4ec0\u4e48\u8981\u5728\u540c\u6b65\u5757\u4e2d\u83b7\u53d6\u4ee3\u7406\u5bf9\u8c61\uff1f<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u539f\u4ee3\u7801\u4f7f\u7528&nbsp;<code>synchronized(userId.toString().intern())<\/code>&nbsp;\u5bf9\u7528\u6237 ID \u52a0\u9501\uff0c\u786e\u4fdd\u540c\u4e00\u7528\u6237\u7684\u8bf7\u6c42\u4e32\u884c\u6267\u884c\u3002<\/li>\n\n\n\n<li>\u901a\u8fc7\u4ee3\u7406\u5bf9\u8c61\u8c03\u7528&nbsp;<code>createVoucherOrder()<\/code>&nbsp;\u65b9\u6cd5\uff0c\u786e\u4fdd&nbsp;<strong>\u9501\u7684\u6301\u6709\u65f6\u95f4\u8986\u76d6\u6574\u4e2a\u4e8b\u52a1\u5468\u671f<\/strong>\uff08\u4ece\u5f00\u542f\u4e8b\u52a1\u5230\u63d0\u4ea4 \/ \u56de\u6eda\uff09\uff0c\u907f\u514d\u5e76\u53d1\u95ee\u9898\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>3. \u82e5\u4e0d\u4f7f\u7528\u4ee3\u7406\u5bf9\u8c61\u4f1a\u53d1\u751f\u4ec0\u4e48\uff1f<\/strong><\/h3>\n\n\n\n<p>\u82e5\u76f4\u63a5\u8c03\u7528&nbsp;<code>this.createVoucherOrder(voucherId)<\/code>\uff0c\u4f1a\u5bfc\u81f4\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u4e8b\u52a1\u5931\u6548<\/strong>\uff1a<code>@Transactional<\/code>&nbsp;\u6ce8\u89e3\u4e0d\u4f1a\u751f\u6548\uff0c\u6570\u636e\u5e93\u64cd\u4f5c\u4e0d\u518d\u53d7\u4e8b\u52a1\u7ba1\u7406\u3002<\/li>\n\n\n\n<li><strong>\u9501\u4e0e\u4e8b\u52a1\u7684\u987a\u5e8f\u9519\u4e71<\/strong>\uff1a\u9501\u53ef\u80fd\u5728\u4e8b\u52a1\u63d0\u4ea4\u524d\u91ca\u653e\uff0c\u5bfc\u81f4\u5176\u4ed6\u7ebf\u7a0b\u5728\u5f53\u524d\u4e8b\u52a1\u672a\u63d0\u4ea4\u65f6\u8bfb\u53d6\u5230\u810f\u6570\u636e\u3002<\/li>\n<\/ul>\n\n\n\n<p>\u83b7\u53d6\u4ee3\u7406\u5bf9\u8c61\u7684\u53e6\u4e00\u79cd\u66f4\u4f18\u96c5\u7684\u65b9\u5f0f\u662f&nbsp;<strong>\u5728\u7c7b\u4e2d\u6ce8\u5165\u81ea\u8eab<\/strong>\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Service\npublic class VoucherOrderServiceImpl implements IVoucherOrderService {\n\n    @Resource\n    private IVoucherOrderService self; \/\/ \u6ce8\u5165\u81ea\u8eab\u4ee3\u7406\u5bf9\u8c61\n\n    @Override\n    public Result seckillVoucher(Long voucherId) {\n        \/\/ ... \u6821\u9a8c\u903b\u8f91\n        synchronized(userId.toString().intern()) {\n            return self.createVoucherOrder(voucherId); \/\/ \u901a\u8fc7\u4ee3\u7406\u5bf9\u8c61\u8c03\u7528\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>. \u4ee3\u7801\u4f5c\u7528\njava\nsynchronized(userId.toString().intern()) {\n    return self.createVoucherOrder(voucherId);\n}<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u6838\u5fc3\u76ee\u7684<\/strong>\uff1a<br>\u9632\u6b62\u540c\u4e00\u7528\u6237\u5728\u6781\u77ed\u65f6\u95f4\u5185\u53d1\u8d77\u591a\u6b21\u62a2\u8d2d\u8bf7\u6c42\uff0c\u5bfc\u81f4\u6570\u636e\u5e93\u63d2\u5165\u591a\u6761\u8ba2\u5355\u8bb0\u5f55\uff08\u5373 \u201c\u4e00\u4eba\u591a\u5355\u201d\uff09\u3002<\/li>\n\n\n\n<li><strong>\u540c\u6b65\u673a\u5236<\/strong>\uff1a<br>\u901a\u8fc7&nbsp;<code>synchronized<\/code>&nbsp;\u5173\u952e\u5b57\u5bf9&nbsp;<strong>\u7528\u6237 ID \u7684\u5b57\u7b26\u4e32\u5e38\u91cf<\/strong>&nbsp;\u52a0\u9501\uff0c\u786e\u4fdd\u540c\u4e00\u7528\u6237\u7684\u6240\u6709\u8bf7\u6c42\u5728\u9501\u7684\u4fdd\u62a4\u4e0b\u4e32\u884c\u6267\u884c\u3002<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>2. \u6280\u672f\u7ec6\u8282\u89e3\u6790<\/strong><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>2.1&nbsp;<code>userId.toString()<\/code><\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5c06\u7528\u6237 ID\uff08\u901a\u5e38\u662f&nbsp;<code>Long<\/code>&nbsp;\u7c7b\u578b\uff09\u8f6c\u6362\u4e3a\u5b57\u7b26\u4e32\u3002<br>\u4f8b\u5982\uff1a<code>userId = 123<\/code>&nbsp;\u2192&nbsp;<code>\"123\"<\/code>\u3002<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>2.2&nbsp;<code>intern()<\/code>&nbsp;\u65b9\u6cd5<\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u5b57\u7b26\u4e32\u9a7b\u7559\uff08String Intern\uff09<\/strong>\uff1a<br><code>intern()<\/code>&nbsp;\u4f1a\u5c06\u5b57\u7b26\u4e32\u5bf9\u8c61\u653e\u5165 JVM \u7684\u5b57\u7b26\u4e32\u5e38\u91cf\u6c60\uff0c\u5e76\u8fd4\u56de\u6c60\u4e2d\u7684\u5f15\u7528\u3002\n<ul class=\"wp-block-list\">\n<li>\u82e5\u6c60\u4e2d\u5df2\u5b58\u5728\u76f8\u540c\u5185\u5bb9\u7684\u5b57\u7b26\u4e32\uff0c\u5219\u8fd4\u56de\u6c60\u4e2d\u7684\u5b9e\u4f8b\u3002<\/li>\n\n\n\n<li>\u82e5\u4e0d\u5b58\u5728\uff0c\u5219\u5c06\u5f53\u524d\u5b57\u7b26\u4e32\u653e\u5165\u6c60\u4e2d\u5e76\u8fd4\u56de\u5176\u5f15\u7528\u3002<br><strong>\u793a\u4f8b<\/strong>\uff1a<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>String s1 = new String(\"123\");\nString s2 = new String(\"123\");\nSystem.out.println(s1 == s2); \/\/ false\uff08\u4e0d\u540c\u5bf9\u8c61\uff09\nSystem.out.println(s1.intern() == s2.intern()); \/\/ true\uff08\u6307\u5411\u5e38\u91cf\u6c60\u540c\u4e00\u5b9e\u4f8b\uff09<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>3 \u9501\u7684\u7c92\u5ea6<\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u9501\u5b9a\u5bf9\u8c61<\/strong>\uff1a<br>\u9501\u7684\u7c92\u5ea6\u662f&nbsp;<strong>\u7528\u6237 ID \u5bf9\u5e94\u7684\u5b57\u7b26\u4e32\u5e38\u91cf<\/strong>\u3002\u4f8b\u5982\uff0c\u7528\u6237&nbsp;<code>ID=123<\/code>&nbsp;\u7684\u6240\u6709\u8bf7\u6c42\u90fd\u4f1a\u7ade\u4e89\u540c\u4e00\u4e2a\u9501\u5bf9\u8c61&nbsp;<code>\"123\"<\/code>\u3002<\/li>\n\n\n\n<li><strong>\u6548\u679c<\/strong>\uff1a\n<ul class=\"wp-block-list\">\n<li>\u540c\u4e00\u7528\u6237\u7684\u5e76\u53d1\u8bf7\u6c42\u4f1a\u88ab\u4e32\u884c\u5316\uff0c\u907f\u514d\u91cd\u590d\u4e0b\u5355\u3002<\/li>\n\n\n\n<li>\u4e0d\u540c\u7528\u6237\u7684\u8bf7\u6c42\u4e92\u4e0d\u5f71\u54cd\uff0c\u4e0d\u4f1a\u88ab\u963b\u585e\uff08\u5982&nbsp;<code>ID=123<\/code>&nbsp;\u548c&nbsp;<code>ID=456<\/code>&nbsp;\u7684\u8bf7\u6c42\u53ef\u5e76\u884c\u6267\u884c\uff09\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>3. \u4e3a\u4ec0\u4e48\u4e0d\u76f4\u63a5\u7528&nbsp;<code>userId.toString()<\/code>\uff1f<\/strong><\/h3>\n\n\n\n<p>\u82e5\u6539\u4e3a&nbsp;<code>synchronized(userId.toString())<\/code>\uff0c\u53ef\u80fd\u5bfc\u81f4\u9501\u5931\u6548\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u95ee\u9898<\/strong>\uff1a<br><code>userId.toString()<\/code>&nbsp;\u6bcf\u6b21\u8fd4\u56de\u7684\u662f\u65b0\u7684\u5b57\u7b26\u4e32\u5bf9\u8c61\uff08\u5373\u4f7f\u5185\u5bb9\u76f8\u540c\uff09\uff0c\u5bfc\u81f4\u4e0d\u540c\u7ebf\u7a0b\u6301\u6709\u4e0d\u540c\u7684\u9501\u5b9e\u4f8b\u3002<br><strong>\u793a\u4f8b<\/strong>\uff1a<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>String lock1 = userId.toString(); \/\/ \u7b2c\u4e00\u6b21\u8c03\u7528\uff0c\u751f\u6210\u65b0\u5bf9\u8c61\nString lock2 = userId.toString(); \/\/ \u7b2c\u4e8c\u6b21\u8c03\u7528\uff0c\u751f\u6210\u65b0\u5bf9\u8c61\nSystem.out.println(lock1 == lock2); \/\/ false\uff08\u4e0d\u540c\u5bf9\u8c61\uff09<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>5. \u603b\u7ed3<\/strong><\/h3>\n\n\n\n<p><code>userId.toString().intern()<\/code>&nbsp;\u7684\u6838\u5fc3\u4f5c\u7528\u662f\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5c06\u7528\u6237 ID \u8f6c\u6362\u4e3a\u5b57\u7b26\u4e32\u5e38\u91cf\u6c60\u4e2d\u7684\u552f\u4e00\u5bf9\u8c61\uff0c\u786e\u4fdd\u540c\u4e00\u7528\u6237\u7684\u9501\u5bf9\u8c61\u76f8\u540c\u3002<\/li>\n\n\n\n<li>\u901a\u8fc7&nbsp;<code>synchronized<\/code>&nbsp;\u5b9e\u73b0 JVM \u7ea7\u522b\u7684\u7528\u6237\u7ea7\u9501\uff0c\u9632\u6b62\u540c\u4e00\u7528\u6237\u5e76\u53d1\u4e0b\u5355\u3002<\/li>\n<\/ul>\n\n\n\n<p>\u6267\u884c\u6d41\u7a0b\uff1a<\/p>\n\n\n\n<p><strong>1. \u9501\u7684\u8bc6\u522b\u903b\u8f91\uff1a\u57fa\u4e8e userId \u7684\u552f\u4e00\u6027<\/strong><\/p>\n\n\n\n<p>\u5f53\u7528\u6237\u53d1\u8d77\u62a2\u8d2d\u8bf7\u6c42\u65f6\uff0c\u7cfb\u7edf\u4f1a\u6267\u884c\u4ee5\u4e0b\u6b65\u9aa4\uff1a<\/p>\n\n\n\n<p><strong>\u82e5\u5df2\u6301\u6709<\/strong>\uff1a\u8bf4\u660e\u540c\u4e00\u7528\u6237\u7684\u524d\u4e00\u4e2a\u8bf7\u6c42\u6b63\u5728\u5904\u7406\u4e2d\uff0c\u5f53\u524d\u7ebf\u7a0b\u4f1a\u88ab\u963b\u585e\uff0c\u76f4\u5230\u9501\u91ca\u653e\u3002<\/p>\n\n\n\n<p><strong>\u83b7\u53d6\u7528\u6237 ID<\/strong>\uff1a<br>\u901a\u8fc7&nbsp;<code>UserHolder.getUser().getId()<\/code>&nbsp;\u4ece\u5f53\u524d\u8bf7\u6c42\u4e2d\u83b7\u53d6\u7528\u6237 ID\uff08\u5982&nbsp;<code>123<\/code>\uff09\u3002<\/p>\n\n\n\n<p><strong>\u751f\u6210\u9501\u5bf9\u8c61<\/strong>\uff1a<br>\u5c06\u7528\u6237 ID \u8f6c\u6362\u4e3a\u5b57\u7b26\u4e32\u5e76\u8c03\u7528&nbsp;<code>intern()<\/code>\uff0c\u5f97\u5230\u552f\u4e00\u7684\u9501\u5bf9\u8c61\uff08\u5982\u5b57\u7b26\u4e32\u5e38\u91cf\u6c60\u4e2d\u7684&nbsp;<code>\"123\"<\/code>\uff09\u3002<\/p>\n\n\n\n<p><strong>\u52a0\u9501\u903b\u8f91<\/strong>\uff1a<br><code>synchronized(userId.toString().intern())<\/code>&nbsp;\u4f1a\u68c0\u67e5\u5f53\u524d\u7ebf\u7a0b\u662f\u5426\u6301\u6709\u8be5\u9501\u5bf9\u8c61\u7684\u76d1\u89c6\u5668\uff08Monitor\uff09\u3002<\/p>\n\n\n\n<p><strong>\u82e5\u672a\u6301\u6709<\/strong>\uff1a\u5f53\u524d\u7ebf\u7a0b\u4f1a\u7ade\u4e89\u83b7\u53d6\u9501\uff08\u5373\u83b7\u53d6\u8be5\u5bf9\u8c61\u7684\u76d1\u89c6\u5668\u6240\u6709\u6743\uff09\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-47-1024x513.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"513\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-47-1024x513.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1889\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>\u56e0\u4e3a\u6bcf\u4e2ajvm\u5185\u90e8\u90fd\u6709\u4e00\u4e2a\u9501\u76d1\u89c6\u5668\uff0c\u4e0d\u540c\u5fb7jvm\u6709\u4e0d\u540c\u7684\u76d1\u89c6\u5668\uff0c\u5728\u5e76\u53d1\u8bf7\u60c5\u51b5\u4e0b\uff0c\u4f1a\u51fa\u73b0\u9501\u4e0d\u4f4f\u7684\u60c5\u51b5<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-48-1024x531.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"531\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-48-1024x531.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1890\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-49-1024x498.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"498\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-49-1024x498.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1891\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-50-1024x564.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"564\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-50-1024x564.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1893\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>\u95ee\u9898\uff1a\u5982\u679c\u52a0\u9501\u4e4b\u540e\u5b95\u673a\u90a3\u4e48\u9501\u5c31\u4e0d\u80fd\u91ca\u653e\u4e86<\/p>\n\n\n\n<p>way:\u52a0\u8fc7\u671f\u65f6\u95f4<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-51-1024x526.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"526\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-51-1024x526.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1895\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-52.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"920\" height=\"248\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-52.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1896\"  sizes=\"auto, (max-width: 920px) 100vw, 920px\" \/><\/div><\/figure>\n\n\n\n<p>\u5982\u679c\u5728\u8fd8\u6ca1\u8bbe\u7f6e\u8fc7\u671f\u65f6\u95f4\u7684\u65f6\u5019\u5c31\u5b95\u673a\u4e86\u8be5\u600e\u4e48\u529e\u5462\uff1a<\/p>\n\n\n\n<p>\u7528\u547d\u4ee4\uff1aset \u952e\u540d \u503c ex \u8fc7\u671f\u65f6\u95f4  nx   <\/p>\n\n\n\n<p>\u7528\u8fd9\u6761\u547d\u4ee4\u57fa\u672c\u4e0a\u5c31\u4fdd\u8bc1\u4e86\u539f\u5b50\u6027<\/p>\n\n\n\n<p>\u6d41\u7a0b\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-56-1024x496.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"496\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-56-1024x496.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1900\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.hmdp.utils;\n\npublic interface ILock {\n    \/**\n     * \u5c1d\u8bd5\u83b7\u53d6\u9501\n     * @param timeoutSec \u9501\u6301\u6709\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u8fc7\u671f\u540e\u81ea\u52a8\u91ca\u653e\n     *\n     * @return true \u4ee3\u8868\u83b7\u53d6\u9501\u6210\u529f   false \u4ee3\u8868\u83b7\u53d6\u9501\u5931\u8d25\n     *\n     *\/\n    boolean tryLock (Long timeoutSec);\n\n\n\n\n    void unlock();\n\n\n\n\n}\n\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.hmdp.utils;\n\nimport org.springframework.data.redis.core.StringRedisTemplate;\nimport org.springframework.stereotype.Component;\n\nimport java.util.concurrent.TimeUnit;\n\npublic class SimpleRedisLock implements ILock{\n\n\n\/\/    SimpleRedisLock \u81ea\u8eab\u901a\u8fc7\u6784\u9020\u51fd\u6570\u63a5\u6536 StringRedisTemplate\uff0c\n\/\/    \u8fd9\u786e\u4fdd\u4e86 SimpleRedisLock \u5185\u90e8\u53ef\u4ee5\u4f7f\u7528 Redis \u529f\u80fd\u3002\u4f46\u8fd9\u53ea\u662f\u89e3\u51b3\u4e86 SimpleRedisLock \u7c7b\u7684\u4f9d\u8d56\u95ee\u9898\uff0c\n\/\/    \u5e76\u6ca1\u6709\u89e3\u51b3\u5916\u90e8\u5982\u4f55\u521b\u5efa SimpleRedisLock \u5b9e\u4f8b\u7684\u95ee\u9898\n\/\/\u5f53\u5176\u4ed6\u7c7b\uff08\u5982 UserService\uff09\u9700\u8981\u4f7f\u7528 SimpleRedisLock \u65f6\uff0c\u5fc5\u987b\u5148\u63d0\u4f9b StringRedisTemplate \u5b9e\u4f8b\u624d\u80fd\u521b\u5efa SimpleRedisLock \u5bf9\u8c61\u3002\n\n    private String name;\/\/\u9501\u7684\u540d\u5b57\n    private StringRedisTemplate stringRedisTemplate;\n    private static final String KEY_PREFIX=\"lock:\";\n\n    public SimpleRedisLock(String name,StringRedisTemplate stringRedisTemplate) {\n        this.stringRedisTemplate = stringRedisTemplate;\n        this.name=name;\n    }\n\n\n    \/\/    \u83b7\u53d6\u9501\n    @Override\n    public boolean tryLock(Long timeoutSec) {\n\/\/        \u83b7\u53d6\u7ebf\u7a0bid\u4f5c\u4e3a\u9501\u7684\u503c\n        long id = Thread.currentThread().getId();\n\n        Boolean success = stringRedisTemplate.opsForValue().\n                setIfAbsent(KEY_PREFIX + name, id + \"\", timeoutSec, TimeUnit.SECONDS);\n    \/\/\u8fd9\u91cc\u7528\u5230\u4e86\u81ea\u52a8\u62c6\u7bb1\uff0c\u5982\u679csuccess\u4e3anull\uff0c\u4e00\u62c6\u7bb1\u6210\u7a7a\u6307\u9488\u4e86\uff0c\u6240\u4ee5\u7528\u4e0b\u9762\u7684\u65b9\u5f0f\u8fdb\u884c\u6bd4\u8f83\n        return Boolean.TRUE.equals(success);\n    }\n\n    @Override\n    public void unlock() {\n        \/\/    \u91ca\u653e\u9501\n        stringRedisTemplate.delete(KEY_PREFIX + name);\n\n\n    }\n}\n<\/code><\/pre>\n\n\n\n<p><strong>\u89e3\u51b3\u5206\u5e03\u5f0f\u9501\u8bef\u5220\u95ee\u9898\uff1a<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-57-1024x530.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"530\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-57-1024x530.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1901\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>package com.hmdp.utils;\n\nimport cn.hutool.core.lang.UUID;\nimport org.springframework.data.redis.core.StringRedisTemplate;\nimport org.springframework.stereotype.Component;\n\nimport java.util.concurrent.TimeUnit;\n\npublic class SimpleRedisLock implements ILock{\n\n\n\/\/    SimpleRedisLock \u81ea\u8eab\u901a\u8fc7\u6784\u9020\u51fd\u6570\u63a5\u6536 StringRedisTemplate\uff0c\n\/\/    \u8fd9\u786e\u4fdd\u4e86 SimpleRedisLock \u5185\u90e8\u53ef\u4ee5\u4f7f\u7528 Redis \u529f\u80fd\u3002\u4f46\u8fd9\u53ea\u662f\u89e3\u51b3\u4e86 SimpleRedisLock \u7c7b\u7684\u4f9d\u8d56\u95ee\u9898\uff0c\n\/\/    \u5e76\u6ca1\u6709\u89e3\u51b3\u5916\u90e8\u5982\u4f55\u521b\u5efa SimpleRedisLock \u5b9e\u4f8b\u7684\u95ee\u9898\n\/\/\u5f53\u5176\u4ed6\u7c7b\uff08\u5982 UserService\uff09\u9700\u8981\u4f7f\u7528 SimpleRedisLock \u65f6\uff0c\u5fc5\u987b\u5148\u63d0\u4f9b StringRedisTemplate \u5b9e\u4f8b\u624d\u80fd\u521b\u5efa SimpleRedisLock \u5bf9\u8c61\u3002\n\n    private String name;\/\/\u9501\u7684\u540d\u5b57\n    private StringRedisTemplate stringRedisTemplate;\n    private static final String KEY_PREFIX=\"lock:\";\n    private static final String LOCK_PREFIX= UUID.randomUUID().toString(true)+\"-\";\n\n    public SimpleRedisLock(String name,StringRedisTemplate stringRedisTemplate) {\n        this.stringRedisTemplate = stringRedisTemplate;\n        this.name=name;\n    }\n\n\n    \/\/    \u83b7\u53d6\u9501\n    @Override\n    public boolean tryLock(Long timeoutSec) {\n\/\/        \u83b7\u53d6\u7ebf\u7a0bid\u4f5c\u4e3a\u9501\u7684\u503c\n        String threadId= LOCK_PREFIX+Thread.currentThread().getId();\/\/\u7ebf\u7a0b\u6807\u8bc6\n\n        Boolean success = stringRedisTemplate.opsForValue().\n                setIfAbsent(KEY_PREFIX + name, threadId , timeoutSec, TimeUnit.SECONDS);\n    \/\/\u8fd9\u91cc\u7528\u5230\u4e86\u81ea\u52a8\u62c6\u7bb1\uff0c\u5982\u679csuccess\u4e3anull\uff0c\u4e00\u62c6\u7bb1\u6210\u7a7a\u6307\u9488\u4e86\uff0c\u6240\u4ee5\u7528\u4e0b\u9762\u7684\u65b9\u5f0f\u8fdb\u884c\u6bd4\u8f83\n        return Boolean.TRUE.equals(success);\n    }\n\n    @Override\n    public void unlock() {\n        String threadId= LOCK_PREFIX+Thread.currentThread().getId();\/\/\u7ebf\u7a0b\u6807\u8bc6\n        String id = stringRedisTemplate.opsForValue().get(threadId);\n        if(threadId.equals(id)){\n\n            \/\/    \u91ca\u653e\u9501\n            stringRedisTemplate.delete(KEY_PREFIX + name);\n\n        }\n\n\/\/       \u4e0d\u4e00\u81f4\u7684\u8bdd\u5c31\u4e0d\u7ba1\uff0c\u8bf4\u660e\u9501\u4e0d\u91ca\u653e\n\n\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>\u95ee\u9898\uff1a\u5728\u7b2c\u4e00\u4e2a\u7ebf\u7a0b\u5373\u5c06\u91ca\u653e\u9501\u7684\u65f6\u5019\uff08\u5df2\u7ecf\u5224\u65ad\u662f\u81ea\u5df1\u7684\u9501\uff09\uff0c\u7531\u4e8ejvm\u7684\u5783\u573e\u56de\u6536\u673a\u5236\uff0c\u9020\u6210\u963b\u585e\uff0c\u7ebf\u7a0b2\u8fdb\u6765\uff0c\u9020\u6210\u8bef\u5220\u95ee\u9898<\/p>\n\n\n\n<p>\u89e3\u51b3\u529e\u6cd5\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-58-1024x222.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"222\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-58-1024x222.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1902\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-59-1024x511.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"511\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-59-1024x511.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1903\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-61-1024x522.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"522\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-61-1024x522.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1905\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-62-1024x564.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"564\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-62-1024x564.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1906\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>docker exec -it  \u5bb9\u5668\u540d\u79f0\u6216\u8005id sh \u8fdb\u5165\u5230\u5bb9\u5668\u5185  <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-63-1024x426.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"426\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-63-1024x426.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1907\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-64.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"631\" height=\"408\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-64.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1908\"  sizes=\"auto, (max-width: 631px) 100vw, 631px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-65.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"620\" height=\"389\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-65.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1909\"  sizes=\"auto, (max-width: 620px) 100vw, 620px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-66-1024x553.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"553\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-66-1024x553.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1910\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-68-1024x545.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"545\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-68-1024x545.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1912\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-69-1024x491.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"491\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-69-1024x491.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1913\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-70-1024x500.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"500\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-70-1024x500.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1914\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-71-1024x515.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"515\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-71-1024x515.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1915\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-72-1024x514.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"514\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-72-1024x514.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1916\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>Resisson\u53ef\u91cd\u5165\u9501\u539f\u7406\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-73-1024x491.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"491\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-73-1024x491.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1917\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-75-1024x476.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"476\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-75-1024x476.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1919\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-76-1024x516.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"516\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-76-1024x516.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1920\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-77-1024x496.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"496\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-77-1024x496.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1921\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-78-1024x523.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"523\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-78-1024x523.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1922\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p>\u5f00\u542f\u770b\u95e8\u72d7\u5c31\u662f\u4e0d\u505c\u7684\u53bb\u66f4\u65b0\u6709\u6548\u671f<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-79-1024x459.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"459\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-79-1024x459.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1923\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-80-1024x498.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"498\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-80-1024x498.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1924\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-81-1024x330.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"330\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-81-1024x330.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1925\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-82-1024x509.png'><img class=\"lazyload lazyload-style-1\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"509\" data-original=\"https:\/\/note.ui11.cc\/wp-content\/uploads\/2025\/05\/image-82-1024x509.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-1926\"  sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u57fa\u4e8esession\u5b9e\u73b0\u767b\u5f55 ThreadLocal\uff1a\u5b9a\u4e49 ThreadLocal\u662f Java \u4e2d\u7684\u4e00\u4e2a\u7ebf\u7a0b\u5c40\u90e8 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-1840","post","type-post","status-publish","format-standard","hentry","category-redis"],"_links":{"self":[{"href":"https:\/\/note.ui11.cc\/index.php\/wp-json\/wp\/v2\/posts\/1840","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/note.ui11.cc\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/note.ui11.cc\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/note.ui11.cc\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/note.ui11.cc\/index.php\/wp-json\/wp\/v2\/comments?post=1840"}],"version-history":[{"count":8,"href":"https:\/\/note.ui11.cc\/index.php\/wp-json\/wp\/v2\/posts\/1840\/revisions"}],"predecessor-version":[{"id":1927,"href":"https:\/\/note.ui11.cc\/index.php\/wp-json\/wp\/v2\/posts\/1840\/revisions\/1927"}],"wp:attachment":[{"href":"https:\/\/note.ui11.cc\/index.php\/wp-json\/wp\/v2\/media?parent=1840"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/note.ui11.cc\/index.php\/wp-json\/wp\/v2\/categories?post=1840"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/note.ui11.cc\/index.php\/wp-json\/wp\/v2\/tags?post=1840"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}