我有一个Spring/Java项目,我正在考虑缓存一些访问数据库和其他rest服务的函数。我不知道该在哪一点缓存某个流。例如,如果我具有以下功能:
public List<String> getSchools()
{
//call db to get names
}
public List<String> getCourses(String school)
{
//rest call to get courses for a school
}
public List<String> getTeachers(String course)
{
//call db to get teacher names for a course
}
/*Uses above three functions together*/
public List<String> getAllTeachers()
{
List<String> schools = getSchools();
List<String> courses = new ArrayList<String>();
List<String> teachers = new ArrayList<String>();
for(String s : schools)
courses.addAll( getCourses( s ) );
for(String c : courses)
teachers.addAll( getTeachers( s ) );
return teachers;
}在这里,我应该缓存哪些方法?我是应该缓存调用其他3个资源密集型函数的函数,还是应该单独缓存这三个函数?一般认为什么是好做法?
发布于 2018-04-17 05:52:42
关于,这个例子,,我永远不会考虑缓存,因为数据不会经常变化。
但是,我要做的是:当我第一次启动程序时,它应该检索它所需的任何内容,并在数据库中添加一些名为(changed)的变量,并将其赋值为0。在服务器端,每当我插入、更新或删除某个内容时,我都会将这个changed值更改为1。下一次当我启动应用程序时,它将检索changed值,如果它是1,那么它将从DB检索‘新’信息,然后返回值0。如果changed值已经为0,它将只使用缓存结果。
注意你的问题很棘手。因为如果你只把老师、学校和课程加载到记忆中,并且想要得到刚从课程中掉下来的学生的名单(这只是一个例子),那么就由你来决定是将学生加载到内存中,还是将其保存在数据库中。
记住一件简单的事情,当数据库中的某些内容发生变化时,将值更改为1,然后当您从程序内部查询时,将该值更改为zero。
最后:为了避免争用条件,您可能需要考虑从select查询中将值更新回零。不要等到完成您的工作,因为您想考虑其他用户使用应用程序。确保changed值在表中而不是在文件中,并将InnoDB作为存储引擎,因为InnoDB按行而不是按表锁定。
https://stackoverflow.com/questions/49868279
复制相似问题