基于Spring Boot的天气预报服务

redis 大总结 什么是redis 1.Redis 是用C语言开发的一个开源的高性能键值对( key-value )内存数据库,它是一种NoSQL 数据库。 2.它是【单进程单线程】的内存数据库,所以说不存在线程安全问题。(ps:6.x版本为io多线程,工作线程单线程) 3.它可以支持并发 10W QPS,所以说性能非常优秀。因为底层采用了【IO多路复用(NIO思想)】 4.相比于同类产品memcache,更优秀的读写性能,及丰富的数据类型。 5.五种数据类型来存储【值】:字符串类型(string)、散列类型(ha 阅读详情

有时,为了提升整个网站的性能,我们会将经常需要访问数据缓存起来,这样,在下次查询的时候,能快速的找到这些数据。
缓存的使用与系统的时效性有着非常大的关系。当我们的系统时效性要求不高时,则选择使用缓存是极好的。当系统要求的时效性比较高时,则并不适合用缓存。
本文,我们将演示如何通过集成 Redis 服务器来进行数据的缓存,以提高微服务的并发访问能力。

为啥我们需要缓存

在之前的文章中,我们已经介绍了如何使用 Spring Boot 来快速实现一个天气预报服务应用micro-weather-basic(见 https://www.imooc.com/article/20253)。通过该应用,能实现简单的天气查询。

天气数据接口,本身时效性不是很高,而且又因为是 Web 服务,在调用过程中,本身是存在延时的。所以,采用缓存,一方面可以有效减轻访问天气接口服务带来的延时问题,另一方面,也可以减轻天气接口的负担,提高并发访问量。

特别地,我们是使用的第三方免费的天气 API,这些 API 往往对用户的调用次数及频率有一定的限制。所以为了减轻天气 API 提供方的负荷,我们并不需要实时去调用其第三方接口。

在micro-weather-basic的基础上,我们构建了一个micro-weather-redis项目,作为示例。

开发环境

为了演示本例子,需要采用如下开发环境:

  • JDK 8
  • Gradle 4.0
  • Spring Boot Web Starter 2.0.0.M4
  • Apache HttpClient 4.5.3
  • Spring Boot Data Redis Starter 2.0.0.M4
  • Redis 3.2.100
项目配置

Spring Boot Data Redis 提供了 Spring Boot 对 Redis 的开箱即用的功能。在原有的依赖的基础上,添加 Spring Boot Data Redis Starter 的依赖。

// 依赖关系
dependencies {
    //...

    // 添加 Spring Boot Data Redis Starter 依赖
    compile('org.springframework.boot:spring-boot-starter-data-redis')

    //...
}
下载安装、运行 Redis

在 Linux 平台上安装 Redis 比较简单,可以参考官方文档来即可,详见https://github.com/antirez/redis。

而在 Windows 平台,微软特别为 Redis 制作了安装包,下载地址见 https://github.com/MicrosoftArchive/redis/releases。本书所使用的案例,也是基于该安装包来进行的。双击 redis-server.exe 文件,就能快速启动 Redis 服务器了。

安装后,Redis 默认运行在 <localhost:6379> 地址端口

修改 WeatherDataServiceImpl

修改 WeatherDataServiceImpl,增加了 StringRedisTemplate 用于操作 Redis。

@Service
public class WeatherDataServiceImpl implements WeatherDataService {

    private final static Logger logger = LoggerFactory.getLogger(WeatherDataServiceImpl.class);  

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    private final String WEATHER_API = "http://wthrcdn.etouch.cn/weather_mini";

    private final Long TIME_OUT = 1800L; // 缓存超时时间

    @Override
    public WeatherResponse getDataByCityId(String cityId) {
        String uri = WEATHER_API + "?citykey=" + cityId;
        return this.doGetWeatherData(uri);
    }

    @Override
    public WeatherResponse getDataByCityName(String cityName) {
        String uri = WEATHER_API + "?city=" + cityName;
        return this.doGetWeatherData(uri);
    }

    private WeatherResponse doGetWeatherData(String uri) {
        ValueOperations<String, String> ops = this.stringRedisTemplate.opsForValue();
        String key = uri; // 将调用的 URI 作为缓存的key
        String strBody = null;

        // 先查缓存,没有再查服务
        if (!this.stringRedisTemplate.hasKey(key)) {
            logger.info("未找到 key " + key);

            ResponseEntity<String> response = restTemplate.getForEntity(uri, String.class);

            if (response.getStatusCodeValue() == 200) {
                strBody = response.getBody();
            }

            ops.set(key, strBody, TIME_OUT, TimeUnit.SECONDS);
        } else {
            logger.info("找到 key " + key + ", value=" + ops.get(key));

            strBody = ops.get(key);
        }

        ObjectMapper mapper = new ObjectMapper();
        WeatherResponse weather = null;

        try {
            weather = mapper.readValue(strBody, WeatherResponse.class);
        } catch (IOException e) {
            logger.error("JSON反序列化异常!",e);
        }

        return weather;
    }

}

修改了 doGetWeatherData 方法,增加了 Redis 数据的判断:

  • 当存在某个key(天气接口的URI,是唯一代表某个地区的天气数据)时,我们就从 Redis 里面拿缓存数据;
  • 当不存在某个key(没有初始化数据或者数据过期了),从去天气接口里面去取最新的数据,并初始化到 Redis 中;
  • 由于天气数据更新频率的特点(基本上一个小时或者半个小时更新一次),所以,我们在 Redis 里面设置了30分钟的超时时间。

其中,当然 StringRedisTemplate 跟 RedisTemplate 功能类似,都是封装了对 Redis 的一些常用的操作。区别在于,StringRedisTemplate 更加专注于基于字符串的操作,毕竟,在目前咱们的天气预报应用中,数据的格式主要是 JSON 字符串。

ValueOperations 接口,封装了大部分的简单的 K-V 操作。

同时,我们也使用了日志框架,用来记录运行过程,及日常的信息。

测试、运行

首先,在进行测试前,需要将 Redis 服务器启动起来。

我们可以通过在一个时间段内,多次访问同一个个天气接口来测试效果,比如,接口 http://localhost:8080/weather/cityId/101280601。为了缩短测试的时间,我们可以将 Redis 的超时时间缩短一点,比如10秒。这样,你就不用苦等30分钟才能验证数据是否过期了。

2017-10-18 23:51:41.762  INFO 15220 --- [nio-8080-exec-6] c.w.s.c.w.s.WeatherDataServiceImpl       : 未找到 key http://wthrcdn.etouch.cn/weather_mini?citykey=101280601
2017-10-18 23:51:43.649  INFO 15220 --- [nio-8080-exec-5] c.w.s.c.w.s.WeatherDataServiceImpl       : 找到 key http://wthrcdn.etouch.cn/weather_mini?citykey=101280601, value={"data":{"yesterday":{"date":"17日星期二","high":"高温 29℃","fx":"无持续风向","low":"低温 22℃","fl":"<![CDATA[<3级]]>","type":"多云"},"city":"深圳","aqi":"35","forecast":[{"date":"18日星期三","high":"高温 29℃","fengli":"<![CDATA[<3级]]>","low":"低温 23℃","fengxiang":"无持续风向","type":"多云"},{"date":"19日星期四","high":"高温 29℃","fengli":"<![CDATA[<3级]]>","low":"低温 23℃","fengxiang":"无持续风向","type":"多云"},{"date":"20日星期五","high":"高温 30℃","fengli":"<![CDATA[<3级]]>","low":"低温 22℃","fengxiang":"无持续风向","type":"多云"},{"date":"21日星期六","high":"高温 29℃","fengli":"<![CDATA[<3级]]>","low":"低温 21℃","fengxiang":"无持续风向","type":"多云"},{"date":"22日星期天","high":"高温 28℃","fengli":"<![CDATA[<3级]]>","low":"低温 21℃","fengxiang":"无持续风向","type":"多云"}],"ganmao":"各项气象条件适宜,无明显降温过程,发生感冒机率较低。","wendu":"25"},"status":1000,"desc":"OK"}
2017-10-18 23:51:46.700  INFO 15220 --- [nio-8080-exec-7] c.w.s.c.w.s.WeatherDataServiceImpl       : 找到 key http://wthrcdn.etouch.cn/weather_mini?citykey=101280601, value={"data":{"yesterday":{"date":"17日星期二","high":"高温 29℃","fx":"无持续风向","low":"低温 22℃","fl":"<![CDATA[<3级]]>","type":"多云"},"city":"深圳","aqi":"35","forecast":[{"date":"18日星期三","high":"高温 29℃","fengli":"<![CDATA[<3级]]>","low":"低温 23℃","fengxiang":"无持续风向","type":"多云"},{"date":"19日星期四","high":"高温 29℃","fengli":"<![CDATA[<3级]]>","low":"低温 23℃","fengxiang":"无持续风向","type":"多云"},{"date":"20日星期五","high":"高温 30℃","fengli":"<![CDATA[<3级]]>","low":"低温 22℃","fengxiang":"无持续风向","type":"多云"},{"date":"21日星期六","high":"高温 29℃","fengli":"<![CDATA[<3级]]>","low":"低温 21℃","fengxiang":"无持续风向","type":"多云"},{"date":"22日星期天","high":"高温 28℃","fengli":"<![CDATA[<3级]]>","low":"低温 21℃","fengxiang":"无持续风向","type":"多云"}],"ganmao":"各项气象条件适宜,无明显降温过程,发生感冒机率较低。","wendu":"25"},"status":1000,"desc":"OK"}
2017-10-18 23:51:50.513  INFO 15220 --- [nio-8080-exec-8] c.w.s.c.w.s.WeatherDataServiceImpl       : 找到 key http://wthrcdn.etouch.cn/weather_mini?citykey=101280601, value={"data":{"yesterday":{"date":"17日星期二","high":"高温 29℃","fx":"无持续风向","low":"低温 22℃","fl":"<![CDATA[<3级]]>","type":"多云"},"city":"深圳","aqi":"35","forecast":[{"date":"18日星期三","high":"高温 29℃","fengli":"<![CDATA[<3级]]>","low":"低温 23℃","fengxiang":"无持续风向","type":"多云"},{"date":"19日星期四","high":"高温 29℃","fengli":"<![CDATA[<3级]]>","low":"低温 23℃","fengxiang":"无持续风向","type":"多云"},{"date":"20日星期五","high":"高温 30℃","fengli":"<![CDATA[<3级]]>","low":"低温 22℃","fengxiang":"无持续风向","type":"多云"},{"date":"21日星期六","high":"高温 29℃","fengli":"<![CDATA[<3级]]>","low":"低温 21℃","fengxiang":"无持续风向","type":"多云"},{"date":"22日星期天","high":"高温 28℃","fengli":"<![CDATA[<3级]]>","low":"低温 21℃","fengxiang":"无持续风向","type":"多云"}],"ganmao":"各项气象条件适宜,无明显降温过程,发生感冒机率较低。","wendu":"25"},"status":1000,"desc":"OK"}
2017-10-18 23:51:53.140  INFO 15220 --- [nio-8080-exec-9] c.w.s.c.w.s.WeatherDataServiceImpl       : 未找到 key http://wthrcdn.etouch.cn/weather_mini?citykey=101280601

从上述日志可以看到,第一次(23:51:41)访问接口时,没有找到 Redis 里面的数据,所以,就初始化了数据。
后面几次访问,都是访问 Redis 里面的数据。最后一次(23:51:53),由于超时了,所以 Redis 里面又没有数据了,所以又会拿天气接口的数据。

源码

本章节的源码,见 https://github.com/waylau/spring-cloud-tutorial/ samples目录下的 micro-weather-redis目录下。


作者: 老卫 
链接:https://www.imooc.com/article/23435?block_id=tuijian_wz
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作
1-1、SpringCloud互联网应用项目实战(天气预报系统)项目介绍 Spring cloud 天气项目系统,是一个简单的小型项目(springboot单体应用改造微服务架构),从第三方的接口获取天气,并进行储存,能对外提供天气的查询服务的一个项目。 首先我们对其进行一个单体项目的实现,包括以下的功能: 根据现有的xml文档,从中获取所有的城市名字 从第三方根据城市的名字或者城市id获取具体的天气信息 根据名字获取所有的城市天气,并保存在redis中 设置定时任务,每30分钟去更新一遍所有的城市天气信息 对外提供接口,进行当前天气和天气预报的查询. 就可以对项目进 阅读详情

相关推荐

Spring Boot项目:使用第三方天气API接口实现天气预报功能 weather.zip

Spring Boot项目:使用第三方天气API接口实现天气预报功能;使用redis缓存数据库进行数据缓存 接口示例:http://t.weather.sojson.com/api/weather/city/101010100

Spring Boot 使用 Redis 提升天气预报应用的并发访问能力

有时,为了提升整个网站的性能,我们会将经常需要访问数据缓存起来,这...

weixin_34209406的博客 243

SCU【C】程序设计基础期末安全项目lab2-Deadbeef-writeup(附题目&源码)

项目名称(本质:栈溢出攻击)【源码在文首】和lab1一样,此题又是美国卡耐基梅隆大学的平时作业哈哈哈! 项目要求是把栈溢出,强行更改函数返回值,输出0xdeadbeef。

2301_79586491的博客 1545

【毕业设计】基于Spring Boot框架的天气预报系统的设计与实现

基于Spring Boot的天气预报可视化系统的设计研究背景是在当今信息时代和智能化发展的背景下,人们对实时、准确的天气信息需求日益增长。天气预报系统作为一种重要的信息服务工具,可以帮助用户及时获取天气情况,做出相应的决策和安排。然而,传统的天气预报系统界面简单、功能有限,无法满足用户对数据可视化、个性化定制等需求。因此,本研究旨在基于Spring Boot技术开发一款功能强大、用户友好的天气预报可视化系统,提供丰富的天气数据展示和交互功能,以提高用户体验和满足不同用户群体的需求。

各类程序设计成品、文档、学习资料 2928

3D识别建模 — 基于ReconstructMe和EAGLE EYES SCANNER的实现

3D实体识别建模,作为3D打印反向工程的一个重要环节,今天就让我们利用ReconstructMe和EAGLE EYES SCANNER来了解一下。 第一步、软件和硬件准备就绪 ReconstructMe下载并安装 http://reconstructme.net/?wpdmdl=160 EAGLE EYES SCANNER直接将相应USB插入电脑接口即OK,之后在    中点击搜索“设备管理...

qq_40013290的博客 882

2025最新正版Autodesk 3ds Max 2022安装教程:从下载到中文环境配置全流程解析

Autodesk 3ds Max 2022是一款专业的三维建模、动画和渲染软件,广泛应用于影视制作、游戏开发、建筑可视化等领域。

waicsdn_haha的博客 1万+

基于SpringBoot+Vue的天气预报管理系统(源码+文档+部署+讲解)

随着网络科技的不断发展以及人们经济水平的逐步提高,网络技术如今已成为人们生活中不可缺少的一部分,而信息管理系统是通过计算机技术,针对用户需求开发与设计,该技术尤其在各行业领域发挥了巨大的作用,有效地促进了天气预报管理的发展。然而,由于用户量和需求量的增加,信息过载等问题暴露出来,为改善传统线下管理中的不足,本文将提出一天气预报管理系统,计算机技术作为近十年来新发展起来的科技,可运用于众多领域中,尤其在天气预报管理中,可有效地提升其效率。

qq_33638415的博客 1650

电力电子技术进阶:从基础到实战的完整学习路径

本文系统阐述了电力电子技术从基础到实战的完整学习路径。首先解析了电力电子作为“电能魔术师”的核心作用,随后深入剖析了数学工具、电路电磁场与半导体器件三大基础支柱。文章重点讲解了DC-DC、DC-AC、AC-DC等核心变换拓扑,并探讨了从经典PID到现代模型预测控制(MPC)的控制策略。最后,分享了硬件设计、软件调试、电磁兼容(EMC)等实战经验与前沿趋势,为学习者提供了清晰的进阶指南。

weixin_29204205的博客 447

Springboot获取某个城市当天的天气预报

Springboot获取某个城市当天的天气预报

weixin_49999835的博客 1675

ASPICE(Automotive SPICE)流程落地,研发管理工具自研,如何从量化数据体现研发效率提升的

摘要: ASPICE流程显著提升研发效率,主要体现在质量、成本和时间三个维度。关键量化指标包括:缺陷率降低30%-60%,维护工作量减少28%,研发周期缩短10%-20%,需求变更率降低58%,代码评审效率提升300%。初期开发成本虽增加9%,但长期回报率高。核心方法包括缺陷预防前移、需求精准管理和流程标准化与自动化。建立量化度量体系需覆盖缺陷密度、需求稳定性、进度偏差等指标,并依托工具链支持数据收集。实施ASPICE是短期投入换取长期质量提升和成本优化的高效投资。

汽车软件开发 186

UE5实现物体高亮描边效果(含UE相关源码浅析)

UE5实现物体高亮描边效果

专注GIS开发 7335

天气预报接口_基于Spring Boot的天气预报服务

本文,我们将基于Spring Boot技术来实现一个微服务天气预报服务接口——micro-weather-basic。micro-weather-basic 的作用是实现简单的天气预报功能,可以根据不同的城市,查询该城市的实时天气情况。开发环境Gradle 4.0Spring Boot 1.5.6Apache HttpClient 1.5.3数据来源理论上,天气的数据是天气预报的实现基础。本应用与...

weixin_39999536的博客 458

Claude Code 完全指南:从入门到精通

《AI编程助手ClaudeCode深度指南》摘要 ClaudeCode作为新一代AI编程助手,凭借200K tokens的超长上下文窗口和深度代码理解能力,正在重塑开发工作流程。本文系统介绍了从安装配置到高级应用的完整使用指南: 核心优势包括: 项目级代码理解能力 Agent自主规划复杂任务 原生终端集成支持 多文件协同编辑功能 实战应用场景: 快速理解陌生项目架构 诊断性能瓶颈并提供优化方案 自动生成符合规范的API代码 开发可复用技术组件 高级技巧: 通过CLAUDE.md定义项目规范 合理使用/cle

分享AI、区块链技术及应用,未来已来 605

sql report service 后台服务_SpringCloud微服务架构实战:天气预报微服务的实现

天气预报微服务的实现天气预报微服务包含了数据展示组件。数据展示组件用于将数据模型展示为用户能够理解的UI界面。在micro-weather-report应用的基础上,我们将对其进行逐步的拆分,形成一个新的微服务msa-weather-report-server应用。所需环境为了演示本例子,需要采用如下开发环境。.JDK8。. Gradle 4.0。Spring Boot Web Starter 2...

weixin_39986178的博客 194

海思3559av100平台lan9500模块调试记录

1. 前言 通过USB2.0接口扩展一路百兆虚拟网口 2. 配置lan9500驱动 make ARCH=arm64 menuconfig 开启LAN95XX驱动,编译进内核 保存内核配置 3. 编译内核 make ARCH=arm64 CROSS_COMPILE=aarch64-himix100-linux- uImage -j 20 cd ../../arm-trusted-firmware/arm-trusted-firmware ./mk.sh cp ...

jzwjzw19900922的博客 909

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

天气预报项目

微服务搭建天气预报项目 使用的技术 springboot、mybatis、mysql、quartz、springcloud等技术 首先是框架的搭建 父工程: 父工程只负责引入基本的依赖。 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xml...

GuiFuShenGong123的博客 1149

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

天气预报数据分析管理网站基于Spring Boot SSM原创

该系统的主要功能模块包括用户管理、天气数据管理、系统管理和数据分析展示等。用户可以通过系统查询历史天气数据、实时天气信息,并接收个性化的天气预报推送。系统管理员则负责数据的录入、更新和维护,确保系统的正常运行。在实际应用中,该系统已经取得了显著的成效。气象部门利用该系统改进了天气预报的准确性,为公众提供了更加精准的天气服务。农业部门则根据天气数据分析结果优化了种植计划,提高了农作物产量。此外,该系统还为城市规划、交通管理等领域提供了重要的决策支持。

计算机程序开发设计 1099

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

用RestTemplate调用第三方提供的API接口

首先按照惯例分享一个提供免费接口的网站: 聚合数据 直接点击去自己注册个账号申请个免费的接口测试 今天用RestTemplate调一个天气预报的接口 申请之后记住这个key后面拼装url会用 建议直接写在配置文件里 先看API文档介绍 很清晰看到该接口请求方式支持get或者post 在看请求示例 : 后面带着两个请求参数 这个地方这两个参数顺序前后无所谓 下面直接来代码: 先弄个key的属性类 /** * 类说明: <br> * 〈天气预报接口key〉 * * @Author: wl

TaoShao521的博客 1980

计算机毕设Springboot垂钓服务信息管理系统 基于Spring Boot的钓鱼爱好者服务平台设计与实现 Spring Boot框架下的垂钓信息综合管理系统开发

计算机毕设Springboot垂钓服务信息管理系统g9av0my7(配套有源码 程序 mysql数据库 论文)本套源码可以先看具体功能演示视频领取,文末有联xi 可分享随着休闲生活方式的多样化,垂钓作为一种亲近自然、放松身心的活动,受到了越来越多人的喜爱。然而,垂钓爱好者在寻找合适的钓点、了解天气状况、记录和分享渔获经历等方面往往面临诸多不便。现有的信息获取方式分散且不系统,难以满足钓鱼爱好者一站式的需求。

铁川毕设程序 1094

【2024】基于springboot的天气预报网站平台设计(源码+文档+指导)

设计背景: 随着社会的发展和人们生活水平的提高,天气预报已经成为人们日常生活和工作中不可或缺的一部分。传统的天气预报方式通常是通过电视、广播等媒体进行发布,用户需要手动查找并记住各个地区的天气信息,不够直观和便捷。因此,基于Spring Boot的天气预报管理系统应运而生,旨在解决传统天气预报方式的不足,提供更加准确、便捷的天气信息服务。 设计目的: 基于Spring Boot的天气预报管理系统的设计目的是为了提供一种高效、准确的天气预报服务方式,使用户能够更加方便地获取到各个地区的天气信息。该系统将

java_python_php的博客 1384

springboot基于Java Web天气预报管理系统设计与实现

本文对天气预报管理系统进行了可行性研究与需求分析。从经济、市场、技术、用户使用和法律五个方面验证了系统开发的可行性,结果显示该系统采用开源技术,开发成本低,且能满足用户需求。需求分析明确了系统功能模块,包括管理员和用户两个角色,分别实现天气管理、备忘录等不同功能。系统采用结构化开发方法,模块化设计便于开发与管理。详细设计展示了系统界面及用户注册登录流程。该天气预报管理系统具有操作简便、功能完善等特点,能为用户提供便捷的天气信息服务。

2301_81127431的博客 790

springboot基于Java Web天气预报管理系统出行计划(源码+文档+运行视频+讲解视频)

摘要:本文介绍了一个基于SpringBoot+Vue的天气预报管理系统,集成了MyBatisPlus持久层框架。系统采用前后端分离架构,后端使用SpringBoot提供RESTful API,前端采用Vue.js构建响应式界面,通过MyBatisPlus实现高效数据访问。系统包含用户登录、权限验证、天气预报查询等功能模块,并提供了详细的测试用例和测试结果。文章还展示了核心代码片段,包括登录认证、Token生成及权限拦截器的实现,以及数据库表结构设计。最后提供了源码获取方式,为开发者提供了完整的技术实现参考。

weixin_mrw479640的博客 403
上一篇: python 函数、模块、包及import导入方法
下一篇: Spring Boot使用Redis提升天气预报应用的并发访问能力
程序员椰子橙
博客等级 码龄9年 46粉丝 163原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值