{"id":201193,"date":"2025-05-10T09:35:27","date_gmt":"2025-05-10T01:35:27","guid":{"rendered":"https:\/\/server.hk\/cnblog\/201193\/"},"modified":"2025-05-10T09:35:27","modified_gmt":"2025-05-10T01:35:27","slug":"redis%e4%b9%8bsql%e7%bc%93%e5%ad%98%e7%9a%84%e5%85%b7%e4%bd%93%e4%bd%bf%e7%94%a8","status":"publish","type":"post","link":"https:\/\/server.hk\/cnblog\/201193\/","title":{"rendered":"Redis\u4e4bsql\u7f13\u5b58\u7684\u5177\u4f53\u4f7f\u7528"},"content":{"rendered":"<p><b><\/b> <\/p>\n<h1>Redis\u4e4bsql\u7f13\u5b58\u7684\u5177\u4f53\u4f7f\u7528<\/h1>\n<p><span style=\"cursor: pointer\"><i><\/i>\u6536\u85cf<\/span> <\/p>\n<p>\u6765\u5230golang\u5b66\u4e60\u7f51\u7684\u5927\u5bb6\uff0c\u76f8\u4fe1\u90fd\u662f\u7f16\u7a0b\u5b66\u4e60\u7231\u597d\u8005\uff0c\u5e0c\u671b\u5728\u8fd9\u91cc\u5b66\u4e60\u6570\u636e\u5e93\u76f8\u5173\u7f16\u7a0b\u77e5\u8bc6\u3002\u4e0b\u9762\u672c\u7bc7\u6587\u7ae0\u5c31\u6765\u5e26\u5927\u5bb6\u804a\u804a\u300aRedis\u4e4bsql\u7f13\u5b58\u7684\u5177\u4f53\u4f7f\u7528\u300b\uff0c\u4ecb\u7ecd\u4e00\u4e0b\u7f13\u5b58\u3001Redissql\uff0c\u5e0c\u671b\u5bf9\u5927\u5bb6\u7684\u77e5\u8bc6\u79ef\u7d2f\u6709\u6240\u5e2e\u52a9\uff0c\u52a9\u529b\u5b9e\u6218\u5f00\u53d1\uff01<\/p>\n<h2>1.\u73af\u5883\u642d\u5efa<\/h2>\n<pre>\n \n   \n \n   \n    \n     org.springframework.boot\n    \n    \n     spring-boot-starter-data-redis\n    \n   <\/pre>\n<pre>\nspring:\n  redis:\n    host: 192.168.8.128\n    port: 6380\n    password: 1234\n    database: 0\n    timeout: 3000\n    jedis:\n      pool:\n        max-wait: -1\n        max-active: -1\n        max-idle: 20\n        min-idle: 10\n<\/pre>\n<p style=\"text-align: center\"><img decoding=\"async\" src=\"https:\/\/www.17golang.com\/uploads\/20221231\/167245830363afb03fa8aaf.jpg\" class=\"aligncenter\"><\/p>\n<h2>2.Redis\u914d\u7f6e<\/h2>\n<pre>\npackage com.yzm.redis01.config;\n\nimport com.fasterxml.jackson.annotation.JsonAutoDetect;\nimport com.fasterxml.jackson.annotation.JsonInclude;\nimport com.fasterxml.jackson.annotation.JsonTypeInfo;\nimport com.fasterxml.jackson.annotation.PropertyAccessor;\nimport com.fasterxml.jackson.core.JsonGenerator;\nimport com.fasterxml.jackson.core.JsonParser;\nimport com.fasterxml.jackson.databind.*;\nimport com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\nimport java.io.IOException;\nimport java.text.SimpleDateFormat;\nimport java.time.LocalDateTime;\nimport java.time.format.DateTimeFormatter;\n\n@Configuration\npublic class ObjectMapperConfig {\n\n    private static final String PATTERN = \"yyyy-MM-dd HH:mm:ss\";\n\n    @Bean(name = \"myObjectMapper\")\n    public ObjectMapper objectMapper() {\n        JavaTimeModule javaTimeModule = new JavaTimeModule();\n        javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer());\n        javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer());\n        return new ObjectMapper()\n                \/\/ \u8f6c\u6362\u4e3a\u683c\u5f0f\u5316\u7684json(\u63a7\u5236\u53f0\u6253\u5370\u65f6\uff0c\u81ea\u52a8\u683c\u5f0f\u5316\u89c4\u8303)\n                \/\/.enable(SerializationFeature.INDENT_OUTPUT)\n                \/\/ Include.ALWAYS  \u662f\u5e8f\u5217\u5316\u5bf9\u50cf\u6240\u6709\u5c5e\u6027(\u9ed8\u8ba4)\n                \/\/ Include.NON_NULL \u53ea\u6709\u4e0d\u4e3anull\u7684\u5b57\u6bb5\u624d\u88ab\u5e8f\u5217\u5316,\u5c5e\u6027\u4e3aNULL \u4e0d\u5e8f\u5217\u5316\n                \/\/ Include.NON_EMPTY \u5982\u679c\u4e3anull\u6216\u8005 \u7a7a\u5b57\u7b26\u4e32\u548c\u7a7a\u96c6\u5408\u90fd\u4e0d\u4f1a\u88ab\u5e8f\u5217\u5316\n                \/\/ Include.NON_DEFAULT \u5c5e\u6027\u4e3a\u9ed8\u8ba4\u503c\u4e0d\u5e8f\u5217\u5316\n                .setSerializationInclusion(JsonInclude.Include.NON_NULL)\n                \/\/ \u5982\u679c\u662f\u7a7a\u5bf9\u8c61\u7684\u65f6\u5019,\u4e0d\u629b\u5f02\u5e38\n                .configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)\n                \/\/ \u53cd\u5e8f\u5217\u5316\u7684\u65f6\u5019\u5982\u679c\u591a\u4e86\u5176\u4ed6\u5c5e\u6027,\u4e0d\u629b\u51fa\u5f02\u5e38\n                .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)\n                \/\/ \u53d6\u6d88\u65f6\u95f4\u7684\u8f6c\u5316\u683c\u5f0f,\u9ed8\u8ba4\u662f\u65f6\u95f4\u6233,\u53ef\u4ee5\u53d6\u6d88,\u540c\u65f6\u9700\u8981\u8bbe\u7f6e\u8981\u8868\u73b0\u7684\u65f6\u95f4\u683c\u5f0f\n                .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)\n                .setDateFormat(new SimpleDateFormat(PATTERN))\n                \/\/ \u5bf9LocalDateTime\u5e8f\u5217\u5316\u8ddf\u53cd\u5e8f\u5217\u5316\n                .registerModule(javaTimeModule)\n\n                .setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY)\n                \/\/ \u6b64\u9879\u5fc5\u987b\u914d\u7f6e\uff0c\u5426\u5219\u4f1a\u62a5java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to XXX\n                .enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY)\n                ;\n    }\n\n    static class LocalDateTimeSerializer extends JsonSerializer\n   \n     {\n        @Override\n        public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {\n            gen.writeString(value.format(DateTimeFormatter.ofPattern(PATTERN)));\n        }\n    }\n\n    static class LocalDateTimeDeserializer extends JsonDeserializer\n    \n      { @Override public LocalDateTime deserialize(JsonParser p, DeserializationContext deserializationContext) throws IOException { return LocalDateTime.parse(p.getValueAsString(), DateTimeFormatter.ofPattern(PATTERN)); } } } \n    \n   <\/pre>\n<pre>\npackage com.yzm.redis01.config;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.cache.interceptor.KeyGenerator;\nimport org.springframework.cache.interceptor.SimpleKey;\n\nimport java.lang.reflect.Method;\nimport java.util.Arrays;\n\/**\n * key\u751f\u6210\u5668\n *\/\n@Slf4j\npublic class MyKeyGenerator implements KeyGenerator {\n\n    private static final String NO_PARAM = \"[]\";\n    private static final String NULL_PARAM = \"_\";\n\n    @Override\n    public Object generate(Object target, Method method, Object... params) {\n        StringBuilder key = new StringBuilder();\n        key.append(target.getClass().getSimpleName()).append(\".\").append(method.getName()).append(\":\");\n\n        if (params.length == 0) {\n            return new SimpleKey(key.append(NO_PARAM).toString());\n        }\n\n        return new SimpleKey(key.append(Arrays.toString(params).replace(\"null\", NULL_PARAM)).toString());\n    }\n}<\/pre>\n<pre>\npackage com.yzm.redis01.config;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport org.springframework.cache.CacheManager;\nimport org.springframework.cache.annotation.EnableCaching;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.data.redis.cache.RedisCacheConfiguration;\nimport org.springframework.data.redis.cache.RedisCacheManager;\nimport org.springframework.data.redis.cache.RedisCacheWriter;\nimport org.springframework.data.redis.connection.RedisConnectionFactory;\nimport org.springframework.data.redis.core.*;\nimport org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;\nimport org.springframework.data.redis.serializer.RedisSerializationContext;\nimport org.springframework.data.redis.serializer.StringRedisSerializer;\n\nimport javax.annotation.Resource;\nimport java.time.Duration;\n\n@Configuration\n@EnableCaching \/\/ \u542f\u52a8\u7f13\u5b58\npublic class RedisConfig {\n\n\t@Bean(name = \"myKeyGenerator\")\n    public MyKeyGenerator myKeyGenerator() {\n        return new MyKeyGenerator();\n    }\n\n    @Resource(name = \"myObjectMapper\")\n    private ObjectMapper objectMapper;\n\n    \/**\n     * \u9009\u62e9redis\u4f5c\u4e3a\u9ed8\u8ba4\u7f13\u5b58\u5de5\u5177\n     *\/\n    @Bean\n    public CacheManager cacheManager(RedisConnectionFactory connectionFactory) {\n        RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory);\n        RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration\n                .defaultCacheConfig()\n                \/\/ \u9ed8\u8ba4\u7f13\u5b58\u65f6\u95f4(\u79d2)\n                .entryTtl(Duration.ofSeconds(300L))\n                \/\/ \u5e8f\u5217\u5316key\u3001value\n                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))\n                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer()))\n                \/\/ \u7981\u7528\u7f13\u5b58\u7a7a\u503c\n                .disableCachingNullValues();\n        return new RedisCacheManager(redisCacheWriter, cacheConfiguration);\n    }\n\n    \/**\n     * redisTemplate\u914d\u7f6e\n     *\/\n    @Bean\n    public RedisTemplate\n   \n     redisTemplate(RedisConnectionFactory factory) {\n        RedisTemplate\n    \n      template = new RedisTemplate(); \/\/ \u914d\u7f6e\u8fde\u63a5\u5de5\u5382 template.setConnectionFactory(factory); Jackson2JsonRedisSerializer\n      jacksonSerializer = jackson2JsonRedisSerializer(); StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); \/\/ \u4f7f\u7528StringRedisSerializer\u6765\u5e8f\u5217\u5316\u548c\u53cd\u5e8f\u5217\u5316redis\u7684key,value\u91c7\u7528json\u5e8f\u5217\u5316 template.setKeySerializer(stringRedisSerializer); template.setValueSerializer(jacksonSerializer); \/\/ \u8bbe\u7f6ehash key \u548cvalue\u5e8f\u5217\u5316\u6a21\u5f0f template.setHashKeySerializer(stringRedisSerializer); template.setHashValueSerializer(jacksonSerializer); \/\/\u652f\u6301\u4e8b\u52a1 template.setEnableTransactionSupport(true); template.afterPropertiesSet(); return template; } private Jackson2JsonRedisSerializer jackson2JsonRedisSerializer() { \/\/\u4f7f\u7528Jackson2JsonRedisSerializer\u6765\u5e8f\u5217\u5316\u548c\u53cd\u5e8f\u5217\u5316redis\u7684value\u503c\uff08\u9ed8\u8ba4\u4f7f\u7528JDK\u7684\u5e8f\u5217\u5316\u65b9\u5f0f\uff09 Jackson2JsonRedisSerializer jacksonSerializer = new Jackson2JsonRedisSerializer(Object.class); jacksonSerializer.setObjectMapper(objectMapper); return jacksonSerializer; } } \n    \n   <\/pre>\n<h2>3.\u529f\u80fd\u5b9e\u73b0<\/h2>\n<blockquote>\n<p>\u65b0\u589e\u3001\u66f4\u65b0\u3001\u5220\u9664\u3001\u67e5\u8be2\u6570\u636e\u65f6\uff0c\u5bf9\u7f13\u5b58\u6267\u884c\u5bf9\u5e94\u76f8\u540c\u7684\u64cd\u4f5c<\/p>\n<\/blockquote>\n<pre>\npackage com.yzm.redis01.entity;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\nimport lombok.experimental.Accessors;\n\nimport java.io.Serializable;\nimport java.time.LocalDateTime;\nimport java.util.Date;\n\n@Data\n@Builder\n@NoArgsConstructor\n@AllArgsConstructor\n@Accessors(chain = true)\npublic class User implements Serializable {\n    private static final long serialVersionUID = -2468903864827432779L;\n    private Integer id;\n    private String username;\n    private String password;\n    private Date createDate;\n    private LocalDateTime updateDate;\n}\n\n<\/pre>\n<pre>\npackage com.yzm.redis01.service;\n\nimport com.yzm.redis01.entity.User;\n\nimport java.util.List;\n\npublic interface UserService {\n\n    User saveUser(User user);\n\n    User updateUser(User user);\n\n    int deleteUser(Integer id);\n\n    void deleteAllCache();\n\n    User getUserById(Integer id);\n\n    List\n   \n     selectAll();\n\t\n\tList\n    \n      findAll(Object... params); } \n    \n   <\/pre>\n<blockquote>\n<p>\u4e3a\u4e86\u7b80\u4fbf\uff0c\u6570\u636e\u4e0d\u4ece\u6570\u636e\u5e93\u83b7\u53d6\uff0c\u8fd9\u91cc\u662f\u521b\u5efaMap\u5b58\u50a8\u6570\u636e\u5b9e\u73b0<\/p>\n<\/blockquote>\n<pre>\npackage com.yzm.redis01.service.impl;\n\nimport com.yzm.redis01.entity.User;\nimport com.yzm.redis01.service.UserService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.cache.annotation.CacheConfig;\nimport org.springframework.cache.annotation.CacheEvict;\nimport org.springframework.cache.annotation.CachePut;\nimport org.springframework.cache.annotation.Cacheable;\nimport org.springframework.stereotype.Service;\n\nimport java.time.LocalDateTime;\nimport java.util.*;\n\n@Slf4j\n@Service\n@CacheConfig(cacheNames = \"users\")\npublic class UserServiceImpl implements UserService {\n\n\n    private static final Map\n   \n     userMap;\n\n    static {\n        userMap = new HashMap();\n        userMap.put(userMap.size() + 1, User.builder()\n                .id(userMap.size() + 1).username(\"root\").password(\"root\").createDate(new Date()).updateDate(LocalDateTime.now()).build());\n        userMap.put(userMap.size() + 1, User.builder()\n                .id(userMap.size() + 1).username(\"admin\").password(\"admin\").createDate(new Date()).updateDate(LocalDateTime.now()).build());\n    }\n\n    @Override\n    @CachePut(key = \"#result.id\", condition = \"#result.id gt 0\")\n    public User saveUser(User user) {\n        log.info(\"\u4fdd\u5b58\u6570\u636e\");\n        int id = userMap.size() + 1;\n        User build = User.builder()\n                .id(id)\n                .username(user.getUsername())\n                .password(user.getPassword())\n                .createDate(new Date())\n                .updateDate(LocalDateTime.now())\n                .build();\n        userMap.put(id, build);\n        return build;\n    }\n\n    @Override\n    @CachePut(key = \"#user.id\", unless = \"#result eq null\")\n    public User updateUser(User user) {\n        log.info(\"\u66f4\u65b0\u6570\u636e\");\n        if (userMap.containsKey(user.getId())) {\n            User update = userMap.get(user.getId());\n            update.setUsername(user.getUsername())\n                    .setPassword(user.getPassword())\n                    .setUpdateDate(LocalDateTime.now());\n            userMap.replace(user.getId(), update);\n            return update;\n        }\n        return null;\n    }\n\n    @Override\n    @CacheEvict(key = \"#id\", condition = \"#result gt 0\")\n    public int deleteUser(Integer id) {\n        log.info(\"\u5220\u9664\u6570\u636e\");\n        if (userMap.containsKey(id)) {\n            userMap.remove(id);\n            return 1;\n        }\n        return 0;\n    }\n\n    @Override\n    @CacheEvict(allEntries = true)\n    public void deleteAllCache() {\n        log.info(\"\u6e05\u7a7a\u7f13\u5b58\");\n    }\n\n    @Override\n    @Cacheable(key = \"#id\", condition = \"#id gt 1\")\n    public User getUserById(Integer id) {\n        log.info(\"\u67e5\u8be2\u7528\u6237\");\n        return userMap.get(id);\n    }\n\n    @Override\n    @Cacheable(key = \"#root.methodName\")\n    public List\n    \n      selectAll() { log.info(\"\u67e5\u8be2\u6240\u6709\"); return new ArrayList(userMap.values()); } @Override @Cacheable(keyGenerator = \"myKeyGenerator\") public List\n     \n       findAll(Object... params) { log.info(\"\u67e5\u8be2\u6240\u6709\"); return new ArrayList(userMap.values()); } } \n     \n    \n   <\/pre>\n<pre>\npackage com.yzm.redis01.controller;\n\nimport com.yzm.redis01.entity.User;\nimport com.yzm.redis01.service.UserService;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport java.util.List;\n\n@RestController\n@RequestMapping(\"\/user\")\npublic class UserController {\n\n    private final UserService userService;\n\n    public UserController(UserService userService) {\n        this.userService = userService;\n    }\n\n    @GetMapping(\"\/saveUser\")\n    public void saveUser() {\n        User user = new User();\n        user.setUsername(\"yzm\");\n        user.setPassword(\"yzm\");\n        System.out.println(userService.saveUser(user));\n    }\n\n    @GetMapping(\"\/updateUser\")\n    public void updateUser(Integer id) {\n        User user = new User();\n        user.setId(id);\n        user.setUsername(\"yzm\");\n        user.setPassword(\"123\");\n        System.out.println(userService.updateUser(user));\n    }\n\n    @GetMapping(\"\/deleteUser\")\n    public void deleteUser(@RequestParam Integer id) {\n        System.out.println(userService.deleteUser(id));\n    }\n\n    @GetMapping(\"\/deleteAllCache\")\n    public void deleteAllCache() {\n        userService.deleteAllCache();\n    }\n\n    @GetMapping(\"\/getUserById\")\n    public void getUserById(@RequestParam Integer id) {\n        System.out.println(userService.getUserById(id));\n    }\n\n    @GetMapping(\"\/selectAll\")\n    public void selectAll() {\n        List\n   \n     users = userService.selectAll();\n        users.forEach(System.out::println);\n    }\n}\n\n   <\/pre>\n<h2>4.\u7f13\u5b58\u6ce8\u89e3\u7684\u4f7f\u7528\u8bf4\u660e<\/h2>\n<p>@CacheConfig\uff1a\u6ce8\u89e3\u5728\u7c7b\u4e0a\uff0c\u8868\u793a\u8be5\u7c7b\u6240\u6709\u7f13\u5b58\u65b9\u6cd5\u4f7f\u7528\u7edf\u4e00\u6307\u5b9a\u7684\u7f13\u5b58\u533a\uff0c\u4e5f\u53ef\u4ee5\u4f5c\u7528\u5728\u65b9\u6cd5\u4e0a<\/p>\n<p style=\"text-align: center\"><img decoding=\"async\" src=\"https:\/\/www.17golang.com\/uploads\/20221231\/167245830463afb0400b6d6.jpg\" class=\"aligncenter\"><\/p>\n<p>@CacheAble\uff1a\u6ce8\u89e3\u5728\u65b9\u6cd5\u4e0a\uff0c\u5e94\u7528\u5230\u8bfb\u6570\u636e\u7684\u65b9\u6cd5\u4e0a\uff0c\u5982\u67e5\u627e\u65b9\u6cd5\uff1a\u8c03\u7528\u65b9\u6cd5\u4e4b\u524d\u6839\u636e\u6761\u4ef6\u5224\u65ad\u662f\u5426\u4ece\u7f13\u5b58\u83b7\u53d6\u76f8\u5e94\u7684\u6570\u636e\uff0c\u7f13\u5b58\u6ca1\u6709\u6570\u636e\uff0c\u65b9\u6cd5\u6267\u884c\u540e\u6dfb\u52a0\u5230\u7f13\u5b58<\/p>\n<p style=\"text-align: center\"><img decoding=\"async\" src=\"https:\/\/www.17golang.com\/uploads\/20221231\/167245830463afb04041563.jpg\" class=\"aligncenter\"><\/p>\n<p style=\"text-align: left\">#id \u76f4\u63a5\u4f7f\u7528\u53c2\u6570\u540d<br \/> #p0 p0\u5bf9\u5e94\u53c2\u6570\u5217\u8868\u7684\u7b2c\u4e00\u4e2a\u53c2\u6570\uff0c\u4ee5\u6b64\u7c7b\u63a8<br \/> #user.id \u53c2\u6570\u662f\u5bf9\u8c61\u65f6\uff0c\u4f7f\u7528\u5bf9\u8c61\u5c5e\u6027<br \/> #root. \u53ef\u4ee5\u70b9\u51fa\u5f88\u591a\u65b9\u6cd5<br \/> #root.methodName<br \/> #result \u8fd4\u56de\u503c<\/p>\n<p>http:\/\/localhost:8080\/user\/getUserById?id=1<\/p>\n<p style=\"text-align: center\"><img decoding=\"async\" src=\"https:\/\/www.17golang.com\/uploads\/20221231\/167245830463afb040bd4ab.jpg\" class=\"aligncenter\"><\/p>\n<p>http:\/\/localhost:8080\/user\/getUserById?id=2<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.17golang.com\/uploads\/20221231\/167245830563afb0410f4a5.jpg\" class=\"aligncenter\"><\/p>\n<p>http:\/\/localhost:8080\/user\/selectAll<\/p>\n<p style=\"text-align: center\"><img decoding=\"async\" src=\"https:\/\/www.17golang.com\/uploads\/20221231\/167245830563afb0416ef7b.jpg\" class=\"aligncenter\"><\/p>\n<p>@Cacheable\u8fd0\u884c\u6d41\u7a0b\uff1a\u5728\u8c03\u7528\u65b9\u6cd5\u4e4b\u524d\u5224\u65adcondition\uff0c\u5982\u679c\u4e3atrue\uff0c\u5219\u67e5\u7f13\u5b58\uff1b\u6ca1\u6709\u7f13\u5b58\u5c31\u8c03\u7528\u65b9\u6cd5\u5e76\u5c06\u6570\u636e\u6dfb\u52a0\u5230\u7f13\u5b58\uff1bcondition=false\u5c31\u4e0e\u7f13\u5b58\u65e0\u5173\u4e86<\/p>\n<p>@CachePut\uff1a\u6ce8\u89e3\u5728\u65b9\u6cd5\u4e0a\uff0c\u5e94\u7528\u5230\u5199\u6570\u636e\u7684\u65b9\u6cd5\u4e0a\uff0c\u5982\u65b0\u589e\/\u4fee\u6539\u65b9\u6cd5\uff0c\u8c03\u7528\u65b9\u6cd5\u4e4b\u540e\u6839\u636e\u6761\u4ef6\u5224\u65ad\u662f\u5426\u6dfb\u52a0\/\u66f4\u65b0\u76f8\u5e94\u7684\u6570\u636e\u5230\u7f13\u5b58\uff1a<\/p>\n<p style=\"text-align: center\"><img decoding=\"async\" src=\"https:\/\/www.17golang.com\/uploads\/20221231\/167245830663afb0420a536.jpg\" class=\"aligncenter\"><\/p>\n<p>http:\/\/localhost:8080\/user\/saveUser<\/p>\n<p style=\"text-align: center\"><img decoding=\"async\" src=\"https:\/\/www.17golang.com\/uploads\/20221231\/167245830663afb04292725.jpg\" class=\"aligncenter\"><\/p>\n<p>condition\u6761\u4ef6\u4e3atrue\uff0c\u6dfb\u52a0\u5230\u7f13\u5b58\uff0c\u6839\u636eid\u67e5\u8be2\u76f4\u63a5\u4ece\u7f13\u5b58\u83b7\u53d6<br \/> http:\/\/localhost:8080\/user\/getUserById?id=3<\/p>\n<p style=\"text-align: center\"><img decoding=\"async\" src=\"https:\/\/www.17golang.com\/uploads\/20221231\/167245830763afb0430888c.jpg\" class=\"aligncenter\"><\/p>\n<p>http:\/\/localhost:8080\/user\/updateUser?id=3<br \/> http:\/\/localhost:8080\/user\/getUserById?id=3<\/p>\n<p style=\"text-align: center\"><img decoding=\"async\" src=\"https:\/\/www.17golang.com\/uploads\/20221231\/167245830763afb043658e7.jpg\" class=\"aligncenter\"><\/p>\n<p>\u6761\u4ef6condition=true\uff0c\u6267\u884c\u7f13\u5b58\u64cd\u4f5c<br \/> \u6761\u4ef6unless=false\uff0c\u6267\u884c\u7f13\u5b58\u64cd\u4f5c\uff1b\u8ddfcondition\u76f8\u53cd<\/p>\n<p>@CacheEvict \u6ce8\u89e3\u5728\u65b9\u6cd5\u4e0a\uff0c\u5e94\u7528\u5230\u5220\u9664\u6570\u636e\u7684\u65b9\u6cd5\u4e0a\uff0c\u5982\u5220\u9664\u65b9\u6cd5\uff0c\u8c03\u7528\u65b9\u6cd5\u4e4b\u540e\u6839\u636e\u6761\u4ef6\u5224\u65ad\u662f\u5426\u4ece\u7f13\u5b58\u4e2d\u79fb\u9664\u76f8\u5e94\u7684\u6570\u636e<\/p>\n<p style=\"text-align: center\"><img decoding=\"async\" src=\"https:\/\/www.17golang.com\/uploads\/20221231\/167245830763afb043a64a1.jpg\" class=\"aligncenter\"><\/p>\n<p>http:\/\/localhost:8080\/user\/saveUser<br \/> http:\/\/localhost:8080\/user\/getUserById?id=3<br \/> http:\/\/localhost:8080\/user\/deleteUser?id=3<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.17golang.com\/uploads\/20221231\/167245830763afb043f394a.jpg\" class=\"aligncenter\"><\/p>\n<blockquote>\n<p>\u81ea\u5b9a\u4e49\u7f13\u5b58key\u81ea\u52a8\u751f\u6210\u5668<\/p>\n<\/blockquote>\n<pre>\n    @Override\n    @Cacheable(keyGenerator = \"myKeyGenerator\")\n    public List\n   \n     findAll(Object... params) {\n        log.info(\"\u67e5\u8be2\u6240\u6709\");\n        return new ArrayList(userMap.values());\n    }\n\n   <\/pre>\n<pre>\n@Slf4j\npublic class MyKeyGenerator implements KeyGenerator {\n\n    private static final String NO_PARAM = \"[]\";\n    private static final String NULL_PARAM = \"_\";\n\n    @Override\n    public Object generate(Object target, Method method, Object... params) {\n        StringBuilder key = new StringBuilder();\n        key.append(target.getClass().getSimpleName()).append(\".\").append(method.getName()).append(\":\");\n\n        if (params.length == 0) {\n            return new SimpleKey(key.append(NO_PARAM).toString());\n        }\n\n        return new SimpleKey(key.append(Arrays.toString(params).replace(\"null\", NULL_PARAM)).toString());\n    }\n}<\/pre>\n<p>http:\/\/localhost:8080\/user\/findAll<\/p>\n<p style=\"text-align: center\"><img decoding=\"async\" src=\"https:\/\/www.17golang.com\/uploads\/20221231\/167245830863afb04473dfb.jpg\" class=\"aligncenter\"><\/p>\n<p>http:\/\/localhost:8080\/user\/findAll?id=123<\/p>\n<p style=\"text-align: center\"><img decoding=\"async\" src=\"https:\/\/www.17golang.com\/uploads\/20221231\/167245830863afb044d8e99.jpg\" class=\"aligncenter\"><\/p>\n<p>http:\/\/localhost:8080\/user\/findAll?username=yzm<\/p>\n<p style=\"text-align: center\"><img decoding=\"async\" src=\"https:\/\/www.17golang.com\/uploads\/20221231\/167245830963afb045b011b.jpg\" class=\"aligncenter\"><\/p>\n<p>@Caching<br \/> \u6709\u65f6\u5019\u6211\u4eec\u53ef\u80fd\u7ec4\u5408\u591a\u4e2aCache\u6ce8\u89e3\u4f7f\u7528\uff1b\u6bd4\u5982\u7528\u6237\u65b0\u589e\u6210\u529f\u540e\uff0c\u6211\u4eec\u8981\u6dfb\u52a0id\u2013&gt;user\uff1busername\u2014&gt;user\uff1bemail\u2014&gt;user\u7684\u7f13\u5b58\uff1b<br \/> \u6b64\u65f6\u5c31\u9700\u8981@Caching\u7ec4\u5408\u591a\u4e2a\u6ce8\u89e3\u6807\u7b7e\u4e86\u3002<\/p>\n<pre>\n@Caching(\n    put = {\n        @CachePut(value = \"users\", key = \"#user.id\"),\n        @CachePut(value = \"users\", key = \"#user.username\"),\n        @CachePut(value = \"users\", key = \"#user.email\")\n    }\n)\npublic User save(User user) {}\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Redis\u4e4bsql\u7f13\u5b58\u7684\u5177\u4f53\u4f7f\u7528&#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-201193","post","type-post","status-publish","format-standard","hentry","category-database"],"_links":{"self":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/posts\/201193","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=201193"}],"version-history":[{"count":0,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/posts\/201193\/revisions"}],"wp:attachment":[{"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/media?parent=201193"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/categories?post=201193"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/server.hk\/cnblog\/wp-json\/wp\/v2\/tags?post=201193"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}