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

标签 java spring caching redis spring-cache

我有一些学生,我想将他们同时保存在数据库和 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/

相关文章:

java - SAX错误: incompatible types: String cannot be converted to InputSource

java - 线程等待和唤醒

java - 无法找到 XML 模式命名空间的 Spring NamespaceHandler [http ://www. springframework.org/schema/data/jpa]

java - Spring MVC 不支持 POST 方法 - tacoCloud spring 的实际应用

php - 在 Laravel 中缓存每个数据库查询是否健康?

java - 未检测到 JDBC MySQL 新插入

java - 如果失败,从 Makefile 调用的 jar 的返回值应该是什么?

java - Spring 集成 - Jboss 的多个实例监听同一邮件服务器是否会导致重复?

caching - 如何在 Play 2.0 中设置 Assets 的 future 缓存控制过期

mongodb - MongoDB 的 Varnish ,有必要吗?