自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(252)
  • 收藏
  • 关注

原创 分享30道Redis面试题,面试官能问到的我都找到了

Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB,不像 memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能。比如你的web系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的key,而是应该把这个用户的所有信息存储到一张散列表里面。

2022-09-22 11:00:44 432 1

原创 Java进阶面试题:如何设计一个高并发系统?

你需要考虑:哪些需要分库分表,哪些不需要分库分表,单库单表跟分库分表如何 join,哪些数据要放到缓存里去,放哪些数据再可以扛住高并发的请求,你需要完成对一个复杂业务系统的分析之后,然后逐步逐步的加入高并发的系统架构的改造,这个过程是无比复杂的,一旦做过一次,并且做好了,你在这个市场上就会非常的吃香。其实大部分公司,真正看重的,不是说你掌握高并发相关的一些基本的架构知识,架构中的一些技术,RocketMQ、Kafka、Redis、Elasticsearch,高并发这一块,你了解了,也只能是次一等的人才。

2022-09-22 10:59:10 368

原创 阿里Java面试题剖析:关于系统拆分,为什么要进行系统拆分?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xz97Uqx1-1663815474530)(https://upload-images.jianshu.io/upload_images/16535373-f09e8b01773f1b32.jpg?

2022-09-22 10:58:24 337

原创 阿里Java面试题剖析:如何保证缓存与数据库的双写一致性?

原因很简单,很多时候,在复杂点的缓存场景,缓存不单单是数据库中直接取出来的值。比如可能更新了某个表的一个字段,然后其对应的缓存,是需要查询另外两个表的数据并进行运算,才能计算出缓存最新的值的。另外更新缓存的代价有时候是很高的。是不是说,每次修改数据库的时候,都一定要将其对应的缓存更新一份?也许有的场景是这样,但是对于。

2022-09-22 10:55:57 206

原创 阿里Java面试题剖析:redis 的并发竞争问题是什么?如何解决这个问题?了解 redis 事务的 CAS 方案吗?

面试原题这个也是线上非常常见的一个问题,就是一个 key,可能本来应该先到的数据后到了,导致数据版本错了;或者是多客户端同时获取一个 key,修改值之后再写回去,只要顺序错了,数据就错了。而且 redis 自己就有天然解决这个问题的 CAS 类的乐观锁方案。

2022-09-22 10:54:20 105

原创 阿里JAVA面试题剖析:一般实现分布式锁都有哪些方式?使用 Redis 如何设计分布式锁?使用 zk 来设计分布式锁可以吗?这两种分布式锁的实现方式哪种效率比较高?

因为如果某个客户端获取到了锁,但是阻塞了很长时间才执行完,比如说超过了 30s,此时可能已经自动释放锁了,此时可能别的客户端已经获取到了这个锁,要是你这个时候直接删除 key 的话会有问题,所以得用随机值加上面的 lua 脚本来释放锁。而 zk 的话,因为创建的是临时 znode,只要客户端挂了,znode 就没了,此时就自动释放锁。的那个人创建的 node 上,一旦某个人释放了锁,排在自己后面的人就会被 zookeeper 给通知,一旦被通知了之后,就 ok 了,自己就获取到了锁,就可以执行代码了。

2022-09-22 10:53:11 108

原创 Redis 主从架构

单机的 redis,能够承载的 QPS 大概就在上万到几万不等。对于缓存来说,一般都是用来支撑的。因此架构做成主从(master-slave)架构,一主多从,主负责写,并且将数据复制到其它的 slave 节点,从节点负责读。所有的。这样也可以很轻松实现水平扩容,。redis replication -> 主从架构 -> 读写分离 -> 水平扩容支撑读高并发。

2022-09-22 10:51:22 109

原创 Redis 哨兵集群实现高可用

sentinel,中文名是哨兵。集群监控:负责监控 redis master 和 slave 进程是否正常工作。消息通知:如果某个 redis 实例有故障,那么哨兵负责发送消息作为报警通知给管理员。故障转移:如果 master node 挂掉了,会自动转移到 slave node 上。配置中心:如果故障转移发生了,通知 client 客户端新的 master 地址。哨兵用于实现 redis 集群的高可用,本身也是分布式的,作为一个哨兵集群去运行,互相协同工作。

2022-09-22 10:50:55 96

原创 JAVA8十大新特性详解(精编)

Formula接口在拥有calculate方法之外同时还定义了sqrt方法,实现了Formula接口的子类只需要实现一个calculate方法,默认方法sqrt将在子类上可以直接使用。文中的formula被实现为一个匿名类的实例,该代码非常容易理解,6行代码实现了计算 sqrt(a * 100)。在下一节中,我们将会看到实现单方法接口的更简单的做法。

2022-09-22 10:48:47 296

原创 阿里Java面试题剖析:在高并发的情况下如何保证消息的顺序性?

同步的系统,压力还是非常大的,日同步数据要达到上亿,就是说数据从一个 mysql 库原封不动地同步到另一个 mysql 库里面去(mysql -> mysql)。常见的一点在于说比如大数据 team,就需要同步一个 mysql 库过来,对公司的业务系统的数据做各种复杂的操作。发送到 MQ 里面,再消费出来依次执行,起码得保证人家是按照顺序来的吧?其实这个也是用 MQ 的时候必问的话题,第一看看你了不了解顺序这个事儿?结果你搞错了这个顺序,最后这个数据保留下来了,数据同步就出错了。如何保证消息的顺序性?

2022-09-22 10:48:04 341

原创 MySQL 事务、日志、锁、索引学习总结

对于一个唯一、非唯一索引皆存的表来说,对于数据的更新可能是不同步的,主键、唯一索引数据已经在内存中更改、而普通索引则是将更改先记录在change buffer中,写入change buffer时也会记录redolog、binlog,确保崩溃后恢复。同样的,在新增时也可能导致数据空洞,当一个数据页A已经写满了,但由于索引的有序性,需要在A中间再插入一条数据,这时就需要进行页分裂再申请一个数据页来保存数据(当前数据以及之后的索引分裂到新的数据页)。在当前读时,索引扫描到的记录都会加上间隙锁,区间为前开后开。

2022-09-20 11:03:06 141

原创 深入理解Https如何保证通信安全

作为一名ABC搬运工,我相信很多人都知道Https,也都知道它是用来保证通信安全的,但是如果你没有深入了解过Https,可能并不知道它是如何保证通信安全的。我也是借着这次机会,和大家分享下我深入了解的一个过程。本文主要带着以下几个问题进行探讨:1、什么是Https?2、Https和Http有什么区别?3、Https是如何保证通信安全的,它解决了哪些问题?

2022-09-20 11:01:30 373 1

原创 Java进阶面试题:zookeeper 都有哪些使用场景?

那么此时就可以使用 zookeeper 分布式锁,一个机器接收到了请求之后先获取 zookeeper 上的一把分布式锁,就是可以去创建一个 znode,接着执行操作;这个其实是 zookeeper 很经典的一个用法,简单来说,就好比,你 A 系统发送个请求到 mq,然后 B 系统消息消费之后处理了。分布式锁这个东西,很常用的,你做 Java 系统开发,分布式系统,可能会有一些场景会用到。,一旦 B 系统处理完了就修改 zookeeper 那个节点的值,A 立马就可以收到通知,完美解决。

2022-09-20 11:01:05 155

原创 Java进阶面试题:zookeeper 都有哪些使用场景?

那么此时就可以使用 zookeeper 分布式锁,一个机器接收到了请求之后先获取 zookeeper 上的一把分布式锁,就是可以去创建一个 znode,接着执行操作;这个其实是 zookeeper 很经典的一个用法,简单来说,就好比,你 A 系统发送个请求到 mq,然后 B 系统消息消费之后处理了。分布式锁这个东西,很常用的,你做 Java 系统开发,分布式系统,可能会有一些场景会用到。,一旦 B 系统处理完了就修改 zookeeper 那个节点的值,A 立马就可以收到通知,完美解决。

2022-09-20 11:00:14 150

原创 每个程序员都会遇到的面试问题:谈谈进程和线程的区别

先到的人锁上门,后到的人看到上锁,就在门口排队,等锁打开再进去。线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。进程是程序的一次执行过程,是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一个进程都有一个自己的地址空间,至少有 5 种基本状态,它们是:初始态,执行态,等待状态,就绪状态,终止状态。:没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;

2022-09-20 10:59:26 164

原创 阿里JAVA面试题剖析:Redis 集群模式的工作原理能说一下么?在集群模式下,redis 的 key 是如何寻址的?分布式寻址都有哪些算法?了解一致性 hash 算法吗?

自动将数据进行分片,每个 master 上放一部分数据提供内置的高可用支持,部分 master 不可用时,还是可以继续工作的在 redis cluster 架构下,每个 redis 要放开两个端口号,比如一个是 6379,另外一个就是 加1w 的端口号,比如 16379。16379 端口号是用来进行节点间通信的,也就是 cluster bus 的东西,cluster bus 的通信,用来进行故障检测、配置更新、故障转移授权。

2022-09-20 10:58:51 111

原创 阿里Java面试题剖析:Redis 的持久化有哪几种方式?不同的持久化机制都有什么优缺点?持久化机制具体底层是如何实现的?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cu4mESJA-1663642527149)(https://upload-images.jianshu.io/upload_images/16535373-b527de0345da8e16?

2022-09-20 10:58:19 120

原创 阿里Java面试题剖析:Redis 都有哪些数据类型?分别怎样使用合适

直接基于 set 将系统里需要去重的数据扔进去,自动就给去重了,如果你需要对一些数据进行快速的全局去重,你当然也可以基于 jvm 内存里的 HashSet 进行去重,但是如果你的某个系统部署在多台机器上呢?比如可以通过 lrange 命令,读取某个闭区间内的元素,可以基于 list 实现分页查询,这个是很棒的一个功能,基于 redis 实现简单的高性能分页,可以做类似微博那种下拉不断分页的东西,性能高,就一页一页走。分别在哪些场景下使用比较合适?‘#-------操作一个set-------’

2022-09-20 10:55:11 120

原创 阿里JAVA面试题剖析:Redis 和 memcached 有什么区别?redis 的线程模型是什么?为什么 redis 单线程却能支撑高并发?

redis 和 memcached 有什么区别?redis 的线程模型是什么?为什么 redis 单线程却能支撑高并发?

2022-09-20 10:42:05 162

原创 Redis面试详解

2).Master AOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响是最小的,但是AOF文件会不断增大,AOF文件过大会影响Master重启的恢复速度。Redis最适合所有数据in-momory的场景,虽然Redis也提供持久化功能,但实际更多的是一个disk-backed的功能,跟传统意义上的持久化有比较大的差别,那么可能大家就会有疑问,似乎Redis更像一个加强版的Memcached,那么何时使用Memcached,何时使用Redis呢?

