自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 为什么 JDK 1.8 对 HashMap 进行了红黑树的改动?

举个例子,一个节点反复添加,从8变成9,链表变红黑树,又删了,从9变成 8,又从红黑树变链表,再添加,又从链表变红黑树?因为红黑树节点的大小是普通节点大小的两倍,为了节省内存空间不会直接只用红黑树,只有节点到达定数量才会转成红黑树。这就是基于时间和空间的平衡了,红黑树占用内存大,所以节点少就不用红黑树,冲突很多,就用红黑树。同样也是为了平衡时间和空间,节点太少链表遍历也很快,没必要用红黑树,变成链表节约内存。因为红黑树的查找,更新的时间复杂度是 O(log_2⁡n ),但。,防止链表超长时性能下降。

2025-04-01 09:56:46 220

原创 Java结合HotKey进行热点探测

根据官方压测: 一台8核 8G 的机器,每秒可以处理来自于数千台服务器发来的高达 16 万个的待测 key,8 核单机吞吐量在 16 万,16 核机器每秒可达 30 万以上探测量,所以仅采用 10 台机器,即可完成每秒近 300 万次的 key 探测任务。当客户端发送写请求时,领导者首先将写操作写入自己的日志中,并将写操作的日志分发给其他节点,其他节点收到日志后也将其写入自己的日志中。同理如果一道题访问的频率特别高,此时可以将其自动缓存在本地或者 Redis 中,提高访问性能的同时,降低数据库的压力。

2025-04-01 09:52:17 830

原创 秒杀系统高并发大流量的应对之道

来实现,主要是设置并发数限流,可以通过自定义线程池,配置最大的连接数,以请求队列的长度和拒绝策略等参数进行限流,如果队列已满,并且已经达到最大的线程数,多余的请求就会根据具体的拒绝策略进行处理,以达到限流的目的和效果。光有缓存还不够,在处理的数据上要尽量少,不要查询或者返回无关紧要的数据。对整个秒杀活动进行风控处理,风控系统的建设不是一朝一夕就能完成的,建立风控的过程也是比较困难的,这需要建立在大量数据的基础之上,不断的完善用户的画像,需要通过复杂的业务场景的考验,不断的修正风控模型。

2025-03-30 15:35:47 865

原创 JAVA实现动态IP黑名单过滤

 一些恶意用户(可能是黑客、爬虫、DDoS 攻击者)可能频繁请求服务器资源,导致资源占用过高。因此需要一定的手段实时阻止可疑或恶意的用户,减少攻击风险。通过 IP 封禁,可以有效拉黑攻击者,防止资源被滥用,保障合法用户的正常访问。对于我们的需求,不让拉进黑名单的IP 访问任何接口。

2025-03-28 18:00:09 912

原创 JDK21新特性及虚拟线程

System.out.println("任务 " + taskId + " 由线程: " + Thread.currentThread().getName() + " 执行");System.out.println("执行任务 " + taskId + ",线程名: " + Thread.currentThread().getName());//将最终结果发送给客户端。System.out.println("虚拟线程执行任务: " + Thread.currentThread().getName());

2025-03-27 15:08:20 1034

原创 怎么简单设计一个文件上传系统?

的东西,也就是计算文件的 md5(或者其他 hash 算法),得到摘要,对比两个文件的摘要,如何摘要一致就可以认为是同一份文件。摘要在文件场景非常常见,例如 jdk 的下载就会附上摘要,用来判别我们下载的文件是否被篡改,摘要一致则文件没有被篡改过。

2025-03-26 19:56:23 512

原创 Redis集群哨兵相关面试题

脑裂是指在分布式系统中,由于网络分区或其他问题导致系统中的多个节点( 特别是主节点 )误以为自己是唯一的主节点。这种情况会导致多个主节点同时提供写入服务,从而引起数据不一致。分布式系统就像一个团队在干活,如果发生了脑裂,就好比这个团队突然因为某些原因,比如通信出了问题,分成了几个小团体。每个小团体都以为自己是整个团队,都在按自己的方式工作。这样一来,数据也可能变得不一致,服务也变得不正常了,这就是分布式系统中的脑裂。导致脑裂出现原因主要是网络分区。

