Răsfoiți Sursa

作者:张哲
时间:2023/07/28
类型:优化
描述:修改缓存管理器

zizg 1 an în urmă
părinte
comite
e7a0621e94

+ 31 - 0
src/main/java/com/redxun/knowledge/config/MyRedisConfig.java

@@ -0,0 +1,31 @@
+package com.redxun.knowledge.config;
+
+import com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer;
+import org.springframework.boot.autoconfigure.cache.CacheProperties;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.cache.RedisCacheConfiguration;
+import org.springframework.data.redis.cache.RedisCacheManager;
+import org.springframework.data.redis.cache.RedisCacheWriter;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.serializer.RedisSerializationContext;
+
+import java.time.Duration;
+
+@EnableConfigurationProperties(CacheProperties.class)
+@EnableCaching
+@Configuration
+public class MyRedisConfig {
+
+    @Bean
+    public RedisCacheManager redisCacheManager(RedisConnectionFactory redisConnectionFactory) {
+        RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory);
+        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
+                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericFastJsonRedisSerializer()))
+                .entryTtl(Duration.ofDays(1))
+                .computePrefixWith(cacheName -> cacheName + ":");
+        return new RedisCacheManager(redisCacheWriter, redisCacheConfiguration);
+    }
+}

+ 0 - 102
src/main/java/com/redxun/knowledge/config/RedisCacheConfig.java

@@ -1,102 +0,0 @@
-package com.redxun.knowledge.config;
-
-import com.fasterxml.jackson.annotation.JsonAutoDetect;
-import com.fasterxml.jackson.annotation.PropertyAccessor;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import org.springframework.cache.CacheManager;
-import org.springframework.cache.annotation.EnableCaching;
-import org.springframework.cache.interceptor.KeyGenerator;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.data.redis.cache.RedisCacheConfiguration;
-import org.springframework.data.redis.cache.RedisCacheManager;
-import org.springframework.data.redis.connection.RedisConnectionFactory;
-import org.springframework.data.redis.core.RedisTemplate;
-import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
-import org.springframework.data.redis.serializer.RedisSerializationContext;
-import org.springframework.data.redis.serializer.RedisSerializer;
-import org.springframework.data.redis.serializer.StringRedisSerializer;
-
-import java.time.Duration;
-
-@Configuration
-@EnableCaching
-public class RedisCacheConfig {
-
-    /**
-     * 自定义key规则
-     *
-     * @return
-     */
-    @Bean
-    public KeyGenerator keyGenerator() {
-        return (target, method, params) -> {
-            StringBuilder sb = new StringBuilder();
-            sb.append(target.getClass().getName());
-            sb.append(method.getName());
-            for (Object obj : params) {
-                sb.append(obj.toString());
-            }
-            return sb.toString();
-        };
-    }
-
-    /**
-     * 设置RedisTemplate规则
-     *
-     * @param redisConnectionFactory
-     * @return
-     */
-    @Bean
-    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
-        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
-        redisTemplate.setConnectionFactory(redisConnectionFactory);
-        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
-
-        //解决查询缓存转换异常的问题
-        ObjectMapper om = new ObjectMapper();
-        // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
-        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
-        // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
-        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
-        jackson2JsonRedisSerializer.setObjectMapper(om);
-        //序列号key value
-        redisTemplate.setKeySerializer(new StringRedisSerializer());
-        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
-        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
-        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
-
-        redisTemplate.afterPropertiesSet();
-        return redisTemplate;
-    }
-
-    /**
-     * 设置CacheManager缓存规则
-     *
-     * @param factory
-     * @return
-     */
-    @Bean
-    public CacheManager cacheManager(RedisConnectionFactory factory) {
-        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
-        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
-
-        //解决查询缓存转换异常的问题
-        ObjectMapper om = new ObjectMapper();
-        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
-        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
-        jackson2JsonRedisSerializer.setObjectMapper(om);
-
-        // 配置序列化(解决乱码的问题),过期时间600秒
-        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
-                .entryTtl(Duration.ofSeconds(86400))
-                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
-                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
-                .disableCachingNullValues();
-
-        RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
-                .cacheDefaults(config)
-                .build();
-        return cacheManager;
-    }
-}

