我们要实现的是,当查询时,先从缓存中查找数据,当数据存在时,不查数据库,当数据不存在时,查找数据库,并将值存到redis中
首先,缓存中是没有数据的,redis查询keys * ,会发现redis中无数据
此时,调用查询方法(service层)
/** * 查询所有角色菜单数据权限信息 * @return */ @Override @Cacheable(key = "#p0.roleId") public List会将查询到的结果存到redis缓存中,key值就是参数的roleId, key="#p0.roleId"是指方法的第一个参数的roleId属性为key,list(RoleMenuDataPermissions roleMenuDataPermissions) { return roleMenuDataPermissionsDao.list(roleMenuDataPermissions); }
此时,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