2025-03-26 13:05:02 1255

原创 SpringCloud配置中心面试题整理

配置中心是 一个用于配置集中化管理且支持动态更新、分发配置文件的工具(服务)。它实现了配置的统一管理和动态刷新。当配置信息发生变化时,配置中心可以自动通知服务实例进行配置更新,这样就可以实例无需重启即可应用最新的配置,从一定程度上减少了系统访问的空窗期,非常灵活方便。配置中心如何实现动态更新?配置中心通常使用长连接或长轮询的方式来实现配置的动态刷新客户端与服务器建立一个持久的连接,保持打开状态。通常是基于 TCP 或 Websocket 协议的连接方式,能够实现实时的推送。

2025-03-25 09:13:37 999

原创 分级反爬虫是什么?JAVA实现反爬虫策略

因为你无法限制真实的用户,攻击者完全可以模拟真实用户的访问方式来获取你的网站数据,比如找 10 个用户,每人获取几百题。爬虫是有一定风险的,自己学习倒没问题,但是千万别给人家的网站造成压力了,搞不好就有破坏计算机系统的嫌疑了!对于一个简单的项目,如果主要的目的是反爬虫,而不是应对高并发大流量的请求,所以不需要结合 Sentinel 或 Hotkey 去精确统计流量。当然这招只能防菜鸟,因为请求头是可以很轻松地伪造的,只要通过浏览器自带的网络控制台获取到响应正常的请求头信息,就可以绕过检测了。

2025-03-25 09:08:18 1342

原创 JAVA泛型相关面试题

泛型允许开发者编写类型参数化的代码,我觉得它最直接的作用:能够将运行时异常转为编译时异常引入泛型之前,集合类通常都是Object类型,从集合中获取元素时,必须手动将Object显式转换为具体类型。// 没有使用泛型的情况// 添加了一个 Integer​// 这是安全的// 运行时会抛出 ClassCastException引入泛型之后,编译器可以在编译阶段检查类型,比如,向添加非String类型对象,编译器会直接报错。// 使用泛型的情况​。

2025-03-24 12:47:13 559

原创 ElasticSearch快速入门--实现分词搜索

核心全文搜索与分析引擎。利用分布式架构提供近乎实时的数据搜索、分析和可视化能力。负责存储、索引和搜索数据。Logstash服务器端数据处理管道,能够同时从多个源采集数据转换数据,并过滤、增强和传输到。支持丰富的输入、过滤和输出插件。Beats轻量级的数据采集工具,每个Beat都是一个独立的守护进程,负责从系统或应用程序中收集数据,发送数据到Logstash或包括Filebeat: 收集日志文件。Metricbeat: 收集系统和服务的指标。Packetbeat: 监控网络流量。Kibana。

2025-03-24 12:39:00 1174

原创 Redis的单线程模型与多线程优化

通过 write 函数将客户端发送缓存区里的数据发送出去,如果这一轮数据没有发送完,就会继续注册写事件处理函数,等待 epoll_wait 发现可写后再处理。,看是发送队列里是否有任务,如果有发送任务,则通过 write 函数将客户端发送缓存区里的数据发送出去,如果这一轮数据没有发送完,就会注册写事件处理函数,等待。Redis 6.0 版本支持的 I/O 多线程特性,默认情况下 I/O 多线程只针对发送响应数据,并不会以多线程的方式处理用户读请求。: 在命令执行完毕后,结果会被放入缓冲区。

2025-03-22 12:55:51 1147

原创 学习笔记--基于Sa-Token 实现Java项目单点登录+同端互斥检测

如果用户每访问一个模块都要登录一次,那么这样就很麻烦了, 为了优化用户体验,需要一套机制将这N个系统的认证授权互通共享,让用户在一个系统登录之后,可以畅通无阻的访问其它所有系统。// 设置登录账号id为10001,第二个参数指定是否为[记住我],当此值为false后,关闭浏览器后再次打开需要重新登录。如果多个系统部署在不同的域名之下,但是后端可以连接同一个Redis,那么便可以使用 [URL重定向传播会话]按钮,由于此用户在SSO认证中心已有会话存在, 所以第四步也将自动化,也就是单点登录的最终目的。

