gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:16:04 25 4
gpt4 key购买 nike

我有一些学生,我想将他们同时保存在数据库和 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(cache)操作的代码。

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

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

关于java - Spring Redis 在使用@Cacheable 或@CachePut 时将 POJO 保存为不同的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68700226/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com