Strategy Mode
In ifelse inside
Template Method Pattern
getUserById, before each query must first query cache, query cache this part of the code templates, to achieve as long as the class to query the database
//1.模板
@Component
public class ModuleTemplate {
@Autowired
private RedisTemplate redisTemplate;
public <T> T getObjectById(Integer key, BaseService<T> baseService){
T result = (T) redisTemplate.opsForValue().get(key);
if (null == result){
synchronized (this){
//查询缓存
result = (T) redisTemplate.opsForValue().get(key);
if (null == result){
//查询数据库
result = baseService.getObjectById();
redisTemplate.opsForValue().set(key,result);
}
}
}
return result;
}
}
//2.base接口,用作实现类查询数据库
@FunctionalInterface
public interface BaseService<T> {
public T getObjectById();
}
//3.UseService接口和实现类
public interface UserService {
public User getUserByIdTemplate(Integer userId);
}
@Service
public class UserServiceImpl implements UserService {
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private ModuleTemplate moduleTemplate;
@Override
public User getUserByIdTemplate(Integer userId) {
User user = moduleTemplate.getObjectById(userId,() ->{
//查询数据库
return getUserById(userId);
});
return user;
}
}