2025-03-22 12:49:07 1205

原创 高并发场景订单问题解决思路(取消付款-重复下单-多平台付款)

以上两步能阻挡绝大部分用户正常操作下的重复下单行为,如果一些用户通过 api 请求绕过前端限制,或者后退页面再次点击下单进入,还是可以重复下单,不过一般这种设计基本可以杜绝稀有商品抢购或秒杀场景的恶意锁库存了,因为后退页面让下单流程再走一遍还是比较费时的。思路其实很清晰,通过支付状态字段的判断可以避免这种情况,不管是支付宝支付还是微信支付,用户支付后三方都会进行回调,这个回调处理逻辑在我们的系统中,因此我们可以在这里控制。在高并发系统中,这种情况是可能出现的,并需要通过合理的架构设计来解决。

2025-03-21 10:38:07 1293

原创 Linux 日常开发常用命令(解释-全)

默认模式,在这个模式中, 你可以使用『上下左右』按键来移动光标,你可以使用『删除字符』或『删除整行』来处理档案内容,也可以使用『复制、贴上』来处理你的文件数据。按下『i, I, o, O, a, A, r, R』等任何一个字母之后会进入编辑模式,此时在画面的左下方会出现『INSERT 或 REPLACE 』的字样。vi是Unix和类Unix操作系统中出现的通用的文本编辑器,vim是从vi发展出来的一个性能更强大的文本编辑器。如在编辑模式下编辑文件后,按下esc,进入一般模式,按下。

2025-03-21 10:16:53 545

原创 操作系统银行家算法

假如系统中有三类互斥资源 R1、R2、R3,可用资源数分别是 9、8、5,在指定时刻有 P1、P2、P3、P4 和 P5 这五个进程,这些进程的对三类互斥资源的最大需求量和已分配资源数如下表所示,那么系统如何先后运行这五个进程,不会发生死锁问题?:当系统现有资源数小于进程需求时,对进程的需求可以延迟分配,但总让进程在有限时间内获取资源。P2 执行之后,释放了刚刚放入的 2 1 0 资源和P2已分配的资源,211,所以。原则,优先给进程 P2 执行,因为剩余资源 够P2的 0 1 0 执行。

2025-03-20 10:18:24 223

原创 动态规划思想--简单易懂(01背包 完全背包 多重背包)

a.先清空背包,只放这个物品,再看看剩余容量能否装下之前的物品,最优解==>这个物品的价值+背包剩余容量的最优解。上图是完全背包的一维转换,01背包原理和它一模一样,不需要上一层状态了,只需改注意01背包是j--,完全是j++核心就是动态规划,一层一层的往后,先找到局部最优,然后记录下来,在此基础上继续下一步,所以不存在漏的情况。,然后元素个数不能重复使用( 01背包 ),能从数组中选出的数==背包容量,则返回true。在此基础上可以降维成 一维滚动数组,原因是,二维中有些可以重复使用,参考完全背包问题。

2025-03-20 09:50:59 720

原创 如何设计一个秒杀功能(详解)

在面试中针对这个问题其实并不指望候选人可以系统地回答出完且可落地的方案。只是想考察候选人是否拥有高并发大流量场景下的处理思路或者说能考虑到的一些关键点。针对秒杀场景,我们需要先和面试官说出以下几个需要解决的问题点:瞬时流量的承接防止超卖预防黑产避免对正常服务的影响兜底方案然后可以从前后端两个视角向面试官阐述整体的设计点:首先是利用 CDN 缓存静态资源( 秒杀页面的 HTML、CSS、JS等 ),减轻服务器的压力客户端限流,在前端随机限流,降低请求量,比如每秒只能发送一次请求。

2025-03-19 09:16:10 1160

原创 如何实现一个分布式单例对象?什么场景需要分布式单例?

单例模式确保一个类在同一个进程中只有一个实例,并提供一个全局访问点。这意味着无论在哪里调用该类的实例化方法,返回的都是同一个对象实例。在分布式系统中,无论是单台机器多个实例,还是多台机器多个实例,每个实例通常运行在独立的进程中,是在这些多进程环境中,确保某个类的实例对象在整个分布式系统中是唯一的,即所有进程访问的都是同一个对象实例。按照这个思路,需要确保在任意时刻,只有一个进程能够访问和修改单例对象。,而分布式场景下的分布式锁就很容易实现这个功能。

