技术分享
文章平均质量分 67
赵晗老师
这个作者很懒,什么都没留下…
展开
-
Wireshark 抓包
它支持上百种协议的解密嗅探分析,在互联网上发生的事情,多微小的细节都能通过它分析出来,而且它不仅可以实时抓包,还可以离线分析,它还提供了 GUI 界面工具,你在其它大部分的抓包工具中抓到的数据文件都能拿来这里分析一波,而且,Wireshark是跨平台的,市面上大多数系统都能运行。接下来先来认识下 Wireshark 吧。首先当然是要安装一波,根据你的系统版本进行相应的安装如果你网络有问题的话,没关系,我已经帮你把它们的最新版本都下载下来了,你可以文章最后的二维码领取对应的资料...原创 2021-11-17 16:05:43 · 937 阅读 · 0 评论 -
Kafka的缺点和不适合的场景
Kafka本身有什么明显的短板。如果倒退几年,Kafka 0.7,0.8版本的年代,也许可以说他缺一些功能,比如认证,SSL端端加密,比较好用的管理运维工具等等;这个比起Active MQ 10+年历史上积累的工具差很多。但是Kafka的最新版本已经补上了这些问题,各种功能工具都逐渐完备了。如果非得说Kafka有啥缺点,可能就是运维略复杂。你可能需要安装很多组件,还要调整一些OS系统参数来对Kafka进行调优。一些好处(比如message replay)需要额外的开发。一些一致性上的把控,kafka选择原创 2021-11-15 16:51:47 · 5563 阅读 · 0 评论 -
solr使用场景
项目引入Solr时应该考虑的一些问题:1、数据更新频率:每天数据增量有多大,随时更新还是定时更新2、数据总量:数据要保存多长时间3、一致性要求:期望多长时间内看到更新的数据,最长允许多长时间延迟4、数据特点:数据源包括哪些,平均单条记录大小5、业务特点:有哪些排序要求,检索条件6、资源复用:已有的硬件配置是怎样的,是否有升级计划 需要更多...原创 2021-11-12 16:11:40 · 607 阅读 · 0 评论 -
Solr如何管理索引库
使用SolrJ可以实现索引库的增删改查操作。1 添加文档第一步:把solrJ的jar包添加到工程中。第二步:创建一个SolrServer,使用HttpSolrServer创建对象。第三步:创建一个文档对象SolrInputDocument对象。第四步:向文档中添加域。必须有id域,域的名称必须在schema.xml中定义。第五步:把文档添加到索引库中。第六步:提交。@Testpublic void testSolrJAdd() throws SolrServerExcep原创 2021-11-12 16:09:57 · 400 阅读 · 0 评论 -
Solr的工作原理
1. Solr的简介 Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。 Solr是Apache软件基金会下的子项目之一。2. 工作原理 solr是基于Lucence开发的企业级搜索引擎技术,而lucence的原理是倒排索引。那么什么是倒排索引呢?接下来我们就介绍一下lucence倒排索引原原创 2021-11-12 16:07:21 · 1220 阅读 · 0 评论 -
Java7----Fork&Join框架
Fork/Join是什么?Fork/Join框架是Java7提供的并行执行任务框架,思想是将大任务分解成小任务,然后小任务又可以继续分解,然后每个小任务分别计算出结果再合并起来,最后将汇总的结果作为大任务结果。其思想和MapReduce的思想非常类似。对于任务的分割,要求各个子任务之间相互独立,能够并行独立地执行任务,互相之间不影响。ForkJoinPoolForkJoinPool是ForkJoin框架中的任务调度器,和ThreadPoolExecutor一样实现了自己的线程池,提供了三种调度原创 2021-11-12 16:04:24 · 697 阅读 · 0 评论 -
分布式任务调度平台XXL-JOB一
一、分布式任务调度概述什么是任务调度平台任务调度是指基于给定的时间点,给定的时间间隔又或者给定执行次数自动的执行任务。我们可以思考一下在以下场景中,我们应该怎么实现:支付系统每天凌晨 1 点,进行一天清算,每月 1 号进行上个月清算; 电商整点抢购,商品价格8点整开始优惠 12306 购票系统,超过 30 分钟没有成功支付订单的,进行回收处理为什么需要任务调度平台定时任务是程序员不可避免的话题,很多业务场景需要我们某一特定的时刻去做某件任务。一般来说,系统可以使用消息传递代替部分定时任原创 2021-11-11 16:06:15 · 1519 阅读 · 1 评论 -
分布式任务调度平台 xxl-job
xxl-job是一个分布式定时任务调度框架,功能强大,底层使用自己实现的rpc框架进行注册和管理,数据库使用mysql,调度触发使用数据库锁来作为调度锁。xxl-job主要分为调度中心admin以及任务,任务引入依赖jar包并配置启动类为spring所管理的bean后,将自动通过spring-bean提供的initMethod进行启动线程选择一个端口进行注册以及监听任务调度。公司目前引入xxl-job框架代替quartz框架作为分布式任务调度组件,并在其之上进行一定开发以及优化,所以这篇文章主要分享原创 2021-11-11 15:56:04 · 615 阅读 · 0 评论 -
Mybatis源码解析:sql参数处理(3)
入参#{}的解析那么如果是#{}该怎么处理呢?<select id="get" resultType="com.entity.User"> select * from user where id = #{id} </select>List<User> get(Integer id);由上文得知,由于没有${},那么SqlSource就会变成RawSqlSource。在创建RawSqlSource的时候,在构造方法中就会对#{}解析。Ra原创 2021-11-11 15:50:50 · 1858 阅读 · 0 评论 -
Mybatis源码解析:sql参数处理(2)
入参${}的解析List<User> get(Integer id);<select id="get" resultType="com.entity.User"> select * from user where id = ${id} </select>这个例子,我们没有在全局变量中定义id,而是在方法中传入这个值。根据上文中的VariableTokenHandler.handleToken方法就会返回${id},表示这个参数全局变量中没有,是原创 2021-11-11 15:48:06 · 794 阅读 · 0 评论 -
MyBatis-Plus: 谨慎入坑
一、文档垃圾MyBatis-Plus给我的第一观感是文档垃圾, 官方文档似乎还比较推崇不知道的就去读源码, 这实在是国内一些“源码论”人士的糟粕思想. 因为文档缺乏相关的信息, 或者更新不及时, 或者设计不合理, 以至于用户不得不去通过读源码去完成工作以下是“条件构造器”的文档说明:以下出现的第一个入参boolean condition表示该条件是否加入最后生成的sql中 以下代码块内的多个方法均为从上往下补全个别boolean类型的入参,默认为true 以下出现的泛型Param均为Wrap原创 2021-11-11 15:37:11 · 12363 阅读 · 10 评论 -
手动实现一个简单的 MyBatis
(一)、创建 SqlSessionFactory 实例。(二)、实例化过程,加载配置文件创建 Configuration 对象。(三)、通过 factory 创建 SqlSession。(四)、通过 SqlSession 获取 mapper 接口动态代理。(五)、动态代理回调 SqlSession 中某查询方法。(六)、SqlSession 将查询方法转发给 Executor。(七)、Executor 基于 JDBC 访问数据库获取数据。(八)、Executor 通过反...原创 2021-11-11 15:33:05 · 1225 阅读 · 0 评论 -
canal 入门(2)
写个简单的Demo 去监听mysql 数据的变动Jar包<dependency> <groupId>com.alibaba.otter</groupId> <artifactId>canal.client</artifactId> <version>1.1.3</version></dependency>测试代码package com.hq.eos.sync.client;impo原创 2021-11-10 15:54:02 · 585 阅读 · 0 评论 -
canal 入门(1)
canal 搭建搭建mysql环境对于自建 MySQL , 需要先开启 Binlog 写入功能,配置 binlog-format 为 ROW 模式,my.cnf 中配置如下[mysqld]log-bin=mysql-bin # 开启 binlogbinlog-format=ROW # 选择 ROW 模式server_id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复授权 canal 链接 MySQL 账号具有作为 MySQL s原创 2021-11-10 15:52:33 · 538 阅读 · 0 评论 -
开源数据同步神器——canal
前言如今大型的IT系统中,都会使用分布式的方式,同时会有非常多的中间件,如redis、消息队列、大数据存储等,但是实际核心的数据存储依然是存储在数据库,作为使用最广泛的数据库,如何将mysql的数据与中间件的数据进行同步,既能确保数据的一致性、及时性,也能做到代码无侵入的方式呢?如果有这样的一个需求,数据修改后,需要及时的将mysql中的数据更新到elasticsearch,我们会怎么进行实现呢?数据同步方案选择针对上文的需求,经过思考,初步有如下的一些方案:代码实现 针对代码中进行数据库原创 2021-11-10 15:49:32 · 663 阅读 · 0 评论 -
java8内存结构
其实在第一部分的方法区介绍里面,已经提前说了一些,想要好好的理解java8内存结构,那一定是在java7的基础上和其作比较,因此首先解释一下两个名词:永久代(PermGen)和元空间(Metaspace)。首先是永久代:我们常见的 "java.lang.OutOfMemoryError: PermGen space "这个异常。这里的 “PermGen space”其实指的就是方法区。不过方法区和“PermGen space”又有着本质的区别。前者是 JVM 的规范,而后者则是 JVM 规范的一种实原创 2021-11-10 15:44:31 · 660 阅读 · 0 评论 -
用例子理解java7内存结构
一个例子理解全部为了理解的比较深刻,先给一个例子。通过例子讲解印象更加深刻吧,假设我们在idea或者是任何IDE环境中定义了一个类。有一个person类public class Person{ int age; String name; Baby baby; public void walk() { System.out.println("我正在走路。。。。"); }}还有个Baby类public class Baby{原创 2021-11-10 15:37:51 · 70 阅读 · 0 评论 -
java7内存结构
先给一张java7的内存结构图吧(我用Windows里面的画图工具画的,所以看起来不怎么美观)首先对这个图有一个认识,从上面可以看到java7的内存结构大致分了五个部分:PC寄存器,java虚拟机栈、本地方法栈、java堆、方法区。其中PC寄存器、java虚拟机栈和本地方法栈是所有线程共享的一块内存区域。java堆和方法区是每一个线程隔离的一块区域,其中,方法区还有一个运行时常量池。接下来看一看每一块区域里面存放的什么?一、PC寄存器在大学的时候学过计算机组成原理的时候都知道,内存.原创 2021-11-10 15:32:45 · 1162 阅读 · 2 评论 -
linux使用logrotate管理日志
CentOS7管理项目日志1,正常项目来说,每天都会产生新的日志信息,但是如果任其增长的话,可能造成存储空间不够,排查线上问题困难;所以我们需要管理我们的日志文件,方便排雷和合理利用服务器存储空间2,用shell连接服务器后,通过Xftp 上传项目包到服务器后,我是后台启动的java -jar xx.jar/xx.war > /xx/xx/xx.log & :后台启动项目并打印日志到/xx/xx/xx.log文件内此时,对xx.log进行管理,[root@localhos原创 2021-11-10 15:17:03 · 600 阅读 · 0 评论 -
分布式与集群的区别
其实分布式不一定就是不同的组件,同一个组件也可以,关键在于是否通过交换信息的方式进行协作。比如说Zookeeper的节点都是对等的,但它自己就构成一个分布式系统。也就是说,分布式是指通过网络连接的多个组件,通过交换信息协作而形成的系统。而集群,是指同一种组件的多个实例,形成的逻辑上的整体。可以看出这两个概念并不完全冲突,分布式系统也可以是一个集群,例子就是前面说的zookeeper等,它的特征是服务之间会互相通信协作。是分布式系统不是集群的情况,就是多个不同组件构成的系统;是集群不是分布式系统的情况原创 2021-11-09 14:48:10 · 700 阅读 · 0 评论 -
分布式、中间件、消息队列的工作模式
1. 分布式分布式的主要特点在于负载均衡和高可用。负载均衡,简单来说就是"把原来一个人的事情分给多个人来干"。举个例子:比如原来有工作三份工作1、工作2、工作3。非分布式的情况下是需要A一个人完成1、2、3,这3件事情;分布式的情况下,找了3个人来干活。A做工作1、B做工作2、C做工作3。这样处理事情的速度变快了,并且整体的效率也提高了。2. 消息队列rabbit MQ是消息队列,顾名思义,就是一个队列,满足先进先出的队列特性。举个例子:排队打饭,A、B、C三个人排队打饭,打饭的时候仍然按照原创 2021-11-09 14:43:39 · 761 阅读 · 0 评论 -
spring cloud 和 dubbo 各自的优缺点
两者都是现在主流的微服务框架,但却存在不少差异:初始定位不同: SpringCloud定位为微服务架构下的一站式解决方案;Dubbo 是 SOA 时代的产物,它的关注点主要在于服务的调用和治理 生态环境不同: SpringCloud依托于Spring平台,具备更加完善的生态体系;而Dubbo一开始只是做RPC远程调用,生态相对匮乏,现在逐渐丰富起来。 调用方式: SpringCloud是采用Http协议做远程调用,接口一般是Rest风格,比较灵活;Dubbo是采用Dubbo协议,接口一般是Java的原创 2021-11-08 16:40:37 · 506 阅读 · 0 评论 -
SpringCloud集成Dubbo实现RPC调用
SpringCloud轻松集成Dubbo实现RPC调用很久之前在做微服务架构选型的时候就听说阿里的微服务RPC框架dubbo,当时与Spring Cloud以http协议调用的架构做对比。发现dubbo的rpc框架学习成本较高,代码入侵性强,本身生态不完整,需要整合多个外部组件,故选择了相对性能弱一点的Spring Cloud全家桶。直到Spring Cloud Alibaba的出现,使用Nacos作为服务发现与注册,同时兼容使用Feign的http方式和使用Dubbo的rpc方式调用。Spri原创 2021-11-08 16:21:49 · 478 阅读 · 0 评论 -
Dubbo(RPC原理、Dubbo架构&负载均衡配置方式)(2)
1.Dubbo 的架构图解上述节点简单说明:Provider: 暴露服务的服务提供方 Consumer: 调用远程服务的服务消费方 Registry: 服务注册与发现的注册中心 Monitor: 统计服务的调用次数和调用时间的监控中心 Container: 服务运行容器调用关系说明:服务容器负责启动,加载,运行服务提供者。 服务提供者在启动时,向注册中心注册自己提供的服务。 服务消费者在启动时,向注册中心订阅自己所需的服务。 注册中心返回服务提供者地址列表给消费者,如果.原创 2021-11-08 16:11:04 · 96 阅读 · 0 评论 -
Dubbo(RPC原理、Dubbo架构&负载均衡配置方式)(3)
1.什么是负载均衡先来个官方的解释。维基百科对负载均衡的定义:负载均衡改善了跨多个计算资源(例如计算机,计算机集群,网络链接,中央处理单元或磁盘驱动的的工作负载分布。负载平衡旨在优化资源使用,最大化吞吐量,最小化响应时间,并避免任何单个资源的过载。使用具有负载平衡而不是单个组件的多个组件可以通过冗余提高可靠性和可用性。负载平衡通常涉及专用软件或硬件。上面讲的大家可能不太好理解,再用通俗的话给大家说一下。比如我们的系统中的某个服务的访问量特别大,我们将这个服务部署在了多台服务器上,当客户端发起原创 2021-11-08 16:15:58 · 1178 阅读 · 0 评论 -
Dubbo(RPC原理、Dubbo架构&负载均衡配置方式)(1)
1.什么是 Dubbo?Apache Dubbo (incubating) |ˈdʌbəʊ|是一款高性能、轻量级的开源Java RPC 框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。简单来说 Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。另外,在开源中国举行的2018年度最受欢迎中国开源软件这个活动的评选中,Dubbo 更是凭借其超高人气仅次于vue.js和ECharts获得第三...原创 2021-11-08 15:59:10 · 120 阅读 · 0 评论 -
RPC协议
什么是RPC协议?RPC是一种远程过程调用的协议,使用这种协议向另一台计算机上的程序请求服务,不需要了解底层网络技术的协议。在 RPC 中,发出请求的程序是客户程序,而提供服务的程序是服务器。HTTP是一种超文本传输协议。是WWW浏览器和WWW服务器之间的应用层通讯协议RPC协议与HTTP协议的区别1、RPC是一种API,HTTP是一种无状态的网络协议。RPC可以基于HTTP协议实现,也可以直接在TCP协议上实现。2、RPC主要是用在大型网站里面,因为大型网站里面系统繁多,业务线复杂原创 2021-11-08 15:53:43 · 1532 阅读 · 0 评论 -
单体式应用程序
与微服务相对的另一个概念是传统的单体式应用程序( Monolithic application ),单体式应用内部包含了所有需要的服务。而且各个服务功能模块有很强的耦合性,也就是相互依赖彼此,很难拆分和扩容。说在做的各位都写过单体程序,大家都没意见吧?给大家举个栗子,刚开始写代码你写的helloworld程序就是单体程序,一个程序包含所有功能,虽然 helloworld 功能很简单。单体应用程序的优点开发简洁,功能都在单个程序内部,便于软件设计和开发规划。 容易部署,程序单一不存在分布式集群的原创 2021-11-08 14:46:49 · 1565 阅读 · 0 评论 -
微服务架构
微服务架构,主要是中间层分解,将系统拆分成很多小应用(微服务),微服务可以部署在不同的服务器上,也可以部署在相同的服务器不同的容器上。当应用的故障不会影响到其他应用,单应用的负载也不会影响到其他应用,其代表框架有Spring cloud、Dubbo等作者:两眼忧郁的大叔链接:https://www.zhihu.com/question/374306220/answer/1745846199来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。易于开发和维护: 一个微.原创 2021-11-08 14:35:04 · 1196 阅读 · 0 评论 -
synchronized与锁升级
作者:bravo1988链接:https://www.zhihu.com/question/317687988/answer/1715863550来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。大致介绍完Java对象内存结构后,我们再来解决一个新疑问:为什么需要标记锁的状态呢?是否意味着synchronized锁有多种状态呢?在JDK早期版本中,synchronized关键字的实现是直接基于重量级锁的。只要我们在代码中使用了synchronized,JVM.原创 2021-11-05 11:59:57 · 126 阅读 · 0 评论 -
JVM锁:
作者:bravo1988链接:https://www.zhihu.com/question/317687988/answer/1715863550来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。所谓JVM锁,其实指的是诸如synchronized关键字或者ReentrantLock实现的锁。之所以统称为JVM锁,是因为我们的项目其实都是跑在JVM上的。理论上每一个项目启动后,就对应一片JVM内存,后续运行时数据的生离死别都是在这一片土地上。什么是锁、怎么锁?.原创 2021-11-05 11:58:00 · 1021 阅读 · 0 评论 -
redis+mysql几种用法
首先要知道mysql存储在磁盘里,redis存储在内存里,redis既可以用来做持久存储,也可以做缓存,而目前大多数公司的存储都是mysql + redis,mysql作为主存储,redis作为辅助存储被用作缓存,加快访问读取的速度,提高性能那么为什么不直接全部用redis存储呢?因为redis存储在内存中,如果存储在内存中,存储容量肯定要比磁盘少很多,那么要存储大量数据,只能花更多的钱去购买内存,造成在一些不需要高性能的地方是相对比较浪费的,所以目前基本都是mysql(主) + redis(辅),在需原创 2021-11-05 11:32:14 · 800 阅读 · 0 评论 -
Reids的特点
Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB,不像 memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能,比方说原创 2021-11-05 11:08:55 · 69 阅读 · 0 评论 -
elastic search与postgresql的数据同步
方案选择由于是针对业务数据做全文搜索,数据存在数据库里,所以将这些数据同步到 ES ,怎么做呢,无非两种方式:一是通过 ES 的 API 进行增删改查,二是通过中间件进行数据全量、增量的同步。很明显 API 的方式比较麻烦,那就试试第二种吧。中间件的方式总共搜了三种方案:方案1:elasticsearch-jdbc一个 独立的第三方工具。使用很简单,写个 shell 脚本就行了:这个工具的活跃度也很高,问题是它的版本兼容性:目前最高只兼容Elasticsearch2.3.4elastic原创 2021-11-05 11:05:35 · 2237 阅读 · 0 评论 -
elastic search与mysql的数据同步
go-mysql-elasticsearch插件简介go-mysql-elasticsearch是用于同步mysql数据到ES集群的一个开源工具,项目github地址:https://github.com/siddontang/go-mysql-elasticsearchgo-mysql-elasticsearch的基本原理是:如果是第一次启动该程序,首先使用mysqldump工具对源mysql数据库进行一次全量同步,通过elasticsearch client执行操作写入数据到ES;然后实现了原创 2021-11-04 18:19:11 · 862 阅读 · 0 评论 -
ElasticSearch 比 MySQL 更适合复杂条件搜索
因为底层数据结构不一样啊mysql的索引结构是b+tree,有两种索引,一个基于主键id的,叶子节点有这一行所有字段的值,另一种是基于某一列的,叶子节点存主键id,你要是按照多个字段去搜,他只能用某一个字段的索引,而不能全用上,你看执行计划就可以知道,mysql选择cost最小的字段的索引来搜,其他你搜的字段基本上都是在结果里面一个个过滤,这是最核心的不同es就不一样了,多字段的索引他全可以用上,比如用关键字在倒排索引中查到一堆符合条件的文档id,然后再通过类似status,type之类的term查原创 2021-11-04 18:16:46 · 148 阅读 · 0 评论 -
ES和Kibana在docker中的安装
ES:1、在docker环境下安装ElasticSearchdocker pull elasticsearch:6.4.22、查看镜像docker images3、启动ElasticSearchdocker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" --name MyEs(别名) -d e47ebd7ec3ee(镜像id)说明:-d 后台启动 -p 9200:9200 将虚拟机9200端口映射到elastic原创 2021-11-04 18:13:28 · 330 阅读 · 0 评论 -
ELK Stack 的应用场景
场景一:使用 ES 作为业务系统的后端。此时,ES 的作用类似传统业务系统中的 MySQL、PostgreSQL、Oracle 或者 Mongo 等的基础关系型数据库或非关系型数据库的作用。我们举例说明。使用 ES 对基础文档进行检索操作,如将传统的 word 文档、PDF 文档、PPT 文档等通过 Openoffice 或者 pdf2htmlEX 工具转换为 HTML,再将 HTML 以JSON 串的形式录入到 ES,以对外提供检索服务。场景二:在原有系统中增加 ES、Logstash、Kiba原创 2021-11-04 18:09:32 · 246 阅读 · 0 评论 -
学习ssm框架的顺序
作者:JavaFish链接:https://www.zhihu.com/question/330118444/answer/723820941来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。首先我们学习 ssm 框架之前需要先掌握Java 基础、数据库相关知识、web 基础、spring、springmvc、mybatis。Java 基础主要包括:8 种数据类型,基本运算符,条件分支语句,面向接口编程,常见的集合类,IO操作、基本网络通信等数据库:基本原理.原创 2021-11-04 17:59:28 · 7615 阅读 · 0 评论 -
学习ssm框架一般要用多少时间
直接说需要学习多少时间不可能的,需要看个人的基础和经验以及学习途径和知识接收度。但是不建议你现在立即学习SSM,目前可能不会为就业发愁,但是等你需要正式就业的时候,会有很多别的技术更加普及。先学sparing MVC和sparing Boot然后学习jip/iHibernate或MYbatis这样学着收益会比较大,对将来也有好处 需要更多教程,...原创 2021-11-04 17:42:12 · 1567 阅读 · 0 评论