2022-09-20 10:38:46 145

原创 Redis高可用分布式集群

分布式缓存再向后是云服务缓存,对使用端完全屏蔽细节,各应用自行申请大小、流量方案即可,如淘宝OCS云服务缓存。分布式缓存对应需要的实现组件有:一个缓存监控、迁移、管理中心。一个自定义的客户端组件,上图中的SmartClient。一个无状态的代理服务。N台服务器。

2022-09-19 13:55:24 155

原创 分享30道Redis面试题,面试官能问到的我都找到了

Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB,不像 memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能。比如你的web系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的key,而是应该把这个用户的所有信息存储到一张散列表里面。

2022-09-19 13:54:55 123

原创 Java进阶面试题:如何设计一个高并发系统?

某个服务工作量变大了,代码量越来越多,某个同学,负责一个服务,代码量变成了 10 万行了,他自己不堪重负,他现在一个人拆开,5 个服务,1 个人顶着,负责 5 个人,接着招人,2 个人,给那个同学带着,3 个人负责 5 个服务,其中 2 个人每个人负责 2 个服务,1 个人负责 1 个服务。所以 dubbo 说白了,是一种 rpc 框架,就是说本地就是进行接口调用,但是 dubbo 会代理这个调用请求,跟远程机器网络通信,给你处理掉负载均衡了、服务实例上下线自动感知了、超时重试了,等等乱七八糟的问题。

