{"id":202315,"date":"2025-05-10T11:48:46","date_gmt":"2025-05-10T03:48:46","guid":{"rendered":"https:\/\/server.hk\/cnblog\/202315\/"},"modified":"2025-05-10T11:48:46","modified_gmt":"2025-05-10T03:48:46","slug":"springboot%e6%80%8e%e4%b9%88%e8%87%aa%e5%ae%9a%e4%b9%89redis%e5%ae%9e%e7%8e%b0%e7%bc%93%e5%ad%98%e5%ba%8f%e5%88%97%e5%8c%96","status":"publish","type":"post","link":"https:\/\/server.hk\/cnblog\/202315\/","title":{"rendered":"SpringBoot\u600e\u4e48\u81ea\u5b9a\u4e49Redis\u5b9e\u73b0\u7f13\u5b58\u5e8f\u5217\u5316"},"content":{"rendered":"<p><b><\/b> <\/p>\n<h1>SpringBoot\u600e\u4e48\u81ea\u5b9a\u4e49Redis\u5b9e\u73b0\u7f13\u5b58\u5e8f\u5217\u5316<\/h1>\n<p><span style=\"cursor: pointer\"><i><\/i>\u6536\u85cf<\/span> <\/p>\n<p>IT\u884c\u4e1a\u76f8\u5bf9\u4e8e\u4e00\u822c\u4f20\u7edf\u884c\u4e1a\uff0c\u53d1\u5c55\u66f4\u65b0\u901f\u5ea6\u66f4\u5feb\uff0c\u4e00\u65e6\u505c\u6b62\u4e86\u5b66\u4e60\uff0c\u5f88\u5feb\u5c31\u4f1a\u88ab\u884c\u4e1a\u6240\u6dd8\u6c70\u3002\u6240\u4ee5\u6211\u4eec\u9700\u8981\u8e0f\u8e0f\u5b9e\u5b9e\u7684\u4e0d\u65ad\u5b66\u4e60\uff0c\u7cbe\u8fdb\u81ea\u5df1\u7684\u6280\u672f\uff0c\u5c24\u5176\u662f\u521d\u5b66\u8005\u3002\u4eca\u5929golang\u5b66\u4e60\u7f51\u7ed9\u5927\u5bb6\u6574\u7406\u4e86\u300aSpringBoot\u600e\u4e48\u81ea\u5b9a\u4e49Redis\u5b9e\u73b0\u7f13\u5b58\u5e8f\u5217\u5316\u300b\uff0c\u804a\u804a\uff0c\u6211\u4eec\u4e00\u8d77\u6765\u770b\u770b\u5427\uff01<\/p>\n<h3>1\u3001\u81ea\u5b9a\u4e49RedisTemplate<\/h3>\n<h4>1.1\u3001Redis API\u9ed8\u8ba4\u5e8f\u5217\u5316\u673a\u5236<\/h4>\n<p>\u57fa\u4e8eAPI\u7684Redis\u7f13\u5b58\u5b9e\u73b0\u662f\u4f7f\u7528RedisTemplate\u6a21\u677f\u8fdb\u884c\u6570\u636e\u7f13\u5b58\u64cd\u4f5c\u7684\uff0c\u8fd9\u91cc\u6253\u5f00RedisTemplate\u7c7b\uff0c\u67e5\u770b\u8be5\u7c7b\u7684\u6e90\u7801\u4fe1\u606f<\/p>\n<pre>public&nbsp;class&nbsp;RedisTemplate&lt;K,&nbsp;V&gt;&nbsp;extends&nbsp;RedisAccessor&nbsp;implements&nbsp;RedisOperations&lt;K,&nbsp;V&gt;,&nbsp;BeanClassLoaderAware&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;\u58f0\u660e\u4e86key\u3001value\u7684\u5404\u79cd\u5e8f\u5217\u5316\u65b9\u5f0f\uff0c\u521d\u59cb\u503c\u4e3a\u7a7a\n&nbsp;&nbsp;&nbsp;&nbsp;@Nullable\n&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;RedisSerializer&nbsp;keySerializer&nbsp;=&nbsp;null;\n&nbsp;&nbsp;&nbsp;&nbsp;@Nullable\n&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;RedisSerializer&nbsp;valueSerializer&nbsp;=&nbsp;null;\n&nbsp;&nbsp;&nbsp;&nbsp;@Nullable\n&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;RedisSerializer&nbsp;hashKeySerializer&nbsp;=&nbsp;null;\n&nbsp;&nbsp;&nbsp;&nbsp;@Nullable\n&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;RedisSerializer&nbsp;hashValueSerializer&nbsp;=&nbsp;null;\n...\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;\u8fdb\u884c\u9ed8\u8ba4\u5e8f\u5217\u5316\u65b9\u5f0f\u8bbe\u7f6e\uff0c\u8bbe\u7f6e\u4e3aJDK\u5e8f\u5217\u5316\u65b9\u5f0f\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;afterPropertiesSet()&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.afterPropertiesSet();\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;defaultUsed&nbsp;=&nbsp;false;\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(this.defaultSerializer&nbsp;==&nbsp;null)&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.defaultSerializer&nbsp;=&nbsp;new&nbsp;JdkSerializationRedisSerializer(\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.classLoader&nbsp;!=&nbsp;null&nbsp;?\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;&nbsp;&nbsp;&nbsp;&nbsp;this.classLoader&nbsp;:&nbsp;this.getClass().getClassLoader());\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...\n&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...\n}<\/pre>\n<p>\u4ece\u4e0a\u8ff0RedisTemplate\u6838\u5fc3\u6e90\u7801\u53ef\u4ee5\u770b\u51fa\uff0c\u5728RedisTemplate\u5185\u90e8\u58f0\u660e\u4e86\u7f13\u5b58\u6570\u636ekey\u3001value\u7684\u5404\u79cd\u5e8f\u5217\u5316\u65b9\u5f0f\uff0c\u4e14\u521d\u59cb\u503c\u90fd\u4e3a\u7a7a\uff1b\u5728afterPropertiesSet()\u65b9\u6cd5\u4e2d\uff0c\u5224\u65ad\u5982\u679c\u9ed8\u8ba4\u5e8f\u5217\u5316\u53c2\u6570defaultSerializer\u4e3a\u7a7a\uff0c\u5c06\u6570\u636e\u7684\u9ed8\u8ba4\u5e8f\u5217\u5316\u65b9\u5f0f\u8bbe\u7f6e\u4e3aJdkSerializationRedisSerializer<\/p>\n<p>\u6839\u636e\u4e0a\u8ff0\u6e90\u7801\u4fe1\u606f\u7684\u5206\u6790\uff0c\u53ef\u4ee5\u5f97\u5230\u4ee5\u4e0b\u4e24\u4e2a\u91cd\u8981\u7684\u7ed3\u8bba\uff1a<\/p>\n<p>\uff081\uff09\u4f7f\u7528RedisTemplate\u8fdb\u884cRedis\u6570\u636e\u7f13\u5b58\u64cd\u4f5c\u65f6\uff0c\u5185\u90e8\u9ed8\u8ba4\u4f7f\u7528\u7684\u662fJdkSerializationRedisSerializer\u5e8f\u5217\u5316\u65b9\u5f0f\uff0c\u6240\u4ee5\u8fdb\u884c\u6570\u636e\u7f13\u5b58\u7684\u5b9e\u4f53\u7c7b\u5fc5\u987b\u5b9e\u73b0JDK\u81ea\u5e26\u7684\u5e8f\u5217\u5316\u63a5\u53e3\uff08\u4f8b\u5982Serializable\uff09\uff1b<\/p>\n<p>\uff082\uff09\u4f7f\u7528RedisTemplate\u8fdb\u884cRedis\u6570\u636e\u7f13\u5b58\u64cd\u4f5c\u65f6\uff0c\u5982\u679c\u81ea\u5b9a\u4e49\u4e86\u7f13\u5b58\u5e8f\u5217\u5316\u65b9\u5f0fdefaultSerializer\uff0c\u90a3\u4e48\u5c06\u4f7f\u7528\u81ea\u5b9a\u4e49\u7684\u5e8f\u5217\u5316\u65b9\u5f0f\u3002<\/p>\n<p>\u53e6\u5916\uff0c\u5728RedisTemplate\u7c7b\u6e90\u7801\u4e2d\uff0c\u770b\u5230\u7684\u7f13\u5b58\u6570\u636ekey\u3001value\u7684\u5404\u79cd\u5e8f\u5217\u5316\u7c7b\u578b\u90fd\u662fRedisSerializer\u3002\u8fdb\u5165RedisSerializer\u6e90\u7801\u67e5\u770bRedisSerializer\u652f\u6301\u7684\u5e8f\u5217\u5316\u65b9\u5f0f\uff08\u8fdb\u5165\u8be5\u7c7b\u540e\uff0c\u4f7f\u7528Ctrl+Alt+\u5de6\u952e\u5355\u51fb\u7c7b\u540d\u67e5\u770b\uff09<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.17golang.com\/uploads\/20240403\/1712138612660d297474219.png\" class=\"aligncenter\"><\/p>\n<p>\u53ef\u4ee5\u770b\u51fa\uff0cRedisSerializer\u662f\u4e00\u4e2aRedis\u5e8f\u5217\u5316\u63a5\u53e3\uff0c\u9ed8\u8ba4\u67096\u4e2a\u5b9e\u73b0\u7c7b\uff0c\u8fd96\u4e2a\u5b9e\u73b0\u7c7b\u4ee3\u8868\u4e866\u79cd\u4e0d\u540c\u7684\u6570\u636e\u5e8f\u5217\u5316\u65b9\u5f0f\u3002\u5176\u4e2d\uff0cJdkSerializationRedisSerializer\u662fJDK\u81ea\u5e26\u7684\uff0c\u4e5f\u662fRedisTemplate\u5185\u90e8\u9ed8\u8ba4\u4f7f\u7528\u7684\u6570\u636e\u5e8f\u5217\u5316\u65b9\u5f0f\uff0c\u5f00\u53d1\u8005\u53ef\u4ee5\u6839\u636e\u9700\u8981\u9009\u62e9\u5176\u4ed6\u652f\u6301\u7684\u5e8f\u5217\u5316\u65b9\u5f0f\uff08\u4f8b\u5982JSON\u65b9\u5f0f\uff09<\/p>\n<h4>1.2\u3001\u81ea\u5b9a\u4e49RedisTemplate\u5e8f\u5217\u5316\u673a\u5236<\/h4>\n<p>\u5728\u9879\u76ee\u4e2d\u5f15\u5165Redis\u4f9d\u8d56\u540e\uff0cSpring Boot\u63d0\u4f9b\u7684RedisAutoConfiguration\u81ea\u52a8\u914d\u7f6e\u4f1a\u751f\u6548\u3002\u6253\u5f00RedisAutoConfiguration\u7c7b\uff0c\u67e5\u770b\u5185\u90e8\u6e90\u7801\u4e2d\u5173\u4e8eRedisTemplate\u7684\u5b9a\u4e49\u65b9\u5f0f<\/p>\n<pre>public&nbsp;class&nbsp;RedisAutoConfiguration&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;@Bean\n&nbsp;&nbsp;&nbsp;&nbsp;@ConditionalOnMissingBean(\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;=&nbsp;{\"redisTemplate\"}\n&nbsp;&nbsp;&nbsp;&nbsp;)\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;RedisTemplate&lt;Object,&nbsp;Object&gt;&nbsp;redisTemplate(RedisConnectionFactory&nbsp;redisConnectionFactory)&nbsp;throws&nbsp;UnknownHostException&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RedisTemplate&lt;Object,&nbsp;Object&gt;&nbsp;template&nbsp;=&nbsp;new&nbsp;RedisTemplate();\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template.setConnectionFactory(redisConnectionFactory);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;template;\n&nbsp;&nbsp;&nbsp;&nbsp;}\n...\n}<\/pre>\n<p>\u4ece\u4e0a\u8ff0RedisAutoConfiguration\u6838\u5fc3\u6e90\u7801\u4e2d\u53ef\u4ee5\u770b\u51fa\uff0c\u5728Redis\u81ea\u52a8\u914d\u7f6e\u7c7b\u4e2d\uff0c\u901a\u8fc7Redis\u8fde\u63a5\u5de5\u5382RedisConnectionFactory\u521d\u59cb\u5316\u4e86\u4e00\u4e2aRedisTemplate\uff1b\u8be5\u7c7b\u4e0a\u65b9\u6dfb\u52a0\u4e86@ConditionalOnMissingBean\u6ce8\u89e3\uff08\u987e\u540d\u601d\u4e49\uff0c\u5f53\u67d0\u4e2aBean\u4e0d\u5b58\u5728\u65f6\u751f\u6548\uff09\uff0c\u7528\u6765\u8868\u660e\u5982\u679c\u5f00\u53d1\u8005\u81ea\u5b9a\u4e49\u4e86\u4e00\u4e2a\u540d\u4e3aredisTemplate\u7684Bean\uff0c\u5219\u8be5\u9ed8\u8ba4\u521d\u59cb\u5316\u7684RedisTemplate\u4e0d\u4f1a\u751f\u6548\u3002<\/p>\n<p>\u5982\u679c\u60f3\u8981\u4f7f\u7528\u81ea\u5b9a\u4e49\u5e8f\u5217\u5316\u65b9\u5f0f\u7684RedisTemplate\u8fdb\u884c\u6570\u636e\u7f13\u5b58\u64cd\u4f5c\uff0c\u53ef\u4ee5\u53c2\u8003\u4e0a\u8ff0\u6838\u5fc3\u4ee3\u7801\u521b\u5efa\u4e00\u4e2a\u540d\u4e3aredisTemplate\u7684Bean\u7ec4\u4ef6\uff0c\u5e76\u5728\u8be5\u7ec4\u4ef6\u4e2d\u8bbe\u7f6e\u5bf9\u5e94\u7684\u5e8f\u5217\u5316\u65b9\u5f0f\u5373\u53ef<\/p>\n<p>\u63a5\u4e0b\u6765\uff0c\u5728\u9879\u76ee\u4e2d\u521b\u5efa\u540d\u4e3acom.lagou.config\u7684\u5305\uff0c\u5728\u8be5\u5305\u4e0b\u521b\u5efa\u4e00\u4e2aRedis\u81ea\u5b9a\u4e49\u914d\u7f6e\u7c7bRedisConfig\uff0c\u5e76\u6309\u7167\u4e0a\u8ff0\u601d\u8def\u81ea\u5b9a\u4e49\u540d\u4e3aredisTemplate\u7684Bean\u7ec4\u4ef6<\/p>\n<pre>@Configuration\npublic&nbsp;class&nbsp;RedisConfig&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;\u81ea\u5b9a\u4e49RedisTemplate\n&nbsp;&nbsp;&nbsp;&nbsp;@Bean\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;RedisTemplate&lt;Object,&nbsp;Object&gt;&nbsp;redisTemplate(RedisConnectionFactory&nbsp;redisConnectionFactory)&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RedisTemplate&lt;Object,&nbsp;Object&gt;&nbsp;template&nbsp;=&nbsp;new&nbsp;RedisTemplate&lt;&gt;();\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template.setConnectionFactory(redisConnectionFactory);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;\u521b\u5efa\u4e00\u4e2aJSON\u683c\u5f0f\u5e8f\u5217\u5316\u5bf9\u8c61\uff0c\u5bf9\u7f13\u5b58\u6570\u636e\u7684key\u548cvalue\u8fdb\u884c\u8f6c\u6362\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Jackson2JsonRedisSerializer&nbsp;jackson2JsonRedisSerializer&nbsp;=&nbsp;new&nbsp;Jackson2JsonRedisSerializer(Object.class);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;\u89e3\u51b3\u67e5\u8be2\u7f13\u5b58\u8f6c\u6362\u5f02\u5e38\u7684\u95ee\u9898\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectMapper&nbsp;om&nbsp;=&nbsp;new&nbsp;ObjectMapper();\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;om.setVisibility(PropertyAccessor.ALL,&nbsp;JsonAutoDetect.Visibility.ANY);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jackson2JsonRedisSerializer.setObjectMapper(om);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;\u8bbe\u7f6eRedisTemplate\u6a21\u677fapi\u5e8f\u5217\u5316\u65b9\u5f0f\u4e3ajson\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template.setDefaultSerializer(jackson2JsonRedisSerializer);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;template;\n&nbsp;&nbsp;&nbsp;&nbsp;}\n}<\/pre>\n<p>\u901a\u8fc7@Configuration\u6ce8\u89e3\u5b9a\u4e49\u4e86\u4e00\u4e2aRedisConfig\u914d\u7f6e\u7c7b\uff0c\u5e76\u4f7f\u7528@Bean\u6ce8\u89e3\u6ce8\u5165\u4e86\u4e00\u4e2a\u9ed8\u8ba4\u540d\u79f0\u4e3a\u65b9\u6cd5\u540d\u7684redisTemplate\u7ec4\u4ef6\uff08\u6ce8\u610f\uff0c\u8be5Bean\u7ec4\u4ef6\u540d\u79f0\u5fc5\u987b\u662fredisTemplate\uff09\u3002\u5728\u5b9a\u4e49\u7684Bean\u7ec4\u4ef6\u4e2d\uff0c\u81ea\u5b9a\u4e49\u4e86\u4e00\u4e2aRedisTemplate\uff0c\u4f7f\u7528\u81ea\u5b9a\u4e49\u7684Jackson2JsonRedisSerializer\u6570\u636e\u5e8f\u5217\u5316\u65b9\u5f0f\uff1b\u5728\u5b9a\u5236\u5e8f\u5217\u5316\u65b9\u5f0f\u4e2d\uff0c\u5b9a\u4e49\u4e86\u4e00\u4e2aObjectMapper\u7528\u4e8e\u8fdb\u884c\u6570\u636e\u8f6c\u6362\u8bbe\u7f6e<\/p>\n<h4>1.3\u3001\u6548\u679c\u6d4b\u8bd5<\/h4>\n<p><img decoding=\"async\" src=\"https:\/\/www.17golang.com\/uploads\/20240403\/1712138612660d29747924a.png\" class=\"aligncenter\"><\/p>\n<p>\u53ef\u4ee5\u770b\u51fa\uff0c\u6267\u884cfindById()\u65b9\u6cd5\u6b63\u786e\u67e5\u8be2\u51fa\u7528\u6237\u8bc4\u8bba\u4fe1\u606fComment\uff0c\u91cd\u590d\u8fdb\u884c\u540c\u6837\u7684\u67e5\u8be2\u64cd\u4f5c\uff0c\u6570\u636e\u5e93\u53ea\u6267\u884c\u4e86\u4e00\u6b21SQL\u8bed\u53e5\uff0c\u8fd9\u8bf4\u660e\u5b9a\u5236\u7684Redis\u7f13\u5b58\u751f\u6548\u3002<\/p>\n<p>\u4f7f\u7528Redis\u5ba2\u6237\u7aef\u53ef\u89c6\u5316\u7ba1\u7406\u5de5\u5177Redis Desktop Manager\u67e5\u770b\u7f13\u5b58\u6570\u636e \uff1a<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.17golang.com\/uploads\/20240403\/1712138612660d29747aa9e.png\" class=\"aligncenter\"><\/p>\n<p>\u6267\u884cfindById()\u65b9\u6cd5\u67e5\u8be2\u51fa\u7528\u6237\u8bc4\u8bba\u4fe1\u606fComment\u6b63\u786e\u5b58\u50a8\u5230\u4e86Redis\u7f13\u5b58\u5e93\u4e2d\uff0c\u4e14\u7f13\u5b58\u5230Redis\u670d\u52a1\u7684\u6570\u636e\u5df2\u7ecf\u4f7f\u7528\u4e86JSON\u683c\u5f0f\u5b58\u50a8\u5c55\u793a\uff0c\u67e5\u770b\u548c\u7ba1\u7406\u4e5f\u975e\u5e38\u65b9\u4fbf\uff0c\u8bf4\u660e\u81ea\u5b9a\u4e49\u7684Redis API\u6a21\u677f\u5de5\u5177RedisTemplate\u751f\u6548<\/p>\n<h3>2\u3001\u81ea\u5b9a\u4e49RedisCacheManager<\/h3>\n<p>\u521a\u521a\u9488\u5bf9\u57fa\u4e8e API\u65b9\u5f0f\u7684RedisTemplate\u8fdb\u884c\u4e86\u81ea\u5b9a\u4e49\u5e8f\u5217\u5316\u65b9\u5f0f\u7684\u6539\u8fdb\uff0c\u4ece\u800c\u5b9e\u73b0\u4e86JSON\u5e8f\u5217\u5316\u65b9\u5f0f\u7f13\u5b58\u6570\u636e\uff0c\u4f46\u662f\u8fd9\u79cd\u81ea\u5b9a\u4e49\u7684RedisTemplate\u5bf9\u4e8e\u57fa\u4e8e\u6ce8\u89e3\u7684Redis\u7f13\u5b58\u6765\u8bf4\uff0c\u662f\u6ca1\u6709\u4f5c\u7528\u7684\u3002<\/p>\n<p>\u63a5\u4e0b\u6765\uff0c\u9488\u5bf9\u57fa\u4e8e\u6ce8\u89e3\u7684Redis\u7f13\u5b58\u673a\u5236\u548c\u81ea\u5b9a\u4e49\u5e8f\u5217\u5316\u65b9\u5f0f\u8fdb\u884c\u8bb2\u89e3<\/p>\n<h4>2.1\u3001Redis\u6ce8\u89e3\u9ed8\u8ba4\u5e8f\u5217\u5316\u673a\u5236<\/h4>\n<p>\u6253\u5f00Spring Boot\u6574\u5408Redis\u7ec4\u4ef6\u63d0\u4f9b\u7684\u7f13\u5b58\u81ea\u52a8\u914d\u7f6e\u7c7bRedisCacheConfiguration\uff08org.springframework.boot.autoconfigure.cache\u5305\u4e0b\u7684\uff09\uff0c\u67e5\u770b\u8be5\u7c7b\u7684\u6e90\u7801\u4fe1\u606f\uff0c\u5176\u6838\u5fc3\u4ee3\u7801\u5982\u4e0b<\/p>\n<pre>@Configuration\nclass&nbsp;RedisCacheConfiguration&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;@Bean\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;RedisCacheManager&nbsp;cacheManager(RedisConnectionFactory&nbsp;redisConnectionFactory,&nbsp;ResourceLoader&nbsp;resourceLoader)&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RedisCacheManagerBuilder&nbsp;builder&nbsp;=&nbsp;RedisCacheManager\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.builder(redisConnectionFactory)\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.cacheDefaults(this.determineConfiguration(resourceLoader.getClassLoader()));\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;String&gt;&nbsp;cacheNames&nbsp;=&nbsp;this.cacheProperties.getCacheNames();\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!cacheNames.isEmpty())&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.initialCacheNames(new&nbsp;LinkedHashSet(cacheNames));\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(RedisCacheManager)&nbsp;this.customizerInvoker.customize(builder.build());\n&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;org.springframework.data.redis.cache.RedisCacheConfiguration\n&nbsp;&nbsp;&nbsp;&nbsp;determineConfiguration(ClassLoader&nbsp;classLoader)&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(this.redisCacheConfiguration&nbsp;!=&nbsp;null)&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;this.redisCacheConfiguration;\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Redis&nbsp;redisProperties&nbsp;=&nbsp;this.cacheProperties.getRedis();\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.springframework.data.redis.cache.RedisCacheConfiguration&nbsp;config&nbsp;=&nbsp;org.springframework.data.redis.cache.RedisCacheConfiguration.defaultCacheConfig();\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;config&nbsp;=&nbsp;config.serializeValuesWith(SerializationPair.fromSerializer(\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;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;JdkSerializationRedisSerializer(classLoader)));\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;config;\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;}\n}<\/pre>\n<p>\u4ece\u4e0a\u8ff0\u6838\u5fc3\u6e90\u7801\u4e2d\u53ef\u4ee5\u770b\u51fa\uff0c\u540cRedisTemplate\u6838\u5fc3\u6e90\u7801\u7c7b\u4f3c\uff0cRedisCacheConfiguration\u5185\u90e8\u540c\u6837\u901a\u8fc7Redis\u8fde\u63a5\u5de5\u5382RedisConnectionFactory\u5b9a\u4e49\u4e86\u4e00\u4e2a\u7f13\u5b58\u7ba1\u7406\u5668RedisCacheManager\uff1b\u540c\u65f6\u5b9a\u5236RedisCacheManager\u65f6\uff0c\u4e5f\u9ed8\u8ba4\u4f7f\u7528\u4e86JdkSerializationRedisSerializer\u5e8f\u5217\u5316\u65b9\u5f0f\u3002<\/p>\n<p>\u5982\u679c\u60f3\u8981\u4f7f\u7528\u81ea\u5b9a\u4e49\u5e8f\u5217\u5316\u65b9\u5f0f\u7684RedisCacheManager\u8fdb\u884c\u6570\u636e\u7f13\u5b58\u64cd\u4f5c\uff0c\u53ef\u4ee5\u53c2\u8003\u4e0a\u8ff0\u6838\u5fc3\u4ee3\u7801\u521b\u5efa\u4e00\u4e2a\u540d\u4e3acacheManager\u7684Bean\u7ec4\u4ef6\uff0c\u5e76\u5728\u8be5\u7ec4\u4ef6\u4e2d\u8bbe\u7f6e\u5bf9\u5e94\u7684\u5e8f\u5217\u5316\u65b9\u5f0f\u5373\u53ef<\/p>\n<p>\u6ce8\u610f\uff0c\u5728Spring Boot 2.X\u7248\u672c\u4e2d\uff0cRedisCacheManager\u662f\u5355\u72ec\u8fdb\u884c\u6784\u5efa\u7684\u3002\u56e0\u6b64\uff0c\u5728SpringBoot 2.X\u7248\u672c\u4e2d\uff0c\u5bf9RedisTemplate\u8fdb\u884c\u81ea\u5b9a\u4e49\u5e8f\u5217\u5316\u673a\u5236\u6784\u5efa\u540e\uff0c\u4ecd\u7136\u65e0\u6cd5\u5bf9RedisCacheManager\u5185\u90e8\u9ed8\u8ba4\u5e8f\u5217\u5316\u673a\u5236\u8fdb\u884c\u8986\u76d6\uff08\u8fd9\u4e5f\u5c31\u89e3\u91ca\u4e86\u57fa \u4e8e\u6ce8\u89e3\u7684Redis\u7f13\u5b58\u5b9e\u73b0\u4ecd\u7136\u4f1a\u4f7f\u7528JDK\u9ed8\u8ba4\u5e8f\u5217\u5316\u673a\u5236\u7684\u539f\u56e0\uff09\uff0c\u60f3\u8981\u57fa\u4e8e\u6ce8\u89e3\u7684Redis\u7f13\u5b58\u5b9e\u73b0\u4e5f\u4f7f\u7528\u81ea\u5b9a\u4e49\u5e8f\u5217\u5316\u673a\u5236\uff0c\u9700\u8981\u81ea\u5b9a\u4e49RedisCacheManager<\/p>\n<h4>2.2\u3001\u81ea\u5b9a\u4e49RedisCacheManager<\/h4>\n<p>\u5728\u9879\u76ee\u7684Redis\u914d\u7f6e\u7c7bRedisConfig\u4e2d\uff0c\u6309\u7167\u4e0a\u4e00\u6b65\u5206\u6790\u7684\u5b9a\u5236\u65b9\u6cd5\u81ea\u5b9a\u4e49\u540d\u4e3acacheManager\u7684Bean\u7ec4\u4ef6<\/p>\n<pre>&nbsp;&nbsp;&nbsp;&nbsp;@Bean\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;RedisCacheManager&nbsp;cacheManager(RedisConnectionFactory&nbsp;redisConnectionFactory)&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;\u5206\u522b\u521b\u5efaString\u548cJSON\u683c\u5f0f\u5e8f\u5217\u5316\u5bf9\u8c61\uff0c\u5bf9\u7f13\u5b58\u6570\u636ekey\u548cvalue\u8fdb\u884c\u8f6c\u6362\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RedisSerializer&lt;String&gt;&nbsp;strSerializer&nbsp;=&nbsp;new&nbsp;StringRedisSerializer();\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Jackson2JsonRedisSerializer&nbsp;jacksonSerial&nbsp;=&nbsp;new&nbsp;Jackson2JsonRedisSerializer(Object.class);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;\u89e3\u51b3\u67e5\u8be2\u7f13\u5b58\u8f6c\u6362\u5f02\u5e38\u7684\u95ee\u9898\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectMapper&nbsp;om&nbsp;=&nbsp;new&nbsp;ObjectMapper();\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;om.setVisibility(PropertyAccessor.ALL,&nbsp;JsonAutoDetect.Visibility.ANY);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,&nbsp;ObjectMapper.DefaultTyping.NON_FINAL,&nbsp;JsonTypeInfo.As.PROPERTY);&nbsp;\/\/&nbsp;\u4e0a\u9762\u6ce8\u91ca\u8fc7\u65f6\u4ee3\u7801\u7684\u66ff\u4ee3\u65b9\u6cd5\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jacksonSerial.setObjectMapper(om);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;\u5b9a\u5236\u7f13\u5b58\u6570\u636e\u5e8f\u5217\u5316\u65b9\u5f0f\u53ca\u65f6\u6548\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RedisCacheConfiguration&nbsp;config&nbsp;=&nbsp;RedisCacheConfiguration.defaultCacheConfig()\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.entryTtl(Duration.ofDays(1))&nbsp;\/\/&nbsp;\u8bbe\u7f6e\u7f13\u5b58\u6570\u636e\u7684\u65f6\u6548\uff08\u8bbe\u7f6e\u4e3a\u4e861\u5929\uff09\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.serializeKeysWith(RedisSerializationContext.SerializationPair\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;.fromSerializer(strSerializer))&nbsp;\/\/&nbsp;\u5bf9\u5f53\u524d\u5bf9\u8c61\u7684key\u4f7f\u7528strSerializer\u8fd9\u4e2a\u5e8f\u5217\u5316\u5bf9\u8c61\uff0c\u8fdb\u884c\u8f6c\u6362\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.serializeValuesWith(RedisSerializationContext.SerializationPair\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;.fromSerializer(jacksonSerial))&nbsp;\/\/&nbsp;\u5bf9value\u4f7f\u7528jacksonSerial\u8fd9\u4e2a\u5e8f\u5217\u5316\u5bf9\u8c61\uff0c\u8fdb\u884c\u8f6c\u6362\n&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;RedisCacheManager&nbsp;cacheManager&nbsp;=&nbsp;RedisCacheManager\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.builder(redisConnectionFactory).cacheDefaults(config).build();\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;cacheManager;\n&nbsp;&nbsp;&nbsp;&nbsp;}<\/pre>\n<p>\u4e0a\u8ff0\u4ee3\u7801\u4e2d\uff0c\u5728RedisConfig\u914d\u7f6e\u7c7b\u4e2d\u4f7f\u7528@Bean\u6ce8\u89e3\u6ce8\u5165\u4e86\u4e00\u4e2a\u9ed8\u8ba4\u540d\u79f0\u4e3a\u65b9\u6cd5\u540d\u7684cacheManager\u7ec4\u4ef6\u3002\u5728\u5b9a\u4e49\u7684Bean\u7ec4\u4ef6\u4e2d\uff0c\u901a\u8fc7RedisCacheConfiguration\u5bf9\u7f13\u5b58\u6570\u636e\u7684key\u548cvalue\u5206\u522b\u8fdb\u884c\u4e86\u5e8f\u5217\u5316\u65b9\u5f0f\u7684\u5b9a\u5236\uff0c\u5176\u4e2d\u7f13\u5b58\u6570\u636e\u7684key\u5b9a\u5236\u4e3aStringRedisSerializer\uff08\u5373String\u683c\u5f0f\uff09\uff0c\u800cvalue\u5b9a\u5236\u4e3a\u4e86Jackson2JsonRedisSerializer\uff08\u5373JSON\u683c\u5f0f\uff09\uff0c\u540c\u65f6\u8fd8\u4f7f\u7528entryTtl(Duration.ofDays(1))\u65b9\u6cd5\u5c06\u7f13\u5b58\u6570\u636e\u6709\u6548\u671f\u8bbe\u7f6e\u4e3a1\u5929<\/p>\n<p>\u5b8c\u6210\u57fa\u4e8e\u6ce8\u89e3\u7684Redis\u7f13\u5b58\u7ba1\u7406\u5668RedisCacheManager\u5b9a\u5236\u540e\uff0c\u53ef\u4ee5\u5bf9\u8be5\u7f13\u5b58\u7ba1\u7406\u5668\u7684\u6548\u679c\u8fdb\u884c\u6d4b\u8bd5\uff08\u4f7f\u7528\u81ea\u5b9a\u4e49\u5e8f\u5217\u5316\u673a\u5236\u7684RedisCacheManager\u6d4b\u8bd5\u65f6\uff0c\u5b9e\u4f53\u7c7b\u53ef\u4ee5\u4e0d\u7528\u5b9e\u73b0\u5e8f\u5217\u5316\u63a5\u53e3\uff09<\/p>\n","protected":false},"excerpt":{"rendered":"<p>SpringBoot\u600e\u4e48\u81ea\u5b9a\u4e49R&#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-202315","post","type-post","status-publish","format-standard","hentry","category-database"],"_links":{"self":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/posts\/202315","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=202315"}],"version-history":[{"count":0,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/posts\/202315\/revisions"}],"wp:attachment":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/media?parent=202315"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/categories?post=202315"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/tags?post=202315"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}