问题1
背景:
- 在springboot项目中集成redis缓存,在*service(service 与impl分离)接口的方法中使用redis缓存注解(@Cacheable@CachePut…)
...
@Cacheable(value = "ai:sdk:device", key = "#id")
@Override
FaceDevice get(Long id);
@CachePut(value = "ai:sdk:device", key = "#faceDevice.id")
@Override
FaceDevice updateNotNull(FaceDevice faceDevice);
// @Override
// FaceDevice update(FaceDevice faceDevice);
@CachePut(value = "ai:sdk:device", key = "#faceDevice.id")
@Override
FaceDevice save(FaceDevice faceDevice);
@CacheEvict(value = "ai:sdk:device", key = "#id")//清空所有缓存 allEntries = true
@Override
void delete(Long id);
...
问题描述:
启用程序并没有将缓存数据保存到reids中
解决:
- @Cacheable等放接口里面可以吗?我试了一下,不行。
- 如果某一个Bean并没有实现任何接口,@Cacheable标注的方法有什么要求?
答案是public即可。这种Bean也被Spring产生了代理, 看得到的只有public方法。
3.将接口在*impl实现类里
...
@Override
public FaceDevice get(Long id) {
return super.get(id);
}
@Override
public FaceDevice updateNotNull(FaceDevice faceDevice) {
return super.updateNotNull(faceDevice);
}
...
问题2
问题描述:
- 缓存管理器CacheManager创建失败
public class RedisConfig extends CachingConfigurerSupport {
//...略
@Bean
public CacheManager cacheManager(RedisTemplate redisTemplate) {
return new RedisCacheManager(redisTemplate);
}
//...略
}
解决:
- spirngboot2.x版本删除此构造器:
RedisCacheManager redisCacheManager= new RedisCacheManager(redisTemplate);
public class RedisConfig extends CachingConfigurerSupport {
//...略
@Bean
public CacheManager cacheManager(RedisTemplate<?, ?> redisTemplate) {
RedisCacheWriter writer = RedisCacheWriter.lockingRedisCacheWriter(redisTemplate.getConnectionFactory());
// 本示例中,使用StringRedisSerializer来序列化和反序列化redis的 key值
RedisSerializationContext.SerializationPair keySerializationPair = RedisSerializationContext.SerializationPair.fromSerializer(
new StringRedisSerializer());
// 使用Jackson2JsonRedisSerializer来序列化和反序列化redis的 value值
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);
RedisSerializationContext.SerializationPair valueSerializationPair = RedisSerializationContext.SerializationPair.fromSerializer(
jackson2JsonRedisSerializer);
// 构造一个RedisCache的配置对象,设置缓存过期时间和Key、Value的序列化机制
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().serializeKeysWith(keySerializationPair).serializeValuesWith(valueSerializationPair);
return new RedisCacheManager(writer, config);
}
//...略
}
问题三
注:
- springboot2.x版本中由于引入了不同客户端,需要指定配置哪种连接池
#2.x版本中由于引入了不同客户端,需要指定配置哪种连接池
#jedis客户端
spring:
cache:
type: redis
redis:
host: 127.0.0.1
port: 6379
timeout: 0
database: 0
jedis:
pool:
max-active: 8
max-wait: -1ms
max-idle: 8
min-idle: 0
解释:
spring.redis.host=localhost
spring.redis.password=battcn
# 连接超时时间(毫秒)
spring.redis.timeout=10000
# Redis默认情况下有16个分片,这里配置具体使用的分片,默认是0
spring.redis.database=0
# 连接池最大连接数(使用负值表示没有限制) 默认 8
spring.redis.lettuce.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
spring.redis.lettuce.pool.max-wait=-1
# 连接池中的最大空闲连接 默认 8
spring.redis.lettuce.pool.max-idle=8
# 连接池中的最小空闲连接 默认 0
spring.redis.lettuce.pool.min-idle=0
问题四
知识点
1. redis 命令: ttl
定义:(返回具有缓存时间的密钥的剩余生存时间)
从Redis 2.8开始,如果错误发生更改,则返回值:
-2如果密钥不存在,则返回该命令。
-1如果密钥存在但没有关联的过期,则返回该命令。
参考:https://redis.io/commands/ttl
2. redis命令: expire
定义:设置缓存时长
返回值:
1 如果设置了超时。
0如果key不存在。
参考:https://redis.io/commands/expire
问题五
问题描述
- 将redis服务器添加到win系统的服务中,能启动,但spring项目无法连接;需要手工启动安装目录下的redis服务。