ssm项目 已纯注解的方式 引入spring cache+ redis

通过纯注解的方式引入redis,这样可以简单的通过 @Cacheable、@CacheEvict、@CachePut 来操作缓存

  1. 在pom.xml 文件中引入相关jar 包
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>
  1. 添加redis 配置文件
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {

    @Value("${spring.redis.timeout:600}")
    private long redisCacheDefaultExpiration;
    @Value("${spring.redis.host}")
    private String host;
    @Value("${spring.redis.port}")
    private int port;
    @Value("${spring.redis.password}")
    private String password;
    @Value("${spring.redis.database}")
    private int database;

    @Bean(name = "redisTemplate")
    public RedisTemplate initRedisTemplate(){
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        //最大空闲数
        poolConfig.setMaxIdle(50);
        //最大连接数
        poolConfig.setMaxTotal(100);
        //最大等待毫秒数
        poolConfig.setMaxWaitMillis(20000);
        //创建 Jedis 连接工厂
        JedisConnectionFactory connectionFactory = new JedisConnectionFactory();
        connectionFactory.setHostName(host);
        connectionFactory.setPort(port);
        connectionFactory.setPassword(password);
        connectionFactory.setDatabase(database);

        //调用后初始化方法,没有它将抛出异常
        connectionFactory.afterPropertiesSet();
        //自定 Redis 序列化器
        RedisSerializer jdkSerializationRedisSerializer = new JdkSerializationRedisSerializer();
        RedisSerializer stringRedisSerializer = new StringRedisSerializer();
        //定义 RedisTemplate 并设置连接工程
        RedisTemplate redisTemplate = new RedisTemplate();
        redisTemplate.setConnectionFactory(connectionFactory);
        //设置序列化器
        redisTemplate.setDefaultSerializer(stringRedisSerializer);
        redisTemplate.setKeySerializer(stringRedisSerializer);
        redisTemplate.setValueSerializer(jdkSerializationRedisSerializer);
        redisTemplate.setHashKeySerializer(stringRedisSerializer);
        redisTemplate.setHashValueSerializer(jdkSerializationRedisSerializer);
        return redisTemplate;
    }

    @Primary
    @Bean(name="redisCacheManager")
    public CacheManager initcCacheManager(@Autowired RedisTemplate redisTemplate){
        RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
        //设置超时时间 ,单位为秒
        cacheManager.setDefaultExpiration(redisCacheDefaultExpiration);
        //设置缓存名称
//        List<String> cacheNames = new ArrayList<String>();
//        cacheNames.add("redisCacheManager");
//        cacheManager.setCacheNames(cacheNames);
        return cacheManager;
    }

    /**
     * 自定义生成redis-key
     *
     * @return
     */
    @Override
    public KeyGenerator keyGenerator() {
        return new KeyGenerator() {
            @Override
            public Object generate(Object o, Method method, Object... objects) {
                StringBuilder sb = new StringBuilder();
                sb.append(o.getClass().getName()).append(".");
                sb.append(method.getName()).append(".");
                for (Object obj : objects) {
                    sb.append(obj.toString());
                }
                System.out.println("keyGenerator=" + sb.toString());
                return sb.toString();
            }
        };
    }

}
  1. 在配置文件中加入如下配置
spring.redis.database=0
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=
  1. 创建测试类,使用 @Cacheable、@CacheEvict、@CachePut 等注解操作缓存。

有可能遇到的问题:

a. 注解不起作用,在redis 里面找不到数据
原因: 应该是没有加载到 RedisConfig 文件,有可能是忘记了在RedisConfig.java 里面 加入 @Configuration
@EnableCaching 注解

b. 报 SerializationException: Cannot deserialize; nested exception is org.springframework.core.serializerxxx 异常
javabean 没有序列号 ,implements Serializable 接口

c. debug 启动的时候 报 xxx cannot be cast to xxx
xxx类不能转换为xxx 类
在main 方法里面 加入如下代码

System.setProperty("spring.devtools.restart.enabled", "false") 

这是因为SpringBoot在开发环境(不是使用java -jar启动)的情况下会启动Spring-boot-devtools,并启用相应的RestartClassLoader来加载class, 而jetcache会使用默认的jdk AppClassLoader,最终导致从缓存中反序列化后得到的对象和项目中的对象class不同,最终产生ClassCastException.
关闭devtools,即可
来源: https://github.com/alibaba/jetcache/issues/55

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值