前言
再结合mysql
和redis
,换句话说,就是在向数据库插入的时候同时向redis
中插入一份,那么再次取得时候,我们就可以直接冲redis
中去取,这样就大大缓解了mysql
的压力。
正文
但是在实际开发的时候,遇到了一个这样的问题,困扰了我很久:
我再serviceImpl
中加入了
@Service
public class UserServiceImpl extends ServiceImpl<UserDAO,User> implements UserService{
@Autowired
private BaseRedisDao<User> baseRedisDao;
@Override
public void saveUserInfo(User user) {
save(user);
baseRedisDao.saveWithCache(String.format(RedisKeyPrefix.USER_KEY,user.getId()),user);
}
@Override
public User getUserInfo(String id) {
User withCache = baseRedisDao.getWithCache(String.format(RedisKeyPrefix.USER_KEY, id));
if ( withCache == null){
User user = getById(id);
if (user == null){
return null;
}
baseRedisDao.saveWithCache(String.format(RedisKeyPrefix.USER_KEY,user.getId()),user);
return user;
}else {
return withCache;
}
}
}
但是,在运行的时候,爆出这样的错误:
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
错误的意思大概就是:mybatis
没有找到该方法,绑定异常,但是我在想,我这个和mysql
也没有关系呀!经过后续的思考我明白了,罪魁祸首原来是:main
方法里面的@MapperScan
注解,下面贴下我的main
方法:
@SpringBootApplication
@MapperScan("com.zzm.demo.dao")
public class RedisDemoApplication {
public static void main(String[] args) {
SpringApplication.run(RedisDemoApplication.class, args);
}
}
从这里看到,我之前将整个的dao
文件夹都放进了MapperScan
里面,但是我的redisDao
也在里面,所以这就造成了上面的异常,解决办法:在dao
文件夹中,新建两个文件夹mysql
和redis
,这样区分一下两种dao
的形式,并且修改main
函数的MapperScan
注解,下面贴上我的目录截图:
这样操作就可以解决问题啦~
结语
Yo~Peace&Love
DragonMing
Q.E.D.