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


我们要实现的是,当查询时,先从缓存中查找数据,当数据存在时,不查数据库,当数据不存在时,查找数据库,并将值存到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


猜你喜欢

转载自blog.csdn.net/sdzhangshulong/article/details/79076372
今日推荐