ValueOperations<String, Object> valueOperations = template.opsForValue();
return valueOperations.get(key);
}
}
那么缓存是否起到了作用呢,我们添加测试类UserApi,这是一个Controller,提供添加用户和获取用户的方法。
@RestController
@RequestMapping(“user”)
public class UserApi {
@Autowired
private UserService userService;
/**
-
添加用户
-
@param user
*/
@PostMapping(“addUser”)
public String addUser(User user){
int id = userService.addUser(user);
return “添加用户成功,主键id:” + id;
}
/**
-
获取用户信息
-
@param id
-
@return
*/
@GetMapping(“getUser”)
public User getUser(@RequestParam(value = “id”) int id){
return userService.getUser(id);
}
}
接下来是UserService,与之相对应的保存用户和获取用户的方法。IUserDao使用了mybatis,从数据库中获取,这里就不贴具体的代码了,而CacheDao则是上面展示过的,从缓存中读取。在添加用户的时候,我们将用户同时添加到缓存,或取用户的时候,我们将先从缓存中获取,如果缓存中不存在,则去数据库中查找,并同时进行缓存。
@Service
public class UserService {
@Autowired
private IUserDao userDao;
@Autowired
private CacheDao cacheDao;
/**
-
添加用户
-
@param user
*/
public int addUser(User user){
userDao.add(user);
// 添加缓存
cacheDao.set(“user🆔” + user.getId(), user);
return user.getId();
}
/**
-
获取用户信息
-
@param id
-
@return
*/
public User getUser(int id){
// 从缓存中获取
User user = (User)cacheDao.get(“user🆔” + id);
if(user == null){
user = userDao.find(id);
cacheDao.set(“user🆔” + user.getId(), user);
}
return user;
}
}
启动项目,下面我们通过swagger-ui进行测试(本项目已经集成了swagger2),我们添加张三、password的数据。
调用结果显示成功,且id为1。
然后我们去获取这条数据,使用/user/getUser接口,可以成功获取。
然后我们查看后台打印的信息,先是调用了缓存,然后又进行了查询数据库,诶……这好像不对啊,我刚刚添加时不是进行缓存了吗,为什么没有生效?
这是因为我在获取的时候已经超过了缓存生效时间1分钟,这时再次查询,就不会去数据库中查询了。
三、注解方式使用Redis
在Spring Boot项目中,注解满天飞,其实也可以使用注解形式进行缓存,该机制依赖于Spring CaChe,但是这种方式一般较少,因为其缓存机制依赖方法的入参和返回结果,缺乏一定的灵活性。
缓存的注解主要有@CachePut、@Cacheable、@CacheEvict,都作用于方法上。
-
@CachePut,添加缓存,key可以从入参中获取,value为方法返回值,注意并不是注解的value属性,value属性是用于表示缓存的空间,例如@CachePut(value=“user”, key=“‘anno:user?’ + #user.id”),当然这必须要求方法有返回值,否则缓存的数据为空。
-
@Cacheable,既是获取,也是存储,存在缓存则从缓存中获取,不存在则进行缓存,缓存值为方法返回值
-
@CacheEvict表示清除缓存。
在UserService中,我们新增updateUser更新用户,使用了@CacheEvict注解,getUserAnno获取用户,使用了@Cacheable。
/**
-
修改用户信息
-
@param user
*/
// @CachePut,每次都会进行缓存添加,缓存值为方法返回值,该方法无返回值无法使用
// @CachePut(value=“user”, key=“‘anno:user🆔’ + #user.id”)
// 直接删除缓存,下次获取重新查库
@CacheEvict(value=“user”, key=“‘anno:user🆔’ + #user.id”)
public void updateUser(User user){
userDao.update(user);
}
/**
-
获取用户信息,注解缓存
-
@param id
-
@return
*/
// @Cacheable存在缓存则从缓存中获取,不存在则进行缓存,缓存值为方法返回值
@Cacheable(value=“user”, key=“‘anno:user🆔’ + #id”)
public User getUserAnno(int id){
return userDao.find(id);
}
多次调用getUserAnno方法,可以发现,仅第一遍进行了数据库访问,后面都没有调用数据库查询数据。我们接着再调用更新方法,然后在调用getUserAnno又从数据库中查取了。
源码地址:https://github.com/imyanger/springboot-project/tree/master/p10-springboot-redis
最后
找小编(vip1024c)领取
多次调用getUserAnno方法,可以发现,仅第一遍进行了数据库访问,后面都没有调用数据库查询数据。我们接着再调用更新方法,然后在调用getUserAnno又从数据库中查取了。
源码地址:https://github.com/imyanger/springboot-project/tree/master/p10-springboot-redis
最后
[外链图片转存中…(img-oPtxqdM2-1721721241202)]
找小编(vip1024c)领取