2025-03-19 09:08:11 598

原创 如何设计一个短链系统?流程如何?

还有哈希方法可能会导致哈希冲突,即不同的长链可能会生成一样的短链,我们可以将 short_url 作为唯一索引,这样就能保证唯一性,如果插入报错,则可以简单在长链后面拼个随机数,重新进行hash,直到生成一个未使用的短链为止,这样就能避免重复了。还可以引入缓存,比如我们双十一做了一个营销活动,给很多用户推送了短信,此时肯定会有很多用户访问这个短信内的短链,此时我们就可以将短链相关信息放在缓存中,不需要查数据库,利用缓存提高性能。还有一些二维码,如果 url 太长,生成的码也会比较复杂,比较难扫。

2025-03-18 21:22:24 1138

原创 什么是 Seata? Seata 支持哪些模式的分布式事务?

以上操作全部在一个数据库事务内完成,这样保证了一阶段操作的原子性。二阶段正常提交:因为数据库操作没有异常,无需回滚“业务 SQL”在一阶段已经提交至数据库,所以Seata框架只需将一阶段保存的undo_log快照数据和行锁删掉,完成数据清理即可异常情况 需回滚回滚方式是用“before image”还原业务数据。

2025-03-17 13:12:24 947

原创 PostgreSQL教程(二)九大类型

本质上JSON格式就是一个字符串,比如MySQL5.7不支持JSON的情况的下,使用text也可以,但是字符串类型无法校验JSON的格式,其次单独的字符串没有办法只获取JSON中某个key对应的value。PGSQL支持IP类型的存储,支持IPv4,IPv6这种,甚至Mac内种诡异类型也支持,这种IP类型,可以在存储IP时,帮助做校验,其次也可以针对IP做。枚举类型MySQL也支持,只是没怎么用,PGSQL同样支持这种数据类型,可以声明枚举类型作为表中的字段类型,这样可以无形的给表字段追加诡异的规范。

2025-03-16 12:31:33 820

原创 学习抢票下单流程设计与优化

对于一个热门的抢购项目,用户的基本访问链路为:项目列表/收藏 ==> 商品详情 ==> 选中对应的场次以及票种 ==> 结算页补充下单信息 ==> 下单。在上述链路中,其中项目列表以及商详基本都是一些固定信息(商详页面的是否售完,用户也可以接受短期的延迟),所以这部分流程基本可以**通过缓存**去做处理而大部分用户在结算页补充完个人信息之后,会对于创单接口进行多次且频繁的访问。**下单接口流量大、实时性要求高**,且直接影响交易收入转化,所以保障下单接口稳定很重要。

2025-03-14 17:55:02 857

原创 分布式ID介绍及实现方案总结

分布式 ID 指的是 分布式系统下的 ID,属于计算机系统中的一个概念。这个一般在分库分表场景,有分布式 ID 的需求,因为需要有一个唯一标识来标记一个订单或者其他类似的数据等。项目上线后,随着使用人数越来越多,整个系统的数据量将越来越大。单机 MySQL 已经没办法支撑了,需要进行分库分表(推荐 Sharding-JDBC)在分库之后,数据遍布在不同服务器上的数据库,数据库的自增主键已经没办法满足生成的主键唯一了。这个时候就需要生成了。:ID 的全局唯一性肯定是首先要满足的!

2025-03-13 09:34:20 1230

原创 ElasticSearch入门及安装 ( 一 )

ElasticSearch(简称ES)是一个开源的分布式搜索和数据分析引擎,用Java开发并且是当前最流行的开源的企业级搜索引擎,能够达到近实时搜索,它专门设计用于处理大规模的文本数据和实现高性能的全文检索。Elastic Stack由Logstash、Beats、ElasticSearch和Kibana 四大核心产品组成,在数据采集、存储、分析及数据可视化方面有着无可比拟的优势。作为Elastic Stack的基石,Elasticsearch是一个高度可扩展的开源全文搜索与分析引擎。

