【问题标题】:Spring Redis save POJO as different types when using @Cacheable or @CachePutSpring Redis 在使用 @Cacheable 或 @CachePut 时将 POJO 保存为不同的类型
【发布时间】:2021-10-12 10:46:00
【问题描述】:

我有一些学生,我想将它们保存在 DB 和 Redis 缓存中以提高性能。

我有学生 POJO:

@NoArgsConstructor
@AllArgsConstructor
@Builder
@Data
@RedisHash("Student")
public class Student implements Serializable, RedisElement {

    private static final long serialVersionUID = 4555735174035964832L;
    public enum Gender {
        MALE, FEMALE
    }
    @Id
    private String id;
    private String name;
    private Gender gender;
    private int grade;

}

用于StudentRepository:

@Repository
public interface StudentRepository extends CrudRepository<Student, String>{

}

我有可以添加、查找和删除学生的服务:

@Service
public class StudentsService {
    @Cacheable(value = "Student", key = "#id")
    public Student findById(String id) {
        // simulates getting it from db
        Student studentFromDB = Student.builder().id(id).name("db user " + id)
                    .gender((new Random()).nextDouble() > 0.5 ? Gender.FEMALE : Gender.MALE)
                    .grade((new Random()).nextInt(100)).build();
            return studentFromDB;// will be cached next time
    }
    
    @CachePut(value = "Student", key = "#id")
    public Student add(Student student) {
        System.out.println("added student " + student);
        return student;
    }
}

使用RedisApplication 运行我的应用程序:

@SpringBootApplication
@EnableAutoConfiguration
@EnableRedisRepositories
public class RedisApplication {
    
    public static void main(String[] args) {
        SpringApplication.run(RedisApplication.class, args);
    }
}

每当我显式调用 studentrepository.save(student) 方法时,它都会调用 Redis HMSET 和 SADD 命令将学生添加到缓存中,但是当我使用 Spring @Cachaeble 执行此操作时,它会使用 Redis Set 命令添加学生。

我如何配置 @Cachaeble 或 @CachePut 以将学生对象视为显式调用将使用 Redis HMSET 和 SADD 命令的方式?

【问题讨论】:

    标签: java spring caching redis spring-cache


    【解决方案1】:

    AFAIK,恐怕缓存机制的实现在库中是紧耦合的。

    与 Redis 的所有实际交互均由包范围内的 DefaultRedisCacheWriter 执行。

    下面的代码是对应put(缓存)操作的。

    如Spring Data Redis documentation 中所述,可能要走的路是提供自己的RedisCacheWriter,我假设基于DefaultRedisCacheWriter 并进行必要的修改,并适当配置Spring 缓存RedisCacheManager:

    RedisCacheWriter cacheWriter = // Provide your custom implementation...
    RedisCacheManager cm = RedisCacheManager.build(cacheWriter)
        .cacheDefaults(defaultCacheConfig())
        ...
    

    【讨论】:

      猜你喜欢
      • 2020-08-31
      • 2015-04-15
      • 2020-09-30
      • 1970-01-01
      • 1970-01-01
      • 2019-10-27
      • 2020-09-08
      • 2019-04-09
      • 2018-12-05
      相关资源
      最近更新 更多