2022-09-19 13:53:54 264

原创 阿里Java面试题剖析:关于系统拆分,为什么要进行系统拆分?

某个服务工作量变大了,代码量越来越多,某个同学,负责一个服务,代码量变成了 10 万行了,他自己不堪重负,他现在一个人拆开,5 个服务,1 个人顶着,负责 5 个人,接着招人,2 个人,给那个同学带着,3 个人负责 5 个服务,其中 2 个人每个人负责 2 个服务,1 个人负责 1 个服务。所以 dubbo 说白了,是一种 rpc 框架,就是说本地就是进行接口调用,但是 dubbo 会代理这个调用请求,跟远程机器网络通信,给你处理掉负载均衡了、服务实例上下线自动感知了、超时重试了,等等乱七八糟的问题。

2022-09-19 13:52:45 250

原创 阿里Java面试题剖析:如何保证缓存与数据库的双写一致性?

原因很简单,很多时候,在复杂点的缓存场景,缓存不单单是数据库中直接取出来的值。比如可能更新了某个表的一个字段,然后其对应的缓存,是需要查询另外两个表的数据并进行运算,才能计算出缓存最新的值的。另外更新缓存的代价有时候是很高的。是不是说,每次修改数据库的时候,都一定要将其对应的缓存更新一份?也许有的场景是这样,但是对于。

