Spring Redis在使用@Cacheable或@CachePut时将POJO保存为不同的类型



我有一些学生,我想把它们保存在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命令一样?

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

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

以下代码是与put(缓存)操作相对应的代码。

正如Spring Data Redis文档中所描述的,可能的方法是提供您自己的RedisCacheWriter,我假设基于DefaultRedisCacheWriter进行必要的修改,并适当配置Spring缓存RedisCacheManager

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

相关内容

  • 没有找到相关文章

最新更新