2025-03-12 13:52:42 1531

原创 Spring MVC 工作原理和流程

这个组件是整个MVC的核心调度组件,所有请求都经过它的处理和分发。前端调度器接受到调用链,会先执行调用链中的拦截器方法,然后。如果是前后端不分离的,那么就先将响应数据传递到视图解析器。层哪个具体的方法执行,将处理链返回,处理链中包括拦截器。返回JSON数据给前端,就不需要视图解析器!作用就是处理请求参数和响应数据,转化和封装。,这里如果有拦截器,还会执行它的后置方法。,即Controller的具体方法中,如果是前后端分离项目,后端直接通过。对传统的MVC做了扩展,将。解析视图,呈现数据给用户。

2025-03-11 12:15:01 640 1

原创 GitLab版本控制-分支(详解)

是将一系列提交按照原有次序依次应用到另一分支上,而。

2025-03-10 17:44:15 1297

原创 PostgreSQL教程(一)入门介绍

PostgreSQL 是一个功能强大的开源关系型数据库系统,它使用并扩展了 SQL 语言,并结合了许多功能,可以安全地存储和扩展复杂的数据工作PostgreSQL 因其经过验证的架构、可靠性、数据完整性、强大的功能集、可扩展性以及软件背后的开源社区始终如一地提供高性能和创新解决方案的奉献精神而赢得了良好的声誉。PostgreSQL 可在所有主要操作系统上运行,自 2001 年以来一直符合ACID,并且具有强大的附加组件,例如流行的PostGIS地理空间数据库扩展器。为什么使用 PostgreSQL?

2025-03-08 11:38:36 1191

原创 一文带你理解DDD邻域驱动设计

就拿 开公司 来举例吧领域就像公司的行业,决定了公司所从事的核心业务限界上下文是公司内部的各个部门,每个部门有独立的职责和规则实体是公司中的员工,具有唯一标识和生命周期值对象是员工的地址或电话等属性,只有值的意义,没有独立的身份聚合是部门,由多个实体和值对象组成聚合根(如部门经理)是部门的入口,确保部门内部的一致性领域服务则是跨部门的职能服务,比如 HR 或 IT 服务,为各部门提供支持和协作。不拘于形式(有点类似电影里的,剑客最高的境界是身边无剑,但是任何所见皆可为剑的感觉)。

2025-03-07 22:30:35 1815

原创 ConcurrentHashMap实现原理

数组,而个 HashEntry 内部是一个链表结构的元素,其实就相当于分配了一些segment,每个segment里面存了一个hashmap。可以看到,图上我们有6个 Segment,那么等于有六把锁,因此共可以有六个线程同时操作这个ConcurrentHashMap,并发度就是6。然后,遍历桶中的数据,并替换或新增节点到桶中,最后再判断是否需要转为红黑树,这样就能保证并发访问时的线程安全了。,然后把 HashMap 数组的每个结点都加了锁,这样扩容了锁也会变多,并发度也会增加。

2025-03-06 21:25:26 1172

原创 打卡1-力扣hot100 思路

if(k > 0 && nums[k] == nums[k - 1]) //跳过重复元素,因为前一个数已经判断过了。for(List<String> group: cnt.values()){ //直接遍历map的value。maxAreaWork(height, i, j-1) //如果左边>右边,递归左边,右边-1。cnt.containsKey(tmp)){ //如果hashmap中不包含该字符串。if (nums[i] == nums[i - 1] + 1) { //如果满足连续。

2025-03-04 19:20:48 850

原创 JVM内存结构( 简单易懂 )

区域分配,在垃圾回收后,如果对象还存活,则会进入 S0 或者 S1,并且随着垃圾回收的次数,对象的年龄会加 1,当它的年龄增加到一定程度(默认为 15 岁),就会被晋升到老年代中。虚拟机栈是 JVM 运行时数据区域的一个核心,除了一些 Native 方法调用是通过本地方法栈实现的,其他的 Java 方法调用都是通过栈来实现的。当栈的内存大小不允许动态扩展,那么当线程请求栈的深度超过当前 Java 虚拟机栈的最大深度的时候,抛出。方法调用的数据需要通过栈进行传递,每一次方法调用都有一个对应的。