2022-09-19 13:52:16 268

原创 阿里JAVA面试题剖析:一般实现分布式锁都有哪些方式?使用 Redis 如何设计分布式锁?使用 zk 来设计分布式锁可以吗?这两种分布式锁的实现方式哪种效率比较高?

因为如果某个客户端获取到了锁,但是阻塞了很长时间才执行完,比如说超过了 30s,此时可能已经自动释放锁了,此时可能别的客户端已经获取到了这个锁,要是你这个时候直接删除 key 的话会有问题,所以得用随机值加上面的 lua 脚本来释放锁。而 zk 的话,因为创建的是临时 znode,只要客户端挂了,znode 就没了,此时就自动释放锁。的那个人创建的 node 上,一旦某个人释放了锁,排在自己后面的人就会被 zookeeper 给通知,一旦被通知了之后,就 ok 了,自己就获取到了锁,就可以执行代码了。

2022-09-19 13:51:17 126

原创 Redis 主从架构

单机的 redis,能够承载的 QPS 大概就在上万到几万不等。对于缓存来说,一般都是用来支撑的。因此架构做成主从(master-slave)架构,一主多从,主负责写,并且将数据复制到其它的 slave 节点,从节点负责读。所有的。这样也可以很轻松实现水平扩容,。redis replication -> 主从架构 -> 读写分离 -> 水平扩容支撑读高并发。

2022-09-19 13:48:33 312

原创 Redis 哨兵集群实现高可用

sentinel,中文名是哨兵。集群监控:负责监控 redis master 和 slave 进程是否正常工作。消息通知:如果某个 redis 实例有故障,那么哨兵负责发送消息作为报警通知给管理员。故障转移:如果 master node 挂掉了,会自动转移到 slave node 上。配置中心:如果故障转移发生了,通知 client 客户端新的 master 地址。哨兵用于实现 redis 集群的高可用,本身也是分布式的,作为一个哨兵集群去运行,互相协同工作。