+ 5 - 5
src/main/java/com/redxun/knowledge/service/KnowledgeCategoryServiceImpl.java

@@ -72,7 +72,7 @@ public class KnowledgeCategoryServiceImpl extends SuperServiceImpl<KnowledgeCate
     }
 
     // 根据id查询其下级分类信息(非懒加载)
-    @Cacheable(value = "knowledgeCategory",key = "'categoryId_' + #categoryId")
+    @Cacheable(value = "knowledgeCategory",key = "'categoryId_' + #categoryId",cacheManager = "redisCacheManager")
     public KnowledgeCategoryAdminVo getAllByCategoryId(String categoryId) {
         QueryWrapper<KnowledgeCategory> queryWrapper = new QueryWrapper<>();
         queryWrapper.eq("PK_ID", categoryId);
@@ -164,7 +164,7 @@ public class KnowledgeCategoryServiceImpl extends SuperServiceImpl<KnowledgeCate
      * @return
      */
     @Override
-    @CacheEvict(value = {"knowledgeCategory","knowledgeCategoryPc"}, allEntries=true)
+    @CacheEvict(value = {"knowledgeCategory","knowledgeCategoryPc"}, allEntries=true,cacheManager = "redisCacheManager")
     public int insert(KnowledgeCategory entity) {
         if (BeanUtil.isEmpty(entity.getPkId())) {
             entity.setPkId(IdGenerator.getIdStr());
@@ -193,7 +193,7 @@ public class KnowledgeCategoryServiceImpl extends SuperServiceImpl<KnowledgeCate
      * @return
      */
     @Override
-    @CacheEvict(value = {"knowledgeCategory","knowledgeCategoryPc"}, allEntries=true)
+    @CacheEvict(value = {"knowledgeCategory","knowledgeCategoryPc"}, allEntries=true,cacheManager = "redisCacheManager")
     public int update(KnowledgeCategory entity) {
         KnowledgeCategory knowledgeCategory = this.get(entity.getPkId());
         if (knowledgeCategory.getIsSys() == 1) {
@@ -248,7 +248,7 @@ public class KnowledgeCategoryServiceImpl extends SuperServiceImpl<KnowledgeCate
      * @param knowledgeCategoryId
      */
     @Transactional(rollbackFor = Exception.class)
-    @CacheEvict(value = {"knowledgeCategory","knowledgeCategoryPc"}, allEntries=true)
+    @CacheEvict(value = {"knowledgeCategory","knowledgeCategoryPc"}, allEntries=true,cacheManager = "redisCacheManager")
     public Integer deleteKnowledgeCategory(String knowledgeCategoryId) {
 
         // 查询该分类下是否还有知识
@@ -378,7 +378,7 @@ public class KnowledgeCategoryServiceImpl extends SuperServiceImpl<KnowledgeCate
      * @param
      * @return
      */
-    @Cacheable(value = "knowledgeCategoryPc")
+    @Cacheable(value = "knowledgeCategoryPc",cacheManager = "redisCacheManager")
     public List<KnowledgeCategoryAdminVo> getAllKnowledgeCategory() {
         List<KnowledgeCategoryAdminVo> knowledgeCategoryList = knowledgeCategoryMapper.getAllKnowledgeCategory();
         // 查询顶级记录的所有子集合(顶级记录id为0)

+ 1 - 1
src/main/resources/application.properties

@@ -51,7 +51,7 @@ spring.redis.lettuce.pool.max-idle=8
 # ���ӳ��е���С��������
 spring.redis.lettuce.pool.min-idle=0
 # �������Ϊ�ڴ档�����õ�ֵΪ memory,j2cache
-redxun.cache=memory
+# redxun.cache=memory
 # freemark ���á�
 spring.freemarker.templateLoaderPath=classpath:/templates/
 spring.freemarker.charset=UTF-8

+ 0 - 1
src/main/resources/bootstrap.yml

@@ -22,7 +22,6 @@ spring:
     redis:
       use-key-prefix: true
       key-prefix: knowledge
-      time-to-live: 86400
 
 management:
   endpoints: