使用redis工具类实现对数据的缓存。
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ldx.redis.constant.CacheConstant; import com.ldx.redis.entity.SysRole; import com.ldx.redis.mapper.SysRoleMapper; import com.ldx.redis.service.SysRoleService; import com.ldx.redis.util.RedisUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.util.Collections; import java.util.List; import java.util.Objects; /** * 角色管理 * @author ludangxin * @date 2021/8/11 */ @Slf4j @Service @RequiredArgsConstructor public class SysRoleServiceImpl implements SysRoleService { private final SysRoleMapper roleMapper; private final RedisUtil redisUtil; String allKey = CacheConstant.getRoleCacheKey("all"); @Override public List<SysRole> queryAll() { List<SysRole> roles = redisUtil.getCacheList(allKey); if(!CollectionUtils.isEmpty(roles)) { return roles; } log.debug("查询全部角色信息~"); LambdaQueryWrapper<SysRole> queryWrapper = new LambdaQueryWrapper<>(); List<SysRole> sysRoles = roleMapper.selectList(queryWrapper); if(CollectionUtils.isEmpty(sysRoles)) { return Collections.emptyList(); } redisUtil.setCacheList(allKey, sysRoles); return sysRoles; } @Override public SysRole getRoleInfo(Long roleId) { String roleCacheKey = CacheConstant.getRoleCacheKey(String.valueOf(roleId)); SysRole role = redisUtil.getCacheObject(roleCacheKey); if(Objects.nonNull(role)) { return role; } log.debug("查询角色:{} 详情", roleId); SysRole sysRole = roleMapper.selectById(roleId); if(Objects.isNull(sysRole)) { return null; } redisUtil.setCacheObject(roleCacheKey, sysRole); return sysRole; } @Override public void add(SysRole role) { log.debug("新增角色:{}", role.getName()); roleMapper.insert(role); redisUtil.deleteObject(allKey); } @Override public void update(Long roleId, SysRole role) { log.debug("更新角色:{}", role.getName()); String roleCacheKey = CacheConstant.getRoleCacheKey(String.valueOf(roleId)); role.setId(roleId); roleMapper.updateById(role); // 更新缓存 redisUtil.setCacheObject(roleCacheKey,role); // 清除缓存 redisUtil.deleteObject(allKey); } @Override public void delete(Long roleId) { log.debug("删除角色:{}", roleId); roleMapper.deleteById(roleId); // 清除缓存 redisUtil.deleteObject(CacheConstant.getRoleCacheKey(String.valueOf(roleId))); redisUtil.deleteObject(allKey); } } 2.7 启动测试这里只测试了user模块(都测试并且贴图会显得篇幅太长且繁琐),role模块本人测试后结果正确。
查询列表:
调用接口返回全部数据并缓存完成,再次调用无查询日志输出,符合预期。
接口调用:
查看缓存:
查看用户详情:
接口调用返回用户详情信息并缓存完成,再次调用无查询日志输出,符合预期。
接口调用:
查看缓存:
更新数据:
接口调用返回更新成功,并且查看全部的缓存被清除。符合预期。
接口调用:
查看缓存:
3. 内置缓存注解 3.1 @CacheConfig@Cacheable()里面都有一个value=“xxx”的属性,这显然如果方法多了,写起来也是挺累的,如果可以一次性声明完 那就省事了, 所以,有了@CacheConfig这个配置,@CacheConfig is a class-level annotation that allows to share the cache names,如果你在你的方法写别的名字,那么依然以方法的名字为准。
3.2 @Cacheable