[完结13章,附电子书]高性能多级网关与多级缓存架构落地实战

maudnwiugbn · · 703 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
资料地址1:https://pan.baidu.com/s/1bSdBzBeMXX3MTX29TJlM8Q 提取码:taht 资料地址2:https://share.weiyun.com/SNltUNLW 密码:zi3dc7 今天给大家讲讲关于多级网关与多级缓存架构的相关知识,在文章里面,我将从0到1带着大家构建基础服务接口,通过层层递进优化服务,使得服务具备多级缓存的特性,并融合OpenResty拓展一个强大的多级网关+多级缓存的技术架构。 以下就是代码实战展示: 引入springboot3的maven依赖,本质上作为pom引入,直接管理他的版本号,后续用到啥组件直接拿来即用: <dependencies> <!-- 引入SpringBoot 依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> </dependencies> dependencyManagement 依赖管理 全代码依赖配置如下: <!-- 使用dependencyManagement的目的是为了保证当前父工程的干净, 也就是说父工程他只负责对依赖(坐标)的管理,以及依赖的版本管理,而不会去引入额外的jar依赖 如此一来,父工程的职责就相当的单一了,而且也符合面向对象的理念,是一种父子一来继承的关系 依赖的导入只有在各自的子工程中才会导入。 --> <dependencyManagement> <dependencies> <!-- mysql 驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency> <!-- 持久层 mybatis --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.0</version> </dependency> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.4.1</version> </dependency> <!-- jackson --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.14.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.14.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.14.2</version> </dependency> <!-- apache 工具类 --> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.15</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.12.0</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.11.0</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.13</version> </dependency> <!-- google 工具类 --> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>28.2-jre</version> </dependency> </dependencies> </dependencyManagement> 使用 zadd zset 10 value1 20 value2 30 value3:设置member和对应的分数 zrange zset 0 -1:查看所有zset中的内容 zrange zset 0 -1 withscores:带有分数 zrank zset value:获得对应的下标 zscore zset value:获得对应的分数 zcard zset:统计个数 zcount zset 分数1 分数2:统计个数 zrangebyscore zset 分数1 分数2:查询分数之间的member(包含分数1 分数2) zrangebyscore zset (分数1 (分数2:查询分数之间的member(不包含分数1 和 分数2) zrangebyscore zset 分数1 分数2 limit start end:查询分数之间的member(包含分数1 分数2),获得的结果集再次根据下标区间做查询 zrem zset value:删除member 在common中引入的坐标依赖 <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> </dependency> 迭代查询代码,一级缓存与二级缓存结合: @GetMapping("query") public Object query(String id) { String articleKey = "article:" + id; String articleKeyRedis = "REDIS_ARTICLE:" + id; Article article = cache.get(articleKey, s -> { System.out.println("文章id为"+id+"的没有查询到,则从Redis中查询后返回..."); Article articleReal = null; String articleJsonStr = redis.get(articleKeyRedis); // 判断从redis中查询到的文章数据是否为空 if (StringUtils.isBlank(articleJsonStr)) { System.out.println("Redis中不存在该文章,将从数据库中查询..."); // 如果为空,则进入本条件,则从数据库中查询数据 articleReal = articleService.queryArticleDetail(id); // 手动把文章数据设置到redis中,后续再次查询则有值 String articleJson = JsonUtils.objectToJson(articleReal); redis.set(articleKeyRedis, articleJson); } else { System.out.println("Redis中存在该文章,将直接返回..."); // 如果不为空,则直接转换json类型article再返回即可 articleReal = JsonUtils.jsonToPojo(articleJsonStr, Article.class); } return articleReal; }); return article; } 本文到此结束,感谢大家的阅读!
703 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传