2025-03-02 11:31:21 788

原创 JAVA中23种设计模式(详解)

单例模式(Singleton Pattern) 就是一个类只能有一个实例,它主要用于资源管理(避免资源冲突)保证全局唯一的场景。具体使用场景配置管理基本上应用都会有一个全局配置,这个配置从理论上来说需要保证唯一性,确保读取到的配置是同一份,是一致的,所以天然适合单例实现。连接池、线程池池化资源需要保证唯一性,不然就没有池化的意义了,总不能每次访问池化资源都新建一个吧?需要保持单例,控制具体池化资源的数量,便于管理和监控。还有日志、缓存等需要全局唯一避免资源冲突的场景。

2025-02-28 11:58:13 898

原创 Java并发 ThreadLocal 原理(详解)

比如 Tomcat 的线程池处理了一堆请求,而线程池中的线程一般是不会被清理掉的,所以这个引用链就会一直在,那么 ThreadLocal 对象即使没有用了,也会随着线程的存在,而一直存在着。对象作为键都会 计算得到一个hash值,然后和hashMap一样,计算得到entry数组内的一个下标,去查找这个threadLocal对象。实例被不再需要的线程持有为强引用,那么当该线程结束时,相关的 ThreadLocal实例。当然,这种数组操作一般免不了阈值的判断,如果超过阈值则需要进行扩容。

2025-02-23 20:49:31 1360

原创 RabbitMQ 消息队列的工作模式

RabbitMQ 提供了多种工作模式,按照官网的描述,实际上可以分为七种模式。

2025-02-20 14:12:33 792

原创 Docker常用命令

root@localhost ~] docker run -it --name=myub ubuntu bash #bash命令启动了Bash shell,允许与容器内部进行交互。使用 exec 重新进入容器,会打开新终端,开启新的进程,使用 exit 不会导致容器的停止,使用 exec 重新进入容器,会打开新终端,开启新的进程,使用 exit 不会导致容器的停止,attach 不会开启新的进程,exit 会导致容器的停止!attach 不会开启新的进程,exit 会导致容器的停止!

2025-02-19 16:22:06 761

原创 Java中CompletableFuture异步工具类

实际项目中,一个接口可能需要同时获取多种不同的数据,然后再汇总返回,举个例子:用户请求获取订单信息,可能需要同时获取用户信息、商品详情、物流信息、等数据。如果是串行(按顺序依次执行每个任务)执行的话,接口的响应速度会非常慢。考虑到这些任务之间有大部分都是的,可以,就比如说调用获取商品详情的时候,可以同时调用获取物流信息。通过并行执行多个任务的方式,接口的响应速度会得到大幅优化。Future介绍。

2025-02-17 21:32:06 1018

原创 Spring和SpringBoot注解大全(超详细)

注解大全

2025-02-16 20:49:11 1597 4

原创 Java 的 synchronized 底层原理

如果该对象的锁计数器为 0 ,则尚未被其他线程持有,则当前线程可以成功获取锁,计数器+1,从而实现可重入性,并继续执行同步代码块。偏向锁: 当一个线程第一次获取锁时,JVM 会将该线程标记为“ 偏向 ”状态,后续若该线程再获取该锁,无需进行额外同步过程。释放锁时同理,可重入锁的,每一次退出方法,就会将status减1,直至status的值为0,最后释放该锁。重量级锁: 当 CAS 失败无法获取锁,锁会升级为重量级锁,线程会被挂起,直到锁被释放。如果锁已被其他线程持有,则当前线程将会被阻塞,直到锁被释放。

2025-02-15 09:36:54 1036

原创 JAVA并发编程中AQS是什么?

/独占方式。尝试获取资源,成功则返回true,失败则返回false。//独占方式。尝试释放资源,成功则返回true,失败则返回false。//共享方式。尝试获取资源。负数表示失败;0表示成功,但没有剩余可用资源;正数表示成功,且有剩余资源。//共享方式。尝试释放资源,成功则返回true,失败则返回false。//该线程是否正在独占资源。只有用到condition才需要去实现它。

2025-02-10 14:59:32 1071

空空如也

空空如也

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

TA关注的人

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