Java
文章平均质量分 80
二俊89757
性格踏实沉稳,并善于倾听他人,沟通表达能力较强,生活中善于解决他人困惑和问题;
有代码洁癖,喜欢代码review,喜欢思考重构自己负责的代码;
遵循阿里开发手册,有良好的代码规范;
对于计算机开发有浓厚的兴趣,有较强的学习和理解能力,自学过PS,AI,Sketch等软件;
乐于接受新鲜事物,并且能够积极应对学习生活中的各项挑战。
展开
-
这可能是Redis比较全的知识整理
Redis和zookeeper做分布式锁的区别,redis为什么适合做分布式锁,它又存在什么问题todoRedis如何实现mq的功能todoRedis实现的消息队列功能和mq有什么区别todoredis单线程为什么执行速度这么快?(1):纯内存操作,避免大量访问数据库,减少直接读取磁盘数据,redis将数据储存在内存里面,读写数据的时候都不会受到硬盘 I/O 速度的限制,所以速度快(2):单线程操作,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗CPU,不用去考原创 2020-10-19 23:24:48 · 241 阅读 · 0 评论 -
这可能是Solr比较全的知识整理
Solr介绍Solr是建立在Apache Lucene ™之上的流行,快速,开放源代码的企业搜索平台。Solr具有高度的可靠性,可伸缩性和容错性,可提供分布式索引,复制和负载平衡查询,自动故障转移和恢复,集中式配置等。Solr为许多世界上最大的互联网站点提供搜索和导航功能。文档Solr官网Solr8.3官方文档Solr W3Cschool官方文档用法SolrJSolrJ是一个API,它使用Java(或任何基于JVM的语言)编写的应用程序可以轻松地与Solr交谈。SolrJ隐藏了许多连接到So原创 2020-10-19 23:23:11 · 4527 阅读 · 0 评论 -
Java面试软技能相关问题
怎么保证服务高可用冗余 + 故障转移MySQL主从架构服务超时机制平时怎么学习制定自己的成长计划,给自己人生定一个方向,达成这个方向我需要做哪些事情每年制定自己的todo list,今年我对自己的要求是(1.了解JVM和一个框架系统的学习和掌握源码,2.要产出博客,定时总结)然后制定学习计划,计划每天按照进度学习渠道:看正确的书,选一些传播度和影响力比较好的书;看视频学习,去了解用法;看github一些用法积累和总结:在平台去发布自己根据看书总结的文章,印象笔记总结最近在学习的一原创 2020-10-19 23:12:51 · 309 阅读 · 1 评论 -
这可能是Java并发比较全的知识整理
如何优雅的创建线程池Excutor会产生OOM异常,FixedThreadPool和SingleThreadExecutor => 允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而引起OOM异常CachedThreadPool => 允许创建的线程数为Integer.MAX_VALUE,可能会创建大量的线程,从而引起OOM异常ScheduledExecutorServicenew ThreadFactoryBuilder()ThreadPoo原创 2020-10-19 23:09:11 · 131 阅读 · 0 评论 -
这可能是Java容器比较全的知识整理
LinkedHashMap底层数据结构?能够实现LRU吗?LinkedHashMap实现与HashMap的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序可以是插入顺序或者是访问顺序。重新了newNode构建自己的节点对象。put方法中LinkedHashMap重写了afterNodeInsertion和afterNodeAccess方法。public class LRUCache<K,V> extends LinkedHashMap<K,原创 2020-10-19 23:07:45 · 124 阅读 · 0 评论 -
这可能是Spring比较全的知识整理-2
Spring的Bean怎么动态加载使用 BeanDefinitionBuilder注册bean(BeanDefinitionBuilder.rootBeanDefinition),添加属性&注册bean,beanFactory.registerBeanDefinition(“testBean”, b1.getBeanDefinition());使用 BeanFactoryPostProcessor注册bean。BeanFactoryPostProcessor允许自定义BeanDefinitio原创 2020-09-19 23:26:37 · 166 阅读 · 0 评论 -
这可能是Java基础比较全的知识整理
动态代理和静态代理静态代理定义一个接口及其实现类;创建一个代理类同样实现这个接口将目标对象注注入进代理类,然后在代理类的对应方法调用目标类中的对应方法。这样的话,我们就可以通过代理类屏蔽对目标对象的访问,并且可以在目标方法执行前后做一些自己想做的事情。动态代理JDK 动态代理在 Java 动态代理机制中 InvocationHandler 接口和 Proxy 类是核心。Proxy类中使用频率最高的方法是:newProxyInstance()` ,这个方法主要用来生成一个代理对.原创 2020-09-19 23:09:41 · 127 阅读 · 0 评论 -
这可能是分布式比较全的知识整理
分布式事务基于MQ的可靠事务消息消息生成者发送消息MQ收到消息,将消息进行持久化,在存储中新增一条记录返回ACK给生产者MQ push 消息给对应的消费者,然后等待消费者返回ACK如果消息消费者在指定时间内成功返回ack,那么MQ认为消息消费成功,在存储中删除消息,即执行第6步;如果MQ在指定时间内没有收到ACK,则认为消息消费失败,会尝试重新push消息,重复执行4、5、6步骤MQ删除消息生产者发送一个半消息broker接收到消息并持久化后响应ACK执行本地事务,本地事务原创 2020-09-19 21:59:37 · 221 阅读 · 0 评论 -
这可能是Dubbo比较全的知识整理
一、Dubbo的provider和consumer都配置timeout在Provider上尽量多配置Consumer端属性,原因如下:作服务的提供者,比服务使用方更清楚服务性能参数,如调用的超时时间,合理的重试次数,等等在Provider配置后,Consumer不配置则会使用Provider的配置值,即Provider配置可以作为Consumer的缺省值。否则,Consumer会使用Consumer端的全局设置,这对于Provider不可控的,并且往往是不合理的配置的覆盖规则:方法原创 2020-09-13 22:33:08 · 280 阅读 · 0 评论 -
这可能是Spring比较全的知识整理
Spring的Bean怎么动态加载使用 BeanDefinitionBuilder注册bean(BeanDefinitionBuilder.rootBeanDefinition),添加属性&注册bean,beanFactory.registerBeanDefinition(“testBean”, b1.getBeanDefinition());使用 BeanFactoryPostProcessor注册bean。BeanFactoryPostProcessor允许自定义BeanDefinitio原创 2020-09-13 22:22:17 · 116 阅读 · 0 评论 -
YApi结合xxl-job自动化测试
一、YApi介绍YApi旨在为开发、产品、测试人员提供更优雅的接口管理服务。可以帮助开发者轻松创建、发布、维护 API,包括提供了一系列可视化接口管理,还有自动化测试1.1 自动化测试的场景及缺点传统的接口自动化测试成本高,大量的项目没有使用自动化测试保证接口的质量,仅仅依靠手动测试,是非常不可靠和容易出错的。YApi 为了解决这个问题,开发了可视化接口自动化测试功能,只需要配置每个接口的入参和对 RESPONSE 断言,即可实现对接口的自动化测试。而且大部分接口支持Swagger导入或者从Idea原创 2020-08-06 22:13:33 · 811 阅读 · 0 评论 -
MyBatis如何解析mapper和Spring中@MapperScan原理
我们在启动项目的时候,spring就会帮我们实例化好bean,那我们使用mybatis-spring的时候,编 写的maper是怎么交给spring容器的呢?这就是今天要探讨的问题。一、MyBatis1.1 MyBatis简介MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Ol.原创 2020-08-03 22:03:03 · 1113 阅读 · 0 评论 -
Redis从入门到深入-高级数据类型(21)
1. Bitmaps1.1 Bitmaps类型的基础操作获取指定key对应偏移量上的bit值getbit key offset设置指定key对应偏移量上的bit值, value 只能是1或 0setbit key offset value1.2 Bitmaps类型的扩展操作业务场景-电影网站统计每天某一部电影是否被点播统计每天有多少部电影被点播统计每周/月/年有多少部电影被点播统计年度哪部电影没有被点播业务分析1.3 Bitmaps类型的扩展操作原创 2020-08-03 22:01:36 · 139 阅读 · 0 评论 -
Redis从入门到深入-布隆过滤器(20)
1. 布隆过滤器前言不知道从什么时候开始,本来默默无闻的布隆过滤器一下子名声大燥,在面试中面试官问到怎么避免缓存穿透,你的第一反应可能就是布隆过滤器,缓存穿透=布隆过滤器成了标配,但具体什么是布隆过滤器,怎么使用布隆过滤器不是很清楚,那今天我们就来把他说清楚,讲明白。。1.1 缓存穿透大家看下这幅图,用户可能进行了一次条件错误的查询,这时候redis是不存在的,按照常规流程就是去数据库找了,可是这是一次错误的条件查询,数据库当然也不会存在,也不会往redis里面写值,返回给用户一个空,这样的操作一次原创 2020-07-29 23:36:47 · 266 阅读 · 0 评论 -
Redis从入门到深入-服务端配置(19)
1. 服务端设定设置服务器以守护线程的方式运行daemonize yes|no绑定主机地址bind 127.0.0.1设置服务端口号port 6379设置数据库数量databases 162. 日志配置设置服务器以指定日志记录级别loglevel debug|verbose|notice|warning日志记录文件名logfile 端口号.log注意:日志级别开发期设置为verbose即可,生产环境中配置为notice,降低写日志io的频度3原创 2020-07-29 23:35:41 · 130 阅读 · 0 评论 -
Redis从入门到深入-删除策略(18)
1. 删除策略1.1 过期数据redis中的数据特征redis是一种内存级数据库, 所有数据均存放在内存中, 内存中的数据可以通过TTL指令获取其状态XX:具有时效性的数据-1:永久有效的数据-2:已经过期的数据或被删除的数据或未定义的数据过期的数据真的删除了吗?1.2 数据删除策略1.定时删除2.惰性删除3.定期删除1.3 时效性数据的存储结构1.4 数据删除策略的目标在内存占用与CPU占用之间寻找一种平衡,顾此失彼都会造成整体redis性能的下降, 甚原创 2020-07-29 23:34:59 · 168 阅读 · 0 评论 -
Redis从入门到深入-锁(17)
1. 锁1.1 基于特定条件的事务执行业务场景天猫双11热卖过程中,对已经售罄的货物追加补货,4个业务员都有权限进行补货。补货的操作可能是一系列的操作,牵扯到多个连续操作,如何保障不会重复操作?业务分析多个客户端有可能同时操作同一组数据,并且该数据一旦被操作修改后,将不适用于继续操作在操作之前锁定要操作的数据,一旦发生变化,终止当前操作解决方案对key添加监视锁, 在执行exec前如果key发生了变化, 终止事务执行watch key1 [key2.....]原创 2020-07-29 23:34:15 · 137 阅读 · 0 评论 -
Redis从入门到深入-Redis-事务(16)
1. 事务简介1.1 什么是事务redis执行指令过程中, 多条连续执行的指令被干扰, 打断, 插队redis事务就是一个命令执行的队列, 将一系列预定义命令包装成一个整体(一个队列) 。当执行时,一次性按照添加顺序依次执行,中间不会被打断或者干扰。一个队列中,一次性、顺序性、排他性的执行一系列命令1.2 事务的基本操作-开启开启事务multi作用设定事务的开启位置,此指令执行后,后续的所有指令均加入到事务中1.3 事务的基本操作-关闭执行事务exec作用设原创 2020-07-29 23:33:40 · 138 阅读 · 0 评论 -
Redis从入门到深入-Redis持久化-RDB&AOF(15)
1. RDB与AOF区别1.1 RDB与AOF的选择之惑对数据非常敏感, 建议使用默认的AOF持久化方案AOF持久化策略使用everysecond,每秒钟fsync一次。该策略redis仍可以保持很好的处理性能,当出现问题时,最多丢失0-1秒内的数据。注意:由于AOF文件存储体积较大, 且恢复速度较慢数据呈现阶段有效性, 建议使用RDB持久化方案数据可以良好的做到阶段内无丢失(该阶段是开发者或运维人员手工维护的,且恢复速度较快,阶段点数据恢复通常采用RDB方案注意:利用RDB实原创 2020-07-29 23:31:15 · 146 阅读 · 0 评论 -
Redis从入门到深入-Redis持久化-AOF(14)
1. RDB的弊端弊端存储数据量较大,效率较低基于快照思想,每次读写都是全部数据,当数据量巨大时,效率非常低大数据量下的IO性能较低基于fork创建子进程, 内存产生额外消耗宕机带来的数据丢失风险解决思路不写全数据,仅记录部分数据改记录数据为记录操作过程对所有操作均进行记录,排除丢失数据的风险2. AOF概念AOF(append only file) 持久化:以独立日志的方式记录每次写命令, 重启时再重新执行AOF文件中命令,达到恢复数据的目的。与RDB相比可原创 2020-07-29 23:30:59 · 138 阅读 · 0 评论 -
Redis从入门到深入-Redis持久化-RDB(13)
1. 持久化简介1.1 什么是持久化利用永久性存储介质将数据进行保存,在特定的时间将保存的数据进行恢复的工作机制称为持久化。1.2 为什么要进行持久化防止数据的意外丢失,确保数据安全性1.3 持久化过程保存什么将当前数据状态进行保存,快照形式,存储数据结果,存储格式简单,关注点在数据将数据的操作过程进行保存,日志形式,存储操作过程,存储格式复杂,关注点在数据的操作过程2. RDB-启动save2.1 谁,什么时间,干什么事情谁:redis操作者(用户)什么时间:即时(随时进行)原创 2020-07-29 23:29:19 · 157 阅读 · 0 评论 -
Redis从入门到深入-Java操作Redis(12)
1. Jedis1.1 Jedis简介Java语言连接redis服务JedisSpringData RedisLettuceC、C++、C#、Erlang…1.2 HelloWord(Jedis版)连接redisJedis jedis = new Jedis(“localhost”, 6379);操作redisjedis.set("name","test");jedis.get("name");关闭redis连接jedis.close();1.3原创 2020-07-29 23:29:00 · 168 阅读 · 0 评论 -
Redis从入门到深入-Key通用操作(11)
1. key通用操作1.1 key特征key是一个字符串, 通过key获取red is中保存的数据1.2 key应该设计哪些操作?对于key自身状态的相关操作, 例如:删除, 判定存在, 获取类型等对于key有效性控制相关操作, 例如:有效期设定, 判定是否有效, 有效状态的切换等对于key快速查询操作, 例如:按指定策略查询key1.3 key基本操作删除指定keydel key获取key是否存在exists key获取key的类型type key原创 2020-07-29 23:26:39 · 154 阅读 · 0 评论 -
Redis从入门到深入-Redis数据类型实践案例(10)
1. 数据类型实践案例1.1 业务场景人工智能领域的语义识别与自动对话将是未来服务业机器人应答呼叫体系中的重要技术,百度自研用户评价语义识别服务,免费开放给企业试用,同时训练百度自己的模型。现对试用用户的使用行为进行限速,限制每个用户每分钟最多发起10次调用1.2 解决方案设计计数器, 记录调用次数, 用于控制业务执行次数。以用户id作为key,使用次数作为value在调用前获取次数,判断是否超过限定次数不超过次数的情况下,每次调用计数+1业务调用失败,计数-1为计数器设置生命周期为指定原创 2020-07-28 09:06:04 · 171 阅读 · 0 评论 -
Redis从入门到深入-sorted_set实现实时订阅推送(09)
1. 问题分析有一个功能叫做领劵的订阅推送。什么是领劵的订阅推送?就是用户订阅了该劵的推送,在可领取前的一分钟就要把提醒信息推送到用户的app中。本来这个订阅功能应该是消息中心那边做的,但他们说这个短时间内做不了。所以让我这个负责优惠劵的做了-.-!。具体方案就是到具体的推送时间点了,coupon系统调用消息中心的推送接口,把信息推送出去。下面我们分析一下这个功能的业务情景。公司目前注册用户6000W+,是哪家就不要打听了。。。比如有一张无门槛的优惠劵下单立减20元,那么抢这张劵的人就会比较多,我们保守原创 2020-07-28 09:04:09 · 263 阅读 · 1 评论 -
Redis从入门到深入-Sorted_set的value(08)
1. sorted_set 类型新的存储需求,数据排序有利于数据的有效展示,需要提供一种可以根据自身特征进行排序的方式需要的存储结构:新的存储模型,可以保存可排序的数据sorted_set类型:在set的存储结构基础上添加可排序字段2. sorted_set 类型数据的基本操作2.1 操作添加数据zadd <key> <score1> <member1> [score2 member2]获取全部数据zrange <key>原创 2020-07-28 09:03:49 · 166 阅读 · 0 评论 -
Redis从入门到深入-Set的value(07)
1.set类型1.1 set类型来源新的存储需求:存储大量的数据,在查询方面提供更高的效率需要的存储结构:能够保存大量的数据,高效的内部存储机制,便于查询set类型:与hash存储结构完全相同,仅存储健,不存储值(nil),并且值是不允许重复的1.2 set类型数据的基本操作添加数据sadd <key> <member1> [member2]...获取全部数据smembers <key>删除数据srem <key>原创 2020-07-28 09:02:35 · 438 阅读 · 0 评论 -
Redis从入门到深入-List的value(06)
1. list类型1.1 List类型数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分需要的存储结构:一个存储空间保存多个数据,且通过数据可以体现进入顺序list类型:保存多个数据,底层使用双向链表存储结构实现1.2 list类型数据基本操作添加/修改数据lpush <key> <value1> [value2]...rpush <key> <value1> [value2]...获取数据lrange <原创 2020-07-28 09:01:57 · 244 阅读 · 0 评论 -
Redis从入门到深入-Hash的value(05)
2. hash类型2.1 存储的困惑对象类数据的存储如果具有较频繁的更新需求操作会显得笨重2.2 hash类型新的存储需求,对一系列的存储的数据进行编组,方便管理,典型应用存储对象信息需要的存储结构:一个存储空间保存多个键值对数据hash存储结构优化如果field数量比较少,存储结构优化为类数组结构如果field数量比较多,存储结构使用HashMap结构2.3 hash类型数据的基本操作添加/修改数据hset <key> <field&g原创 2020-07-28 09:01:36 · 412 阅读 · 0 评论 -
Redis从入门到深入-Redis的字符串具体实现(04)
1. Redis的字符串实现Redis虽然是用C语言写的,但却没有直接用C语言的字符串,而是自己实现了一套字符串。目的就是为了提升速度,提升性能,可以看出Redis为了高性能也是煞费苦心。Redis构建了一个叫做简单动态字符串(Simple Dynamic String),简称SDS1.1 SDS 代码结构Redis的字符串也会遵守C语言的字符串的实现规则,即最后一个字符为空字符。然而这个空字符不会被计算在len里头。struct sdshdr{ // 记录已使用长度 int l原创 2020-07-28 08:59:50 · 122 阅读 · 0 评论 -
Redis从入门到深入-String的value(03)
1. string类型1.1 redis数据存储类型redis本身是一个Map,其中所有的数据都是采用key:value的形式存储数据类型指的是存储的数据的类型,也就是value部分的类型,key部分永远都是字符串1.2 string类型存储的数据:单个数据,最简单的数据存储类型,也是最常用的数据存储类型存储数据的格式:一个存储空间保存一个数据存储内容:通常使用字符串,如果字符串以整数形式展示,可以作为数字操作使用1.3 基本操作添加/修改数据set key value原创 2020-07-28 08:59:26 · 336 阅读 · 0 评论 -
Redis从入门到深入-Redis的安装(02)
1. 基于Linux环境安装Redis1.1 基于Cent OS7安装Redis下载安装包wget http://download.redis.io/release/redis-?.?.?.tar.gz解压tar -xvf 文件名.tar.gz编译make安装make install1.2 Redis服务启动默认配置启动redis-serverredis-server --port 6379redis-server --port 6380指定配置文件启动redis原创 2020-07-28 08:56:06 · 83 阅读 · 0 评论 -
Redis从入门到深入-简介(01)
1. Redis1. 概念Redis(REmote DIctionary Server)是用C语言开发的一个开源的高性能键值对(key-value)数据库简单来说redis就是一个数据库,不过与传统数据库不同的是 redis的数据是存在内存中的,所以读写速度非常快,因此 redis被广泛应用于缓存方向。另外,redis 也经常用来做分布式锁。redis提供了多种数据类型来支持不同的业务场景。除此之外,redis支持事务、持久化、LUA脚本、LRU驱动事件、多种集群方案。2. 特征数据间没有必然原创 2020-07-28 08:55:10 · 99 阅读 · 0 评论 -
Java相关的Spring知识整理
一、Spring体系结构:Spring 有可能成为所有企业应用程序的一站式服务点,然而,Spring 是模块化的,允许你挑选和选择适用于你的模块,不必要把剩余部分也引入。下面的部分对在 Spring 框架中所有可用的模块给出了详细的介绍。Spring 框架提供约 20 个模块,可以根据应用程序的要求来使用。核心容器核心容器由spring-core,spring-beans,spring-context,spring-context-support和spring-expression(SpEL,Sp原创 2020-07-28 08:51:50 · 201 阅读 · 0 评论 -
SpringBoot入门及原理快速搭建
简介:Spring Boot是由Pivotal团队提供的, Spring家族中的一个全新的框架,它用来简化Spring应用程序的创建和开发过程,也可以说Spring boot能简化我们之前采用SpringMVC+Spring+Mybatis框架进行开发的过程。在以往我们采用SpringMVC+Spring+Mybatis框架进行开发的时候,搭建和整合三大框架,我们需要做很好工作,比如配置web.xml,配置Spring,配置Mybatis,并将它们整合在一起等,而Spring boot框架对原创 2020-07-27 17:44:13 · 296 阅读 · 0 评论 -
设计模式学习-策略模式&观察者模式&装饰者模式
一、设计模式二、什么是设计模式 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。在某些场景下,针对某类问题的某种通用的解决方案。 https://www.cnblogs.com/pony1223/p/7608955.html三、设计模式的六大原则开闭原则(Open Close Principle) 开闭原则就是说对扩展开放,对修改关闭。里氏代换原则(Liskov Substitution Principle) 里氏代换原则(Lis原创 2020-07-27 17:42:15 · 372 阅读 · 0 评论 -
Java中HashMap知识整理
一. HashMap(JDK-1.8)0. 哈希表在讨论哈希表之前,我们先大概了解下其他数据结构在新增,查找等基础操作执行性能**数组:**采用一段连续的存储单元来存储数据。对于指定下标的查找,时间复杂度为O(1);通过给定值进行查找,需要遍历数组,逐一比对给定关键字和数组元素,时间复杂度为O(n),当然,对于有序数组,则可采用二分查找,插值查找,斐波那契查找等方式,可将查找复杂度提高为O(logn);对于一般的插入删除操作,涉及到数组元素的移动,其平均复杂度也为O(n)**线性链表:**对于链表的原创 2020-07-27 17:41:19 · 392 阅读 · 0 评论 -
Java日志处理之Log简析
loglog4j, slf4jlog4j是一个具体的日志实现框架,其他框架还包括log4j 2, logback, java.util.logging(JUL)slf4j(Simple Logging Facade for Java): 各种日志框架的一个抽象a simple facade or abstraction for various logging frameworks因此只单独引入slf4j是无法进行日志说出的,会出现以下信息SLF4J: Failed to load c原创 2020-07-27 17:39:27 · 267 阅读 · 0 评论 -
Java任务调度入门-Quartz&SpringTask对比
quartz引入quartz<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz --><dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.0</version&原创 2020-07-27 17:30:22 · 259 阅读 · 0 评论 -
Java中注解到底是如何工作的
注解@annotation?1.什么是注解?用一个词就可以描述注解,那就是元数据,即一种描述数据的数据。所以,可以说注解就是源代码的元数据。注解仅仅是元数据,和业务逻辑无关,所以当你查看注解类时,发现里面没有任何逻辑处理;<string name="app_name">AnnotationDemo</string>这里的"app_name"就是描述数据"AnnotationDemo"的数据,这是在配置文件中写的,注解是在源码中写的,如下所示:@Overridepub原创 2020-07-27 17:29:27 · 658 阅读 · 0 评论