本系统集成了redis缓存,使用注解就能对系统缓存进行操作,并且提供了可视化的redis缓存操作与查看

配置缓存

redis序列化时可能会报错:

com.alibaba.fastjson.JSONException: autoType is not support
错误发生的原因是:redis序列化时将class信息写入,反序列化的时候,fastjson默认情况下会开启autoType的检查,相当于一个白名单检查,如果序列化信息中的类路径不在autoType中,这个时候就会抛出上面的异常

解决办法:

1、全局开启AutoType,不建议使用

ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
2、建议小范围指定白名单
ParserConfig.getGlobalInstance().addAccept("me.zhengjie.system.domain");

完整配置如下

  1. /**
  2. * @author jie
  3. * @date 2018-11-24
  4. */
  5. @Slf4j
  6. @Configuration
  7. @EnableCaching
  8. @ConditionalOnClass(RedisOperations.class)
  9. @EnableConfigurationProperties(RedisProperties.class)
  10. public class RedisConfig extends CachingConfigurerSupport {
  11. @Value("${spring.redis.host}")
  12. private String host;
  13. @Value("${spring.redis.port}")
  14. private int port;
  15. @Value("${spring.redis.timeout}")
  16. private int timeout;
  17. @Value("${spring.redis.jedis.pool.max-idle}")
  18. private int maxIdle;
  19. @Value("${spring.redis.jedis.pool.max-wait}")
  20. private long maxWaitMillis;
  21. @Value("${spring.redis.password}")
  22. private String password;
  23. /**
  24. * 配置 redis 连接池
  25. * @return
  26. */
  27. @Bean
  28. public JedisPool redisPoolFactory(){
  29. JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
  30. jedisPoolConfig.setMaxIdle(maxIdle);
  31. jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
  32. if (StrUtil.isNotBlank(password)) {
  33. return new JedisPool(jedisPoolConfig, host, port, timeout, password);
  34. } else {
  35. return new JedisPool(jedisPoolConfig, host, port,timeout);
  36. }
  37. }
  38. /**
  39. * 设置 redis 数据默认过期时间
  40. * 设置@cacheable 序列化方式
  41. * @return
  42. */
  43. @Bean
  44. public RedisCacheConfiguration redisCacheConfiguration(){
  45. FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class);
  46. RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig();
  47. configuration = configuration.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(fastJsonRedisSerializer)).entryTtl(Duration.ofHours(2));
  48. return configuration;
  49. }
  50. @Bean(name = "redisTemplate")
  51. @ConditionalOnMissingBean(name = "redisTemplate")
  52. public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
  53. RedisTemplate<Object, Object> template = new RedisTemplate<>();
  54. //序列化
  55. FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer(Object.class);
  56. // value值的序列化采用fastJsonRedisSerializer
  57. template.setValueSerializer(fastJsonRedisSerializer);
  58. template.setHashValueSerializer(fastJsonRedisSerializer);
  59. // 全局开启AutoType,不建议使用
  60. // ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
  61. // 建议使用这种方式,小范围指定白名单
  62. ParserConfig.getGlobalInstance().addAccept("me.zhengjie.system.service.dto");
  63. ParserConfig.getGlobalInstance().addAccept("me.zhengjie.system.domain");
  64. ParserConfig.getGlobalInstance().addAccept("me.zhengjie.tools.domain");
  65. ParserConfig.getGlobalInstance().addAccept("me.zhengjie.quartz.domain");
  66. // key的序列化采用StringRedisSerializer
  67. template.setKeySerializer(new StringRedisSerializer());
  68. template.setHashKeySerializer(new StringRedisSerializer());
  69. template.setConnectionFactory(redisConnectionFactory);
  70. return template;
  71. }
  72. /**
  73. * 自定义缓存key生成策略
  74. * 使用方法 @Cacheable(keyGenerator="keyGenerator")
  75. * @return
  76. */
  77. @Bean
  78. @Override
  79. public KeyGenerator keyGenerator() {
  80. return (target, method, params) -> {
  81. StringBuilder sb = new StringBuilder();
  82. sb.append(target.getClass().getName());
  83. sb.append(method.getName());
  84. for (Object obj : params) {
  85. sb.append(obj.toString());
  86. }
  87. log.info(sb.toString());
  88. return sb.toString();
  89. };
  90. }
  91. }

具体使用

@CacheConfig 一般用于Service类上@Cacheable 用于Service方法上@CachePut 用于更新缓存@CacheEvict 用于清除缓存

使用自定义缓存key生成策略,@Cacheable(keyGenerator="keyGenerator") 具体使用如下

  1. @CacheConfig(cacheNames = "qiNiu")
  2. public interface QiNiuService {
  3. /**
  4. * 查配置
  5. * @return
  6. */
  7. @Cacheable(key = "'1'")
  8. QiniuConfig find();
  9. /**
  10. * 修改配置
  11. * @param qiniuConfig
  12. * @return
  13. */
  14. @CachePut(key = "'1'")
  15. QiniuConfig update(QiniuConfig qiniuConfig);
  16. /**
  17. * 查询文件
  18. * @param id
  19. * @return
  20. */
  21. @Cacheable(keyGenerator = "keyGenerator")
  22. QiniuContent findByContentId(Long id);
  23. /**
  24. * 删除文件
  25. * @param content
  26. * @param config
  27. * @return
  28. */
  29. @CacheEvict(allEntries = true)
  30. void delete(QiniuContent content, QiniuConfig config);
  31. }

可视化redis操作

系统缓存 - 图1