当前位置: 首页 > news >正文

02.Redis实现添加缓存功能

学习目标:

提示:学习如何利用Redis实现添加缓存功能


学习产出:

流程图
在这里插入图片描述

1. 准备pom环境

		<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope><version>5.1.47</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3</version></dependency><!--hutool--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.17</version></dependency>

2. 配置ThreadLocal和过滤器

public class UserHolder {private static final ThreadLocal<UserDTO> tl = new ThreadLocal<>();public static void saveUser(UserDTO user){tl.set(user);}public static UserDTO getUser(){return tl.get();}public static void removeUser(){tl.remove();}
}
@Configuration
public class MvcConfig implements WebMvcConfigurer {@Autowiredprivate StringRedisTemplate redis;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginInterceptor()).excludePathPatterns("/user/code","/user/login","/blog/hot","/shop/**","/shop-type/**","/voucher/**").order(2);registry.addInterceptor(new RefreshTokenInterceptor(redis)).addPathPatterns("/**").order(1);}
}
---------------------------------------------
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {//controller执行之前@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//1.判断是否需要拦截ThreadLocalif (UserHolder.getUser()==null) {response.setStatus(401);return false;}//7.放行return true;}//渲染后返回给前台数据前@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {//移除用户,避免内存泄露UserHolder.removeUser();}
}
---------------------------------------------------
@Slf4j
public class RefreshTokenInterceptor implements HandlerInterceptor {//这个对象不是由spring管理的所以不能用注解自动注入private StringRedisTemplate redis;public RefreshTokenInterceptor(StringRedisTemplate redis) {this.redis = redis;}//controller执行之前@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//1.获取请求头中的tokenString token = request.getHeader("authorization");if (StrUtil.isBlank(token)) {return true;}//2.基于token获取redis中的用户//通过key取到hash中的map集合数据Map<Object, Object> userMap = redis.opsForHash().entries("login:token:" + token);//3.判断用户是否存在if (userMap.isEmpty()) {return true;}//5.将查询到的hash数据转为userDto对象UserDTO userDTO = BeanUtil.fillBeanWithMap(userMap, new UserDTO(), false);//6.存在,保存用户信息到ThreadLocal中UserHolder.saveUser(userDTO);//7.刷新token有效期redis.expire(LOGIN_USER_KEY + token, 30, TimeUnit.MINUTES);log.info("我是第一个拦截器当前拦截所有请求的用户为,线程为{},{}",UserHolder.getUser(),Thread.currentThread());//8.放行return true;}

3. Controller层:负责接收请求和向下分配

@RestController
@RequestMapping("/shop")
public class ShopController {@Resourcepublic IShopService shopService;/*** 根据id查询商铺信息* @param id 商铺id* @return 商铺详情数据*/@GetMapping("/{id}")public Result queryShopById(@PathVariable("id") Long id) {return Result.ok(shopService.queryShopById(id));}
}

4. Service层:负责业务的处理逻辑

@Service
@Slf4j
public class ShopServiceImpl extends ServiceImpl<ShopMapper, Shop> implements IShopService {@Resourceprivate StringRedisTemplate redis;public Result queryShopById(Long id) {//1.从Redis查询数据缓存String shopCache = redis.opsForValue().get("cache:shop:" + id);//2.判断是否存在if (StrUtil.isNotBlank(shopCache)) {//3.存在,直接返回Shop shop = JSONUtil.toBean(shopCache, Shop.class);return Result.ok(shop);}//4.不存在,根据id查询数据库Shop shop = getById(id);if (ObjectUtil.isEmpty(shop)) {//5.不存在,返回错误return Result.fail("当前商户不存在");}//6.存在,写入redisredis.opsForValue().set("cache:shop:"+id,JSONUtil.toJsonStr(shop));//7.返回return Result.ok(shop);}
}
http://www.lryc.cn/news/108037.html

相关文章:

  • 【1.2】Java微服务:SpringCloud概论
  • 右键文件夹 ------- 打开 vscode的方法
  • 小程序原生实现左右锚点联动
  • STM32 低功耗-睡眠模式
  • IDEA用Gradle构建项目时,lombok插件无效的解决办法
  • 基于方向编码的模板匹配算法matlab仿真
  • shell centos 7 一键部署 KVM软件脚本
  • 64 # 实现一个 http-server
  • HCIP作业3
  • 【测试学习三】软件测试的生命周期 BUG的相关知识
  • git rebase 的坑儿
  • SSM(Vue3+ElementPlus+Axios+SSM前后端分离)【四】
  • iPhone 8 Plus透明屏应用范围详解
  • 【前端面试手撕题】instanceof、Array.map、Array.filter、Array.reduce、_objectCreate
  • 8.物联网操作系统之事件标志组
  • [腾讯云Cloud Studio实战训练营]无门槛使用GPT+Cloud Studio辅助编程完成Excel自动工资结算
  • 局域网ssh登录windows自带Linux系统(WSL)踩坑记录
  • 2023-02-03——2023-08-03,半年以来与客服交流的记录【CSND 文章撰写 网站使用求解】客服咨询交流记录(长期更新ing)
  • DCL 操作
  • C++11移动构造函数详解
  • 【力扣】19. 删除链表的倒数第 N 个结点 <链表指针、快慢指针>
  • Vue3和typeScript路由传参
  • SQLserver数据库巡检脚本
  • Go Ethereum源码学习笔记 001 Geth Start
  • idea如何加快创建Maven项目的速度
  • 软件外包开发的GO开发框架
  • oracle会话打满
  • VSCode自定义闪烁光标
  • 复亚智能打造全新云平台:让无人机任务管理更智能、更简单
  • 编程导航第六关——白银挑战