2022-09-19 13:48:01 340

原创 JAVA8十大新特性详解(精编)

Formula接口在拥有calculate方法之外同时还定义了sqrt方法,实现了Formula接口的子类只需要实现一个calculate方法,默认方法sqrt将在子类上可以直接使用。文中的formula被实现为一个匿名类的实例,该代码非常容易理解,6行代码实现了计算 sqrt(a * 100)。在下一节中,我们将会看到实现单方法接口的更简单的做法。

2022-09-19 13:47:31 235

原创 阿里Java面试题剖析:在高并发的情况下如何保证消息的顺序性?

同步的系统,压力还是非常大的,日同步数据要达到上亿,就是说数据从一个 mysql 库原封不动地同步到另一个 mysql 库里面去(mysql -> mysql)。常见的一点在于说比如大数据 team,就需要同步一个 mysql 库过来,对公司的业务系统的数据做各种复杂的操作。发送到 MQ 里面,再消费出来依次执行,起码得保证人家是按照顺序来的吧?其实这个也是用 MQ 的时候必问的话题,第一看看你了不了解顺序这个事儿?结果你搞错了这个顺序,最后这个数据保留下来了,数据同步就出错了。如何保证消息的顺序性?

2022-09-19 13:45:20 150

原创 图文详解:如何做到操作系统和并发同步的结合?

因为 i 是静态变量,没有经过任何线程安全措施的保护,多个线程会并发修改 i 的值,所以我们认为 i 不是线程安全的,导致这种结果的出现是由于 aThread 和 bThread 中读取的 i 值彼此不可见,所以这是由于 可见性 导致的线程安全问题。####原子性问题看起来很普通的一段程序却因为两个线程 aThread 和 bThread 交替执行产生了不同的结果。但是根源不是因为创建了两个线程导致的,多线程只是产生线程安全性的必要条件,最终的根源出现在 i++ 这个操作上。这个操作怎么了?

2022-09-17 14:24:45 81

原创 让人一看就会的java阻塞队列与非阻塞队列

今天要来讲一下java里的队列,队列,顾名思义,排队的列,既然按排队形来做的话,生活中的银行排队啊,上车排队啊,都是先到先办理或者先上车,队列存取数据列也一样,这就是先进先出,使用队列的规则是:使用队素时,数据元素只能从表的一端进入队列,另一端出队列。称进入队列的一端为“队尾”,出队列的一端为“队头”。数据元素全部从队尾陆续进队列,由对头陆续出队列。特点:先进先出。

2022-09-17 14:24:05 245

原创 软件设计是怎样炼成的?关于软件设计的一些“大道理”

刚毕业不久,我从事第一份软件开发的工作,要完成一个项目,但没有任何软件设计的思路,于是请教我的老板。我的老板给了我两种思路:1)先假设软件已经做出来了,想好软件的外在表现,由此倒推软件的实现方法;2)思考程序的数据结构,先设计数据库,然后再搭建软件的上层建筑。老板给了我很大的启发,随着工作的开展,后来我又发现了第3种设计的思路。本文将为你分享三种软件设计的思路:1)由顶而下;2)由底而上;3)由中间到上下。

2022-09-17 14:22:16 168

原创 关于SpringBoot的多数据源以及事务解决方案

通过继承即可实现。为了方便对数据源进行操作,我们定义一个接口,为业务提供操作数据源的统一接口。}该接口主要是对数据表中定义的数据源,提供基础管理功能。的实现如下图所示:根据前面的分析,是在容器启动的时候,执行注入数据源对象,完成之后无法对数据源进行修改。则实现接口,可以将数据表中的数据源加载到。为了保证在多个数据源中事务的一致性,我们可以手动管理Connetion的事务提交和回滚。考虑到不同ORM框架的事务管理实现差异,要求实现自定义事务管理不影响框架层的事务。

2022-09-17 14:21:43 1183

