如何使用 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;
}
}
请注意,可能有更优雅的选项,例如在缓存管理器中处理它等。但这应该可以帮助您入门。
这个问题已经被问过多次了。
- Spring Cache with collection of items/entities
- What strategies exist for using Spring Cache on methods that take an array or collection parameter?
答案大体相同
我怀疑任何 1 个链接都会有所帮助,但也许从 #3 开始。
@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;
}
}
请注意,可能有更优雅的选项,例如在缓存管理器中处理它等。但这应该可以帮助您入门。
这个问题已经被问过多次了。
- Spring Cache with collection of items/entities
- What strategies exist for using Spring Cache on methods that take an array or collection parameter?
答案大体相同
我怀疑任何 1 个链接都会有所帮助,但也许从 #3 开始。