通过纯注解的方式引入redis,这样可以简单的通过 @Cacheable、@CacheEvict、@CachePut 来操作缓存
- 在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>
- 添加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();
}
};
}
}
- 在配置文件中加入如下配置
spring.redis.database=0
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=
- 创建测试类,使用 @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