原创 简单用一个登录鉴权来说明 Spring Boot 如何使用 Spring AOP

但如果这种接口数量一多,那我们的工作量就势必加大了。面向切面编程(Aspect Oriented Programming),可以将与业务无关但是被各个业务模块共同调用的逻辑抽取出来,以切面的方式切入到代码中,从而降低系统中代码的耦合度,减少重复的代码。这种应用场景,例如登录校验、权限校验、日志处理等这种多个模块可能会共同调用的代码,我们完全可以使用切面的方式,将逻辑切入到业务模块中。可以看到,如果发生了异常,那么切入点发生异常后续的代码、后置通知的代码、环绕通知之后的代码不会运行,并且最终通知一定会运行。

2022-09-17 14:21:10 148

原创 我们对SpringBoot全局的异常处理有哪些呢?

但 Service 层抛出后. 在 Controller 层就需要 try-catch 去捕获异常, 否则会返回原生错误信息到客户端. 但是, 如果在 Controller 层的每个方法体里面都写一些模板化的 try-catch 的代码, 代码不但不美观, 也增加了维护的难度, 特别是还需要对 Service 层的不同异常进行不同处理的时候., 当数据库操作失败时, 让 Service 层抛出运行时异常, 而不进行 try-catch 处理, Spring 事物管理器就会进行回滚.① 使用统一的返回值。

2022-09-17 14:20:39 187

原创 吊打MySQL:21性能优化实践+学习导图+55面试+笔记+20高频知识点

面试又被MySQL虐?是不是很扎心呢?(呜呜呜~)好吧,话不多说,直接进入主题,分享一波我整理的干货,让你面试不再被虐,一起吊打MySQL!注意注意:需要小编分享的这个**55道复习必备+20个高频知识点+21性能优化实践+MySQL学习思维脑图+MySQL技术内幕 InnoDB存储引擎(PDF)可。

2022-09-17 14:20:01 151

原创 【Spring框架】<mvc:default-servlet-handler/>的作用

在接收到静态资源的获取请求时,会检查请求头的Last-Modified值,如果静态资源没有发生变化,则直接返回303相应状态码,提示客户端使用浏览器缓存的数据,而非将静态资源的内容输出到客户端,以充分节省带宽,提高程序性能。如果将DispatcherServlet请求映射配置为"/",则Spring MVC将捕获Web容器所有的请求,包括静态资源的请求,Spring MVC会将它们当成一个普通请求处理,因此找不到对应处理器将导致错误。

2022-09-17 14:19:15 101

原创 JavaWeb学习之Servlet,MyEclipse及Tomcat的配置

一个名称映射一个类,别名可以随便取,方便在整个web.xml中引用这个Servlet(13行),但类名必须为之前定义的Servlet,含包名(14行)。其实,doPost和doGet方法其实是在Servlet类的service()方法的内部中调用的。既然这个Servlet是由Web容器启动的,那么就需要在Web.xml中进行配置,这样的话,Tomcat在启动的时候就会自动加载这个文件。上图可以看到,同一个资源,在不同的时间、不同的人访问的时候,是不一样的,很显然Servlet是动态Web资源。

2022-09-17 14:18:50 420

原创 求求你别在用SpringMVC了,太Low了,Spring又官宣了一个更牛逼的替代框架!

是spring在5.0版本后提供的一套响应式编程风格的web开发框架。这个框架包含了和spring mvc,它可以运行在Netty、Undertow以及3.1版本以上的Serlvet容器上。你可以在项目中同时使用和,或者只用其中一个来开发web应用。所谓响应式,举个例子,当调用一个api获取数据时,无需阻塞等待数据返回,而是当有数据返回时会进行告知。可见响应式是非阻塞的,意味着调用方法后,CPU可以去做别的事情,当接收到数据响应时CPU再回来处理,这种方式提高了系统的吞吐量。

2022-09-17 14:17:49 279

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除