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

网站架构变迁太原网站排名推广

网站架构变迁,太原网站排名推广,手机网站自助建设,宿州市建设工程质量监督站网站学习目标&#xff1a; 提示&#xff1a;学习如何利用Redis实现添加缓存功能解决缓存穿透版 学习产出&#xff1a; 缓存穿透讲解图&#xff1a; 解决方案&#xff1a; 采用缓存空对象采用布隆过滤器 解决方案流程图&#xff1a; 1. 准备pom环境 <dependency><gro…

学习目标:

提示:学习如何利用Redis实现添加缓存功能解决缓存穿透版


学习产出:

缓存穿透讲解图
在这里插入图片描述
解决方案:

  1. 采用缓存空对象
  2. 采用布隆过滤器
    解决方案流程图
    在这里插入图片描述

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.判断是否存在 当shopCache为“”时返回falseif (StrUtil.isNotBlank(shopCache)) {//3.存在,直接返回Shop shop = JSONUtil.toBean(shopCache, Shop.class);return Result.ok(shop);}//判断命中的是否是空值if (shopCache!=null) {return Result.fail(" 店铺信息不存在 ");}//4.不存在,根据id查询数据库Shop shop = getById(id);if (ObjectUtil.isEmpty(shop)) {// 解决缓存穿透redis.opsForValue().set("cache:shop:" + id,"",2,TimeUnit.MINUTES);//5.不存在,返回错误return Result.fail("当前商户不存在");}//6.存在,写入redisredis.opsForValue().set("cache:shop:"+id,JSONUtil.toJsonStr(shop));redis.expire("cache:shop:"+id,30,TimeUnit.MINUTES);//7.返回return Result.ok(shop);}
}
http://www.fp688.cn/news/155944.html

相关文章:

  • 延安做网站的公司怎么做网络营销
  • 中国建设银行企业官网站在线优化seo
  • 官方网站建设工程规划不受容积率限制吗?广州seo招聘
  • ps国外教程网站媒体网站
  • 电子商务网站建设最好的公司品牌形象推广
  • 北京网站建设公司降龙山东泰安网络推广
  • 织梦网站做中英文双语言版本网络服务器
  • 怎么做qq刷赞网站企业管理培训课程网课
  • 用vue做网站制作网站的全过程
  • 平台型网站如何推广爱站关键词挖掘
  • 为什么做网站要服务器 和域名今天国际新闻最新消息
  • 最专业的企业营销型网站建设价格长春网站制作系统
  • 十堰响应式网站建设衡阳有实力seo优化
  • 美食网站建设项目规划书优化服务平台
  • 响应式网站建设方案关键词排名优化
  • 手工活接单在家做有正规网站吗媒体营销
  • 大连建设招标网seo技术自学
  • 一个网站添加多个网址网络营销岗位有哪些
  • 高效网站建设公司网络小说网站三巨头
  • 石家庄微网站建设公司哪家好怎么创作自己的网站
  • 使用net域名的大网站互联网营销培训课程
  • 做保洁网站找谁做成都网站制作关键词推广排名
  • 设计网站公司力荐亿企邦哈尔滨关键词排名工具
  • jsp网站建设毕业设计蜘蛛搜索
  • 北京网站制作定制网络营销中的四种方法
  • 网站开发登录链接网站推广优化排名教程
  • 虚拟机建设网站百度开户需要什么条件
  • 可以做全景的网站百度推广seo优化
  • 便宜做网站价格青岛百度推广优化怎么做的
  • 网站开发公司盈利计算机编程培训学校哪家好