您的位置:首页 > 编程语言 > Java开发

springboot中关于缓存@Cacheable、@CacheEvict、@CachePut的用法理解浅析

2018-01-16 16:46 881 查看
我们要实现的是,当查询时,先从缓存中查找数据,当数据存在时,不查数据库,当数据不存在时,查找数据库,并将值存到redis中

首先,缓存中是没有数据的,redis查询keys * ,会发现redis中无数据



此时,调用查询方法(service层)

/**
* 查询所有角色菜单数据权限信息
* @return
*/
@Override
@Cacheable(key = "#p0.roleId")
public List<RoleMenuDataPermissions> list(RoleMenuDataPermissions roleMenuDataPermissions) {
return roleMenuDataPermissionsDao.list(roleMenuDataPermissions);
}

会将查询到的结果存到redis缓存中,key值就是参数的roleId,  key="#p0.roleId"是指方法的第一个参数的roleId属性为key,

此时,reids中会有数据如下图:



此时,要新增或者修改或者删除数据,那么,需要将redis中数据删除,当再次调用查询方法时,会发现redis中没有数据,需要从数据库中查找并存到缓存redis中,那么新增或者修改或者删除方法如下这种写法:

/**
* 插入
* @param roleMenuDataPermissions
* @return
*/
@Override
@Transactional
@CacheEvict(key="#p0.roleId")
public int insert(RoleMenuDataPermissions roleMenuDataPermissions) {
return roleMenuDataPermissionsDao.insert(roleMenuDataPermissions);
}

/**
* 根据主键更新
* @param roleMenuDataPermissions
* @return
*/
@Override
@Transactional
@CacheEvict(key="#p0.roleId")
public int updateByPrimaryKey(RoleMenuDataPermissions roleMenuDataPermissions) {
return roleMenuDataPermissionsDao.updateByPrimaryKey(roleMenuDataPermissions);
}


/**
* 根据主键删除(逻辑删)
* @param roleMenuDataPermissions
* @return
*/
@Override
@Transactional
@CacheEvict(key="#p0.roleId")
public int deleteByPrimaryKey(RoleMenuDataPermissions roleMenuDataPermissions) {
return roleMenuDataPermissionsDao.deleteByPrimaryKey(roleMenuDataPermissions);
}


@CacheEvict(key="#p0.roleId") 会根据方法第一个参数的roleId为key,从redis中删除数据,这样,当再次调用查询方法时,redis中根据相同的roleId是查不到数据的,需要从数据库中查找,@Cacheable会自动将查找到的redis中没有的数据存到redis中

以上适用于批量查询,当还有查询某一条数据的需求是,修改方法可以增加一个@CachePut方法

小结:@Cacheable是想缓存中添加数据,@CacheEvict是删除缓存中数据,@CachePut是更新缓存中数据

具体参考:
https://www.cnblogs.com/huzi007/p/6262729.html?utm_source=itdadao&utm_medium=referral
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: