资料
  • 资料
  • 专题
[完结13章,附电子书]高性能多级网关与多级缓存架构落地实战
推荐星级:
类别: 软件/EDA/IP
时间:2023-12-14
大小:2.41KB
阅读数:263
上传用户:开心就很好了
查看他发布的资源
下载次数
3
所需E币
0
ebi
新用户注册即送 300 E币
更多E币赚取方法,请查看
close
资料介绍
今天给大家讲讲关于多级网关与多级缓存架构的相关知识,在文章里面,我将从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;
}
本文到此结束,感谢大家的阅读!
版权说明:本资料由用户提供并上传,仅用于学习交流;若内容存在侵权,请进行举报,或 联系我们 删除。
PARTNER CONTENT
相关评论 (下载后评价送E币 我要评论)
没有更多评论了
  • 可能感兴趣
  • 关注本资料的网友还下载了
  • 技术白皮书