Modo de estrategia
En el interior ifelse
Template Method
getUserById, antes de cada consulta debe caché primera consulta, consulta caché de esta parte de las plantillas de código, para lograr, siempre y cuando la clase para consultar la base de datos
//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;
}
}