{"id":201698,"date":"2025-05-10T12:59:38","date_gmt":"2025-05-10T04:59:38","guid":{"rendered":"https:\/\/server.hk\/cnblog\/201698\/"},"modified":"2025-05-10T12:59:38","modified_gmt":"2025-05-10T04:59:38","slug":"%e5%a6%82%e4%bd%95%e5%9c%a8spring-boot%e4%b8%ad%e4%bd%bf%e7%94%a8redis%e6%8b%a6%e6%88%aa%e6%8e%a5%e5%8f%a3%e5%ae%9e%e7%8e%b0%e5%b9%82%e7%ad%89%e6%80%a7%ef%bc%9f","status":"publish","type":"post","link":"https:\/\/server.hk\/cnblog\/201698\/","title":{"rendered":"\u5982\u4f55\u5728Spring Boot\u4e2d\u4f7f\u7528Redis\u62e6\u622a\u63a5\u53e3\u5b9e\u73b0\u5e42\u7b49\u6027\uff1f"},"content":{"rendered":"<p><b><\/b> <\/p>\n<h1>\u5982\u4f55\u5728Spring Boot\u4e2d\u4f7f\u7528Redis\u62e6\u622a\u63a5\u53e3\u5b9e\u73b0\u5e42\u7b49\u6027\uff1f<\/h1>\n<p><span style=\"cursor: pointer\"><i><\/i>\u6536\u85cf<\/span> <\/p>\n<p>\u5728\u6570\u636e\u5e93\u5b9e\u6218\u5f00\u53d1\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u7ecf\u5e38\u4f1a\u9047\u5230\u4e00\u4e9b\u8fd9\u6837\u90a3\u6837\u7684\u95ee\u9898\uff0c\u7136\u540e\u8981\u5361\u597d\u534a\u5929\uff0c\u7b49\u95ee\u9898\u89e3\u51b3\u4e86\u624d\u53d1\u73b0\u539f\u6765\u4e00\u4e9b\u7ec6\u8282\u77e5\u8bc6\u70b9\u8fd8\u662f\u6ca1\u6709\u638c\u63e1\u597d\u3002\u4eca\u5929golang\u5b66\u4e60\u7f51\u5c31\u6574\u7406\u5206\u4eab\u300a\u5982\u4f55\u5728Spring Boot\u4e2d\u4f7f\u7528Redis\u62e6\u622a\u63a5\u53e3\u5b9e\u73b0\u5e42\u7b49\u6027\uff1f\u300b\uff0c\u804a\u804a\uff0c\u5e0c\u671b\u53ef\u4ee5\u5e2e\u52a9\u5230\u6b63\u5728\u52aa\u529b\u8d5a\u94b1\u7684\u4f60\u3002<\/p>\n<h3>\u6b63\u6587<\/h3>\n<p><img decoding=\"async\" src=\"https:\/\/www.17golang.com\/uploads\/20230509\/1683638463645a48bfb53dc.png\" class=\"aligncenter\"><\/p>\n<p>\u81ea\u5b9a\u4e49\u6ce8\u89e3 \u600e\u4e48\u73a9\u7684 \uff1a &nbsp; &nbsp; &nbsp;<\/p>\n<p>\u2460\u6807\u8bb0\u54ea\u4e2a\u63a5\u53e3\u9700\u8981\u8fdb\u884c\u5e42\u7b49\u6027\u62e6\u622a &nbsp; &nbsp; &nbsp; &nbsp;<\/p>\n<p>\u2461\u6bcf\u4e2a\u63a5\u53e3\u53ef\u4ee5\u8981\u6c42\u5e42\u7b49\u6027\u8303\u56f4\u65f6\u95f4\u4e0d\u4e00\u6837\uff0c\u4e3e\u4f8b\uff1a\u53ef\u4ee52\u79d2\u5185\uff0c\u53ef\u4ee53\u79d2\u5185\uff0c\u65f6\u95f4\u81ea\u5df1\u4f20 &nbsp; &nbsp; &nbsp; &nbsp;<\/p>\n<p>\u2462 \u4e00\u65e6\u89e6\u53d1\u4e86\uff0c\u63d0\u793a\u8bed\u53ef\u4ee5\u4e0d\u540c \uff0c\u4e3e\u4f8b\uff1aVIP\u7684\u63a5\u53e3\uff0c\u666e\u901a\u7528\u6237\u7684\u63a5\u53e3\uff0c\u63d0\u793a\u8bed\u4e0d\u4e00\u6837\uff08\u5f00\u73a9\u7b11\uff09<\/p>\n<p>\u6548\u679c\uff1a<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.17golang.com\/uploads\/20230509\/1683638463645a48bfc17d8.png\" class=\"aligncenter\"><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.17golang.com\/uploads\/20230509\/1683638463645a48bfcc2fb.png\" class=\"aligncenter\"><\/p>\n<h3>\u5b9e\u6218\u5f00\u59cb<\/h3>\n<h4>\u6838\u5fc3\u4e09\u4ef6\u5957<\/h4>\n<p>\u6ce8\u89e3\u3001\u62e6\u622a\u5668\u3001\u62e6\u622a\u5668\u914d\u7f6e<\/p>\n<p>\u2460 RepeatDaMie.java<\/p>\n<pre>import&nbsp;java.lang.annotation.ElementType;\nimport&nbsp;java.lang.annotation.Retention;\nimport&nbsp;java.lang.annotation.RetentionPolicy;\nimport&nbsp;java.lang.annotation.Target;\n&nbsp;\n\/**\n&nbsp;*&nbsp;@Author:&nbsp;JCccc\n&nbsp;*&nbsp;@Date:&nbsp;2022-6-13&nbsp;9:04\n&nbsp;*&nbsp;@Description:&nbsp;&nbsp;\u81ea\u5b9a\u4e49\u6ce8\u89e3,\u9632\u6b62\u91cd\u590d\u63d0\u4ea4\n&nbsp;*\/\n@Target({ElementType.METHOD})\n@Retention(RetentionPolicy.RUNTIME)\npublic&nbsp;@interface&nbsp;RepeatDaMie&nbsp;{\n&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;\/**\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;\u65f6\u95f4ms\u9650\u5236\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*\/\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;second()&nbsp;default&nbsp;1;\n&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;\/**\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;\u63d0\u793a\u6d88\u606f\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*\/\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;describe()&nbsp;default&nbsp;\"\u91cd\u590d\u63d0\u4ea4\u4e86,\u5144\u5f1f\";\n&nbsp;&nbsp;&nbsp;&nbsp;\n}<\/pre>\n<p>\u2461ApiRepeatInterceptor.java<\/p>\n<pre>import&nbsp;com.example.repeatdemo.annotation.RepeatDaMie;\nimport&nbsp;com.example.repeatdemo.util.ContextUtil;\nimport&nbsp;com.example.repeatdemo.util.Md5Encrypt;\nimport&nbsp;com.example.repeatdemo.util.RedisUtils;\nimport&nbsp;com.example.repeatdemo.wrapper.CustomHttpServletRequestWrapper;\nimport&nbsp;com.fasterxml.jackson.databind.ObjectMapper;\nimport&nbsp;org.slf4j.Logger;\nimport&nbsp;org.slf4j.LoggerFactory;\nimport&nbsp;org.springframework.stereotype.Component;\nimport&nbsp;org.springframework.web.method.HandlerMethod;\nimport&nbsp;org.springframework.web.servlet.HandlerInterceptor;\n&nbsp;\nimport&nbsp;javax.servlet.http.HttpServletRequest;\nimport&nbsp;javax.servlet.http.HttpServletResponse;\nimport&nbsp;java.io.IOException;\nimport&nbsp;java.util.Objects;\n&nbsp;\n\/**\n&nbsp;*&nbsp;@Author:&nbsp;JCccc\n&nbsp;*&nbsp;@Date:&nbsp;2022-6-15&nbsp;9:11\n&nbsp;*&nbsp;@Description:&nbsp;\u63a5\u53e3\u5e42\u7b49\u6027\u6821\u9a8c\u62e6\u622a\u5668\n&nbsp;*\/\n@Component\npublic&nbsp;class&nbsp;ApiRepeatInterceptor&nbsp;implements&nbsp;HandlerInterceptor&nbsp;{\n&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;final&nbsp;Logger&nbsp;log&nbsp;=&nbsp;LoggerFactory.getLogger(this.getClass());\n&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;String&nbsp;POST=\"POST\";\n&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;String&nbsp;GET=\"GET\";\n&nbsp;&nbsp;&nbsp;&nbsp;@Override\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;boolean&nbsp;preHandle(HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response,&nbsp;Object&nbsp;handler)&nbsp;throws&nbsp;Exception&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(handler&nbsp;instanceof&nbsp;HandlerMethod)&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HandlerMethod&nbsp;handlerMethod&nbsp;=&nbsp;(HandlerMethod)&nbsp;handler;\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;\u83b7\u53d6RepeatDaMie\u6ce8\u89e3\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RepeatDaMie&nbsp;repeatDaMie&nbsp;=&nbsp;handlerMethod.getMethodAnnotation(RepeatDaMie.class);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(null==repeatDaMie)&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true;\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u9650\u5236\u7684\u65f6\u95f4\u8303\u56f4\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;seconds&nbsp;=&nbsp;repeatDaMie.second();\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u8fd9\u4e2a\u7528\u6237\u552f\u4e00\u6807\u8bc6\uff0c\u53ef\u4ee5\u81ea\u5df1\u7ec6\u5fae\u8c03\u6574\uff0c\u662fuserId\u8fd8\u662ftoken\u8fd8\u662fsessionId\u8fd8\u662f\u4e0d\u9700\u8981\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;userUniqueKey&nbsp;=&nbsp;request.getHeader(\"userUniqueKey\");\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;method&nbsp;=&nbsp;request.getMethod();\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;apiParams&nbsp;=&nbsp;\"\";\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(GET.equals(method)){\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info(\"GET\u8bf7\u6c42\u6765\u4e86\");\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;apiParams&nbsp;=&nbsp;new&nbsp;ObjectMapper().writeValueAsString(request.getParameterMap());\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else&nbsp;if&nbsp;(POST.equals(method)){\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info(\"POST\u8bf7\u6c42\u6765\u4e86\");\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CustomHttpServletRequestWrapper&nbsp;wrapper&nbsp;=&nbsp;(CustomHttpServletRequestWrapper)&nbsp;request;\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;apiParams&nbsp;=&nbsp;wrapper.getBody();\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info(\"\u5f53\u524d\u53c2\u6570\u662f\uff1a{}\",apiParams);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;\u5b58\u50a8key\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;keyRepeatDaMie&nbsp;=&nbsp;Md5Encrypt.md5(userUniqueKey+request.getServletPath()+apiParams)&nbsp;;\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RedisUtils&nbsp;redisUtils&nbsp;=&nbsp;ContextUtil.getBean(RedisUtils.class);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(Objects.nonNull(redisUtils.get(keyRepeatDaMie))){\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info(\"\u91cd\u590d\u8bf7\u6c42\u4e86\uff0c\u91cd\u590d\u8bf7\u6c42\u4e86\uff0c\u62e6\u622a\u4e86\");\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;returnData(response,repeatDaMie.describe());\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redisUtils.setWithTime(keyRepeatDaMie,&nbsp;true,seconds);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true;\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.warn(\"\u8bf7\u6c42\u8fc7\u4e8e\u9891\u7e41\u8bf7\u7a0d\u540e\u518d\u8bd5\");\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true;\n&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;returnData(HttpServletResponse&nbsp;response,String&nbsp;msg)&nbsp;throws&nbsp;IOException&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.setCharacterEncoding(\"UTF-8\");\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.setContentType(\"application\/json;&nbsp;charset=utf-8\");\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectMapper&nbsp;objectMapper&nbsp;=&nbsp;new&nbsp;ObjectMapper();\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u8fd9\u91cc\u4f20\u63d0\u793a\u8bed\u53ef\u4ee5\u6539\u6210\u81ea\u5df1\u9879\u76ee\u7684\u8fd4\u56de\u6570\u636e\u5c01\u88c5\u7684\u7c7b\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.getWriter().println(objectMapper.writeValueAsString(msg));\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;\n&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;\n}<\/pre>\n<p>\u2462 WebConfig.java<\/p>\n<pre>import&nbsp;org.springframework.context.annotation.Configuration;\nimport&nbsp;org.springframework.web.servlet.config.annotation.InterceptorRegistry;\nimport&nbsp;org.springframework.web.servlet.config.annotation.WebMvcConfigurer;\n&nbsp;\n\/**\n&nbsp;*&nbsp;@Author:&nbsp;JCccc\n&nbsp;*&nbsp;@Date:&nbsp;2022-6-15&nbsp;9:24\n&nbsp;*&nbsp;@Description:\n&nbsp;*\/\n@Configuration\npublic&nbsp;class&nbsp;WebConfig&nbsp;implements&nbsp;WebMvcConfigurer&nbsp;{\n&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;@Override\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;addInterceptors(InterceptorRegistry&nbsp;registry)&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;registry.addInterceptor(new&nbsp;ApiRepeatInterceptor()).addPathPatterns(\"\/**\");\n&nbsp;&nbsp;&nbsp;&nbsp;}\n}<\/pre>\n<h4>\u5de5\u5177\u7c7b\u4e09\u4ef6\u5957<\/h4>\n<p>\u2460ContextUtil.java<\/p>\n<pre>import&nbsp;org.springframework.beans.BeansException;\nimport&nbsp;org.springframework.context.ApplicationContext;\nimport&nbsp;org.springframework.context.ApplicationContextAware;\nimport&nbsp;org.springframework.stereotype.Component;\n\/**\n&nbsp;*&nbsp;@Author:&nbsp;JCccc\n&nbsp;*&nbsp;@Date:&nbsp;2022-6-15&nbsp;9:24\n&nbsp;*&nbsp;@Description:\n&nbsp;*\/\n@Component\npublic&nbsp;final&nbsp;class&nbsp;ContextUtil&nbsp;implements&nbsp;ApplicationContextAware&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;static&nbsp;ApplicationContext&nbsp;applicationContext&nbsp;;\n&nbsp;&nbsp;&nbsp;&nbsp;@Override\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setApplicationContext(ApplicationContext&nbsp;arg0)&nbsp;throws&nbsp;BeansException&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(applicationContext&nbsp;==&nbsp;null)&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;applicationContext&nbsp;=&nbsp;arg0;\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;Object&nbsp;getBean(String&nbsp;name)&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/name\u8868\u793a\u5176\u4ed6\u8981\u6ce8\u5165\u7684\u6ce8\u89e3name\u540d\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;applicationContext.getBean(name);\n&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;\/**\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;\u62ff\u5230ApplicationContext\u5bf9\u8c61\u5b9e\u4f8b\u540e\u5c31\u53ef\u4ee5\u624b\u52a8\u83b7\u53d6Bean\u7684\u6ce8\u5165\u5b9e\u4f8b\u5bf9\u8c61\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*\/\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;\n   \n    &nbsp;T&nbsp;getBean(Class\n    \n     &nbsp;clazz)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;applicationContext.getBean(clazz); &nbsp;&nbsp;&nbsp;&nbsp;} }\n    \n   <\/pre>\n<p>\u2461Md5Encrypt.java<\/p>\n<pre>import&nbsp;java.io.UnsupportedEncodingException;\nimport&nbsp;java.security.MessageDigest;\nimport&nbsp;java.security.NoSuchAlgorithmException;\n&nbsp;\n\/**\n&nbsp;*&nbsp;@Author:&nbsp;JCccc\n&nbsp;*&nbsp;@CreateTime:&nbsp;2018-10-30\n&nbsp;*&nbsp;@Description:\n&nbsp;*\/\npublic&nbsp;class&nbsp;Md5Encrypt&nbsp;{\n&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;char[]&nbsp;DIGITS&nbsp;=&nbsp;{'0',&nbsp;'1',&nbsp;'2',&nbsp;'3',&nbsp;'4',&nbsp;'5',&nbsp;'6',&nbsp;'7',&nbsp;'8',&nbsp;'9',&nbsp;'a',\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'b',&nbsp;'c',&nbsp;'d',&nbsp;'e',&nbsp;'f'};\n&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;\/**\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;\u5bf9\u5b57\u7b26\u4e32\u8fdb\u884cMD5\u52a0\u5bc6\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;text&nbsp;\u660e\u6587\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;\u5bc6\u6587\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*\/\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;String&nbsp;md5(String&nbsp;text)&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageDigest&nbsp;msgDigest&nbsp;=&nbsp;null;\n&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;msgDigest&nbsp;=&nbsp;MessageDigest.getInstance(\"MD5\");\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(NoSuchAlgorithmException&nbsp;e)&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;IllegalStateException(\"System&nbsp;doesn't&nbsp;support&nbsp;MD5&nbsp;algorithm.\");\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;\u6ce8\u610f\u8be5\u63a5\u53e3\u662f\u6309\u7167\u6307\u5b9a\u7f16\u7801\u5f62\u5f0f\u7b7e\u540d\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;msgDigest.update(text.getBytes(\"UTF-8\"));\n&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(UnsupportedEncodingException&nbsp;e)&nbsp;{\n&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;IllegalStateException(\"System&nbsp;doesn't&nbsp;support&nbsp;your&nbsp;&nbsp;EncodingException.\");\n&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte[]&nbsp;bytes&nbsp;=&nbsp;msgDigest.digest();\n&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;md5Str&nbsp;=&nbsp;new&nbsp;String(encodeHex(bytes));\n&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;md5Str;\n&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;char[]&nbsp;encodeHex(byte[]&nbsp;data)&nbsp;{\n&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;l&nbsp;=&nbsp;data.length;\n&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char[]&nbsp;out&nbsp;=&nbsp;new&nbsp;char[l&nbsp;&gt;&gt;&nbsp;4];\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out[j++]&nbsp;=&nbsp;DIGITS[0x0F&nbsp;&amp;&nbsp;data[i]];\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;out;\n&nbsp;&nbsp;&nbsp;&nbsp;}\n}<\/pre>\n<p>\u2462RedisUtils.java<\/p>\n<pre>import&nbsp;org.springframework.beans.factory.annotation.Autowired;\nimport&nbsp;org.springframework.data.redis.core.*;\nimport&nbsp;org.springframework.stereotype.Component;\nimport&nbsp;java.io.Serializable;\nimport&nbsp;java.util.List;\nimport&nbsp;java.util.Set;\nimport&nbsp;java.util.concurrent.TimeUnit;\n&nbsp;\n&nbsp;\n@Component\npublic&nbsp;class&nbsp;RedisUtils&nbsp;{\n&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;@Autowired\n&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;RedisTemplate&nbsp;redisTemplate;\n&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;\/**\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;\u5199\u5165String\u578b&nbsp;[&nbsp;\u952e\uff0c\u503c]\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;key\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;value\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*\/\n&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;boolean&nbsp;set(final&nbsp;String&nbsp;key,&nbsp;Object&nbsp;value)&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;result&nbsp;=&nbsp;false;\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ValueOperations\n   \n    &nbsp;operations&nbsp;=&nbsp;redisTemplate.opsForValue();\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;operations.set(key,&nbsp;value);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;true;\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;result;\n&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;\n&nbsp;\n&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;\/**\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;\u5199\u5165String\u578b,\u987a\u4fbf\u5e26\u6709\u8fc7\u671f\u65f6\u95f4&nbsp;[&nbsp;\u952e\uff0c\u503c]\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;key\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;value\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*\/\n&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;boolean&nbsp;setWithTime(final&nbsp;String&nbsp;key,&nbsp;Object&nbsp;value,int&nbsp;seconds)&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;result&nbsp;=&nbsp;false;\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{\n&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ValueOperations\n    \n     &nbsp;operations&nbsp;=&nbsp;redisTemplate.opsForValue(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;operations.set(key,&nbsp;value,seconds,&nbsp;TimeUnit.SECONDS); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;true; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;result; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;\/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;\u6279\u91cf\u5220\u9664\u5bf9\u5e94\u7684value &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;keys &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*\/ &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;remove(final&nbsp;String...&nbsp;keys)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(String&nbsp;key&nbsp;:&nbsp;keys)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;remove(key); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;\/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;\u6279\u91cf\u5220\u9664key &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;pattern &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*\/ &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;removePattern(final&nbsp;String&nbsp;pattern)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set\n     \n      &nbsp;keys&nbsp;=&nbsp;redisTemplate.keys(pattern); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(keys.size()&nbsp;&gt;&nbsp;0) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redisTemplate.delete(keys); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;\/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;\u5220\u9664\u5bf9\u5e94\u7684value &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;key &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*\/ &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;remove(final&nbsp;String&nbsp;key)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(exists(key))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redisTemplate.delete(key); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;\/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;\u5224\u65ad\u7f13\u5b58\u4e2d\u662f\u5426\u6709\u5bf9\u5e94\u7684value &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;key &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*\/ &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;boolean&nbsp;exists(final&nbsp;String&nbsp;key)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;redisTemplate.hasKey(key); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;\/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;\u8bfb\u53d6\u7f13\u5b58 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;key &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*\/ &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Object&nbsp;get(final&nbsp;String&nbsp;key)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;result&nbsp;=&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ValueOperations\n      \n       &nbsp;operations&nbsp;=&nbsp;redisTemplate.opsForValue(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;operations.get(key); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;result; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;\/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;\u54c8\u5e0c&nbsp;\u6dfb\u52a0 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;hash&nbsp;\u4e00\u4e2a\u952e\u503c(key-&gt;value)\u5bf9\u96c6\u5408 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;key &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;hashKey &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;value &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*\/ &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;hmSet(String&nbsp;key,&nbsp;Object&nbsp;hashKey,&nbsp;Object&nbsp;value)&nbsp;{ &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HashOperations\n       \n        &nbsp;hash&nbsp;=&nbsp;redisTemplate.opsForHash(); &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hash.put(key,&nbsp;hashKey,&nbsp;value); &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;\/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Hash\u83b7\u53d6\u6570\u636e &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;key &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;hashKey &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*\/ &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Object&nbsp;hmGet(String&nbsp;key,&nbsp;Object&nbsp;hashKey)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HashOperations\n        \n         &nbsp;hash&nbsp;=&nbsp;redisTemplate.opsForHash(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;hash.get(key,&nbsp;hashKey); &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;\/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;\u5217\u8868\u6dfb\u52a0 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;list:lpush&nbsp;key&nbsp;value1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;k &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;v &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*\/ &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;lPush(String&nbsp;k,&nbsp;Object&nbsp;v)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ListOperations\n         \n          &nbsp;list&nbsp;=&nbsp;redisTemplate.opsForList(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.rightPush(k,&nbsp;v); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;\/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;\u5217\u8868List\u83b7\u53d6 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;lrange\uff1a&nbsp;key&nbsp;0&nbsp;10&nbsp;(\u8bfb\u53d6\u7684\u4e2a\u6570&nbsp;\u4ece0\u5f00\u59cb&nbsp;\u8bfb\u53d6\u5230\u4e0b\u6807\u4e3a10&nbsp;\u7684\u6570\u636e) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;k &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;l &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;l1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*\/ &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;List\n          &nbsp;lRange(String&nbsp;k,&nbsp;long&nbsp;l,&nbsp;long&nbsp;l1)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ListOperations\n           \n            &nbsp;list&nbsp;=&nbsp;redisTemplate.opsForList(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;list.range(k,&nbsp;l,&nbsp;l1); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;\/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Set\u96c6\u5408\u6dfb\u52a0 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;key &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;value &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*\/ &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;add(String&nbsp;key,&nbsp;Object&nbsp;value)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetOperations\n            \n             &nbsp;set&nbsp;=&nbsp;redisTemplate.opsForSet(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set.add(key,&nbsp;value); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;\/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Set&nbsp;\u96c6\u5408\u83b7\u53d6 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;key &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*\/ &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Set\n             &nbsp;setMembers(String&nbsp;key)&nbsp;{ &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetOperations\n              \n               &nbsp;set&nbsp;=&nbsp;redisTemplate.opsForSet(); &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;set.members(key); &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;\/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sorted&nbsp;set&nbsp;:\u6709\u5e8f\u96c6\u5408\u6dfb\u52a0 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;key &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;value &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;scoure &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*\/ &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;zAdd(String&nbsp;key,&nbsp;Object&nbsp;value,&nbsp;double&nbsp;scoure)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZSetOperations\n               \n                &nbsp;zset&nbsp;=&nbsp;redisTemplate.opsForZSet(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zset.add(key,&nbsp;value,&nbsp;scoure); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;\/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Sorted&nbsp;set:\u6709\u5e8f\u96c6\u5408\u83b7\u53d6 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;key &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;scoure &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;scoure1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*\/ &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Set\n                &nbsp;rangeByScore(String&nbsp;key,&nbsp;double&nbsp;scoure,&nbsp;double&nbsp;scoure1)&nbsp;{ &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZSetOperations\n                 \n                  &nbsp;zset&nbsp;=&nbsp;redisTemplate.opsForZSet(); &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;zset.rangeByScore(key,&nbsp;scoure,&nbsp;scoure1); &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;\/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;\u6839\u636ekey\u83b7\u53d6Set\u4e2d\u7684\u6240\u6709\u503c &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;key&nbsp;\u952e &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*\/ &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Set\n                  \n                   &nbsp;sGet(String&nbsp;key)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;redisTemplate.opsForSet().members(key); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;\/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;\u6839\u636evalue\u4ece\u4e00\u4e2aset\u4e2d\u67e5\u8be2,\u662f\u5426\u5b58\u5728 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;key&nbsp;&nbsp;&nbsp;\u952e &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;value&nbsp;\u503c &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;true&nbsp;\u5b58\u5728&nbsp;false\u4e0d\u5b58\u5728 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*\/ &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;boolean&nbsp;sHasKey(String&nbsp;key,&nbsp;Object&nbsp;value)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;redisTemplate.opsForSet().isMember(key,&nbsp;value); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp; }\n                  \n                 \n               \n              \n            \n           \n         \n        \n       \n      \n     \n    \n   <\/pre>\n<h4>REDIS\u914d\u7f6e\u7c7b<\/h4>\n<p>RedisConfig.java<\/p>\n<pre>import&nbsp;com.fasterxml.jackson.annotation.JsonAutoDetect;\nimport&nbsp;com.fasterxml.jackson.annotation.PropertyAccessor;\nimport&nbsp;com.fasterxml.jackson.databind.ObjectMapper;\nimport&nbsp;org.springframework.cache.CacheManager;\nimport&nbsp;org.springframework.cache.annotation.EnableCaching;\nimport&nbsp;org.springframework.context.annotation.Bean;\nimport&nbsp;org.springframework.context.annotation.Configuration;\nimport&nbsp;org.springframework.data.redis.cache.RedisCacheConfiguration;\nimport&nbsp;org.springframework.data.redis.cache.RedisCacheManager;\nimport&nbsp;org.springframework.data.redis.connection.RedisConnectionFactory;\nimport&nbsp;org.springframework.data.redis.core.RedisTemplate;\nimport&nbsp;org.springframework.data.redis.core.StringRedisTemplate;\nimport&nbsp;org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;\nimport&nbsp;org.springframework.data.redis.serializer.RedisSerializationContext;\nimport&nbsp;org.springframework.data.redis.serializer.StringRedisSerializer;\nimport&nbsp;static&nbsp;org.springframework.data.redis.cache.RedisCacheConfiguration.defaultCacheConfig;\n&nbsp;\n\/**\n&nbsp;*&nbsp;@Author:&nbsp;JCccc\n&nbsp;*&nbsp;@CreateTime:&nbsp;2018-09-11\n&nbsp;*&nbsp;@Description:\n&nbsp;*\/\n@Configuration\n@EnableCaching\npublic&nbsp;class&nbsp;RedisConfig&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;@Bean\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;CacheManager&nbsp;cacheManager(RedisConnectionFactory&nbsp;connectionFactory)&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RedisCacheConfiguration&nbsp;cacheConfiguration&nbsp;=\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;defaultCacheConfig()\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.disableCachingNullValues()\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new&nbsp;Jackson2JsonRedisSerializer(Object.class)));\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;RedisCacheManager.builder(connectionFactory).cacheDefaults(cacheConfiguration).build();\n&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;\n&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;@Bean\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;RedisTemplate\n   \n    &nbsp;redisTemplate(RedisConnectionFactory&nbsp;factory)&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RedisTemplate\n    \n     &nbsp;redisTemplate&nbsp;=&nbsp;new&nbsp;RedisTemplate(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redisTemplate.setConnectionFactory(factory); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Jackson2JsonRedisSerializer&nbsp;jackson2JsonRedisSerializer&nbsp;=&nbsp;new&nbsp;Jackson2JsonRedisSerializer(Object.class); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectMapper&nbsp;om&nbsp;=&nbsp;new&nbsp;ObjectMapper(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;om.setVisibility(PropertyAccessor.ALL,&nbsp;JsonAutoDetect.Visibility.ANY); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jackson2JsonRedisSerializer.setObjectMapper(om); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u5e8f\u5217\u5316\u8bbe\u7f6e&nbsp;\uff0c\u8fd9\u6837\u4e3a\u4e86\u5b58\u50a8\u64cd\u4f5c\u5bf9\u8c61\u65f6\u6b63\u5e38\u663e\u793a\u7684\u6570\u636e\uff0c\u4e5f\u80fd\u6b63\u5e38\u5b58\u50a8\u548c\u83b7\u53d6 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redisTemplate.setKeySerializer(new&nbsp;StringRedisSerializer()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redisTemplate.setHashKeySerializer(new&nbsp;StringRedisSerializer()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;redisTemplate; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@Bean &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;StringRedisTemplate&nbsp;stringRedisTemplate(RedisConnectionFactory&nbsp;factory)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringRedisTemplate&nbsp;stringRedisTemplate&nbsp;=&nbsp;new&nbsp;StringRedisTemplate(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stringRedisTemplate.setConnectionFactory(factory); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;stringRedisTemplate; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp; }\n    \n   <\/pre>\n<p>\u6700\u540e\u5199\u6d4b\u8bd5\u63a5\u53e3\uff0c\u770b\u770b\u6548\u679c\uff08\u4e00\u4e2aPOST\uff0c\u4e00\u4e2aGET\uff09\uff1a<\/p>\n<p>\u6545\u610f\u628a\u65f6\u95f4\u653e\u5927\uff0c1000\u79d2\u5185\u91cd\u590d\u8c03\u7528\uff0c\u7b26\u5408\u6211\u4eec\u62e6\u622a\u89c4\u5219\u7684\u90fd\u4f1a\u88ab\u62e6\u622a\u3002<\/p>\n<p>TestController.java<\/p>\n<pre>import&nbsp;com.example.repeatdemo.dto.PayOrderApply;\nimport&nbsp;com.example.repeatdemo.annotation.RepeatDaMie;\nimport&nbsp;org.slf4j.Logger;\nimport&nbsp;org.slf4j.LoggerFactory;\nimport&nbsp;org.springframework.web.bind.annotation.*;\n&nbsp;\n\/**\n&nbsp;*&nbsp;@Author:&nbsp;JCccc\n&nbsp;*&nbsp;@Date:&nbsp;2022-6-05&nbsp;9:44\n&nbsp;*&nbsp;@Description:\n&nbsp;*\/\n@RestController\npublic&nbsp;class&nbsp;TestController&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;final&nbsp;Logger&nbsp;log&nbsp;=&nbsp;LoggerFactory.getLogger(this.getClass());\n&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;@RepeatDaMie(second&nbsp;=&nbsp;1000,describe&nbsp;=&nbsp;\"\u5c0a\u656c\u7684\u5ba2\u6237,\u60a8\u6162\u70b9\")\n&nbsp;&nbsp;&nbsp;&nbsp;@PostMapping(value&nbsp;=&nbsp;\"\/doPost\")\n&nbsp;&nbsp;&nbsp;&nbsp;@ResponseBody\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;test(@RequestBody&nbsp;PayOrderApply&nbsp;payOrderApply)&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info(\"Controller&nbsp;POST\u8bf7\u6c42:\"+payOrderApply.toString());\n&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;@RepeatDaMie(second&nbsp;=&nbsp;1000,describe&nbsp;=&nbsp;\"\u5927\u54e5,\u4f60\u51b7\u9759\u70b9\")\n&nbsp;&nbsp;&nbsp;&nbsp;@GetMapping(value&nbsp;=&nbsp;\"\/doGet\")\n&nbsp;&nbsp;&nbsp;&nbsp;@ResponseBody\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;doGet(&nbsp;PayOrderApply&nbsp;payOrderApply)&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info(\"Controller&nbsp;GET\u8bf7\u6c42:\"+payOrderApply.toString());\n&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;\n}<\/pre>\n<p>PayOrderApply.java<\/p>\n<pre>\/**\n&nbsp;*&nbsp;@Author:&nbsp;JCccc\n&nbsp;*&nbsp;@Date:&nbsp;2022-6-12&nbsp;9:46\n&nbsp;*&nbsp;@Description:\n&nbsp;*\/\npublic&nbsp;class&nbsp;PayOrderApply&nbsp;{\n&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;sn;\n&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Long&nbsp;amount;\n&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;proCode;\n&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;getSn()&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;sn;\n&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setSn(String&nbsp;sn)&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.sn&nbsp;=&nbsp;sn;\n&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Long&nbsp;getAmount()&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;amount;\n&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setAmount(Long&nbsp;amount)&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.amount&nbsp;=&nbsp;amount;\n&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;getProCode()&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;proCode;\n&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setProCode(String&nbsp;proCode)&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.proCode&nbsp;=&nbsp;proCode;\n&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;@Override\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;toString()&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;\"PayOrderApply{\"&nbsp;+\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"sn='\"&nbsp;+&nbsp;sn&nbsp;+&nbsp;'\\''&nbsp;+\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\",&nbsp;amount=\"&nbsp;+&nbsp;amount&nbsp;+\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\",&nbsp;proCode='\"&nbsp;+&nbsp;proCode&nbsp;+&nbsp;'\\''&nbsp;+\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'}';\n&nbsp;&nbsp;&nbsp;&nbsp;}\n}<\/pre>\n<p><img decoding=\"async\" src=\"https:\/\/www.17golang.com\/uploads\/20230509\/1683638463645a48bfd660b.png\" class=\"aligncenter\"><\/p>\n<p>redis\u751f\u6210\u4e86\u503c\uff1a<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.17golang.com\/uploads\/20230509\/1683638463645a48bfe15f2.png\" class=\"aligncenter\"><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.17golang.com\/uploads\/20230509\/1683638463645a48bfeb060.png\" class=\"aligncenter\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u5982\u4f55\u5728Spring Boot\u4e2d\u4f7f&#46;&#46;&#46;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[101],"tags":[],"class_list":["post-201698","post","type-post","status-publish","format-standard","hentry","category-database"],"_links":{"self":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/posts\/201698","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/comments?post=201698"}],"version-history":[{"count":0,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/posts\/201698\/revisions"}],"wp:attachment":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/media?parent=201698"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/categories?post=201698"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/tags?post=201698"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}