问题:在Springboot中集成redis遇到的问题

问题1

背景:

  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中

解决:

  1. @Cacheable等放接口里面可以吗?我试了一下,不行。
  2. 如果某一个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

问题描述:

  1. 缓存管理器CacheManager创建失败
public class RedisConfig extends CachingConfigurerSupport {
    //...略
    @Bean
    public CacheManager cacheManager(RedisTemplate redisTemplate) {
           return new RedisCacheManager(redisTemplate);
        }
    //...略
}

解决:

  1. 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);
    }
  //...略  
}

问题三

注:

  1. 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

问题五

问题描述

  1. 将redis服务器添加到win系统的服务中,能启动,但spring项目无法连接;需要手工启动安装目录下的redis服务。

待解决

你可能感兴趣的:(spring,redis,springboot)