如何使用 Spring Boot 提供的缓存技术缓存 Java 中的 List<Object>,以便将列表中的元素分别缓存为单个条目?

How to cache a List<Object> in Java such that the elements in list are cached as a single entry each, using Spring Boot provided caching techniques?

@Query(value = "select  student_rid as row_id, student_name as Name from student_data where student_rid=:Student and visibility=true)", nativeQuery = true)
public List<Map<String, String>> findNameAndRowID(@Param("Student") Long Student);

我想缓存列表输出,但是当我尝试缓存输出时,整个列表被缓存为单个缓存条目,因此,我必须逐出整个缓存(列表)条目我甚至 insert/delete 将一条记录放入数据库的时间,这不是我想要的,因为它不用于缓存的目的。那么有没有一种方法可以将列表元素缓存为单个条目,这样我只能 evict/update 在任何 insert/delete 语句中的单个记录。

我正在使用 Spring Boot、Java 8 和 Spring 工具套件作为 IDE。

你的用例似乎有点奇怪,因为你似乎已经只加载了一个学生并且只加载了它的名字,所以我会尝试创建一个更有意义的例子,你可以以此为基础。

但首先声明:我来自 JavaEE 背景,有一段时间没有使用 Spring 并且没有机会实际测试我将描述的快速拼凑的方法在这里,所以请三思而后行。

假设您有以下服务:

class StudentService {
   @Autowired
   StudentRepository repo;     

   List<Student> loadStudents(someCriteria) {
      return repo.loadStudents(someCriteria);
   }
}

要缓存每个学生,您现在可以引入一个新的缓存服务并为每个学生调用它。您可以将方法放入 StudentService,但我不确定 Spring 是否能够注入必要的处理代码(可能通过更高级的 AOP 和字节码操作)。

一个简单的版本可能是这样的:

class StudentCacheService {
  @CachePut( value = "studentCache", key = "#student.id")
  Student cacheStudent(Student student) {
    return student;
  }
}

class StudentService {
   @Autowired
   StudentRepository repo;     

   @Autowired
   StudentCacheService cacheService;     

   List<Student> loadStudents(someCriteria) {
      List<Student> students = repo.loadStudents(someCriteria);

      //cache each student individually
      students.forEach(s -> cacheService.cacheStudent(s));

      return students;
   }
}

请注意,可能有更优雅的选项,例如在缓存管理器中处理它等。但这应该可以帮助您入门。

这个问题已经被问过多次了。

  1. Spring Cache with collection of items/entities
  2. What strategies exist for using Spring Cache on methods that take an array or collection parameter?

答案大体相同

我怀疑任何 1 个链接都会有所帮助,但也许从 #3 开始。