自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Docker 网络

我们之前说了,docker容器的ip可能随着启动和停止导致ip发生变化,我们在连接服务应该写死服务名而不能写死ip。在docker 当中默认的桥接模式我们使用ping安装地址去ping是可以的,但是使用服务名就不行。下面我们创建一个自定义的网络,使用如下命令。

2023-07-30 15:01:01 1027 3

原创 浅谈RPC协议

远程过程调用协议,目标就是让远程服务调用更加简单、透明。RPC 框架负责屏蔽底层的传输方式(TCP 或者 UDP)、序列化方式(XML/Json/ 二进制)和通信细节,服务调用者可以像调用本地接口一样调用远程的服务提供的接口,而不需要关心底层通信细节和调用过程。其大致过程如上图所示。

2023-07-08 16:17:21 1786 2

原创 Golang当中的定时器

在平时写代码的时候,我们经常会遇到在将来某个时间点或者间隔一段时间重复执行函数。这个时候我们就可以考虑使用定时器。本片文章主要介绍一下golang当中的几个常用的定时器。以及和的基本使用。

2023-05-05 17:11:07 4660 3

原创 MySQL性能优化之(explain)工具

在MySQL当中,我们有时候写的SQL执行效率太慢此时我们需要将其优化。但是SQL可能非常的多,难道我们一条一条的进行查看吗?在MySQL当当中我们可以查看慢查询日志,看看那些SQL这么慢。但是这个默认情况下这个慢查询日志是关闭的,我们可以通过一下命令进行查看我们可以将其开启并且通过上面我们也可以看到慢查询日志在那个路径下。然后了我们可以设置一个业务可以接受的时间,执行时间超过这个值的SQL都将被记录在慢查询日志里面同时我们也可以查看一下这个系统当中有多少条这个慢查询日志。下面我们来建一张表。

2023-05-01 19:45:41 1498 4

原创 Redis分布式锁

Redlock算法的基本思路,是让客户端和多个独立的Redis实例依次请求加锁,如果客户端能够和半数以上的实例成功地完成加锁操作,那么我们就认为,客户端成功地获得分布式锁了,否则加锁失败。普通的主从模式,当master崩溃时,需要手动切换让slave成为master,使用主从+哨兵结合的好处在于,当master异常宕机时,哨兵可以实现故障自动切换,把slave提升为新的master,继续提供服务,以此保证可用性。到这里我们的redis分布式锁就差不多了,但是我们没有解决则个锁的可重入性问题。

2023-04-30 21:13:14 1153 2

原创 Redis源码分析之网络模型

而下面的代码时这个读取客户端的数据上面,并进行解码。,将客户端的数据读取上来之后我们还需要对这个decode进行解码,如果客户端的数据很大那么无疑这两部是非常耗时的肯定会导致这个Redis的效率下降。在main线程没有给每个线程的队列当中分配client时,其他线程一直在死循环的空转,并且不会让出CPU,直到main线程给他分配了client之后开始根据时读事情还是写事件执行对应的回调。当中,并设置当连接到来时需要执行的回调,当事情到来时只需要调用对应的回调即可,而这个监听套接字对应的回调是这个。

2023-04-22 15:28:15 944 4

原创 Redis主从复制

同时由于主节点可以写,数据会发生变化,当主节点的数据发生变化时,会将变化的数据同步给从节点,这样从节点的数据就可以和主节点的数据保持一致了。一个主节点可以有多个从节点,但是一个从节点会只会有一个主节点,也就是所谓的一主多从结构。会以每秒一次的频率向被升级的从节点发送 INFO 命令(没进行故障转移之前,INFO 命令的频率是每十秒一次),并观察命令回复中的角色信息,当被升级节点的角色信息从原来的 slave 变为 master 时,哨兵 leader 就知道被选中的从节点已经顺利升级为主节点了。

2023-04-17 21:29:14 1273 8

原创 MySQL主从复制

在实际生产环境中,如果对mysql数据库的读和写都在一台数据库服务器中操作,无论是在安全性、高可用性,还是高并发等各个方面都是不能满足实际需求的,一般要通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。(sql从线程)处理该过程的最后一步,sql线程从中继日志中读取事件,并重放其中的事件而更新slave机器的数据,使其与master的数据一致。当主库进行更新的时候,会自动将数据复制到从库中,而我们在客户端读取数据的时候,会从从库中进行读取。这是一开始的状态,下面我们在主库建一个表。

2023-04-15 22:57:07 668 2

原创 MySQL事物(基础篇)

然后根据 ReadView机制,发现该行数据的trx_id=10,小于事务 A 的 ReadView 里 up_limit_id,这表示这条数据是事务 A 开启之前,其他事务就已经提交了的数据,因此事务 A 可以读取到。对该记录每次更新后,都会将旧值放到一条 undo日志 中,就算是该记录的一个旧版本,随着更新次数的增多,所有的版本都会被 roll_pointer 属性连接成一个链表,我们把这个链表称之为 版本链 ,版本链的头节点就是当前记录最新的值。我们发现这样也出现了这个幻读。,事务id是递增分配的。

2023-04-14 09:40:12 556 2

原创 redis五大基本数据类型之(源码分析)

在redis6当中这个数据类型的编码主要是而在redis7当中的物理编码对应是。

2023-04-12 19:35:48 753 4

原创 Redis当中的大Key如何进行处理

很多铁子可能会认为大key,是这个key的值很大其实不是,而是key的value值很大一般对于下面这些我们可以称为大key.String 类型值大于10KB。Hash、List、Set、Zset类型元素个数超过5000个。

2023-04-02 14:29:51 2127 1

原创 Redis进阶之事物&持久化

Redis的基本事务(basic transaction)需要用到MULTI命令和EXEC命令,这种事务可以让一个客户端在不被其他客户端打断的情况下执行多个命令。和关系数据库那种可以在执行的过程中进行回滚(rollback)的事务不同,在Redis里面,被MULTI命令和EXEC命令包围的所有命令会一个接一个地执行,直到所有命令都执行完毕为止。当一个事务执行完毕之后,Redis才会处理其他客户端的命令。Redis事务在执行的中途遇到错误。

2023-03-05 22:33:34 1435 5

原创 Golang协程常见面试题

有缓冲的channel当容量没有达到上限时写入不会阻塞在这里奇数协程的channel容量为1我们提前给他写入了一个数据因此当偶数和奇数协程都开始读取数据时,首先读取到数据的是奇数协程,奇数协程打印完之后在通知偶数协程打印,偶数协程打印完成之后在通知奇数协程重复下去就实现了交替打印的效果。在这里需要注意的点是我们需要close掉这个管道当达到临界值时,主协程退出但是defer方法会执行这个时候管道一关闭所有协程都会收到退出信号,另外两个阻塞在那里的协程就会退出这样就没有这个协程泄漏了。废话不多说直接上代码。

2023-02-25 16:33:10 1045 2

原创 Go入门之Gorm 框架

gorm是Golang语言中一款性能极好的ORM库,对开发人员相对是比较友好的。当然还有另外一个xorm库也是比较出名的,感兴趣的也可以看看这个库,接下来主要介绍下gorm库的一些基本使用。下面我们一起看看如何安装这个gorm框架,然后快速的把它使用起来//安装MySQL驱动 go get - u gorm . io / driver / mysql go get - u github . com / jinzhu / gorm。

2023-02-19 23:46:54 9558 1

原创 Go语言Web入门之浅谈Gin框架

Gin 是一个用 Go (Golang) 编写的 web 框架。它是一个类似于 martini 但拥有更好性能的 API 框架,由于 httprouter,速度提高了近 40 倍。Gin在GitHub上已经有47k的star,它和Golang的语法一样简洁明了,使得初学者得以迅速入门。只需要在终端上输入以下命令就可以将使用gin框架了。

2023-02-19 14:45:12 7164 1

原创 浅谈Redis之Redis入门(初学者必备)

Redis,英文全称是Remote Dictionary Server(远程字典服务),是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。与MySQL数据库不同的是Redis的数据是存在内存中的。它的读写速度非常快,每秒可以处理超过10万次读写操作。因此redis被广泛应用于缓存,另外,Redis也经常用来做分布式锁。除此之外,Redis支持事务、持久化、LUA 脚本、LRU 驱动事件、多种集群方案。

2023-02-06 08:33:13 6379 3

原创 Docker进阶(中)

docker容器在产生数据的时候,如果不通过docker commit生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除之后,数据自然而然的也会消失。所有的docker镜像都起始于一个基础镜像层,当进行修改或者增加新的内容时,就会在当前镜像层之上,创建新的镜像层。比如有多个镜像都从相同的Base镜像构建而来,那么宿主机只需要在磁盘上保留一份base镜像,同时内存中也只需要加载一份base镜像,这样就可以为所有容器提供服务了,而且镜像的每一层都可以被共享。我们上面的案例默认是这个可读可写的。

2023-01-02 23:22:06 549 4

原创 go语言并发编程(中)

再这里再次强调一下这个需要注意的是读写锁非常适合读多写少的场景,如果读和写的操作差别不大,读写锁的优势就发挥不出来。现在我们知道了,Tick,Sleep,包括time.After函数,都使用的timer结构体,都会被放在同一个协程中统一处理,这样看起来使用Tick,Sleep并没有什么区别。本文使⽤Go语⾔实现并发的协程调度池阉割版,本⽂主要介绍协程池的基本设计思路,⽬的为深⼊浅出快速了解协程池⼯作原理,与真实的企业协程池还有很⼤差距,本⽂仅供学习参考。下面我们通过一个案例演示一下这个读写锁的使用。

2022-12-19 18:47:00 703 6

原创 Docker入门(基础篇)

说白了镜像就等于一个centos系统的安装程序,一个镜像只是一个只读环境而已,这个镜像提供的是基础的运行环境,而你在Centos7系统中安装的应用,比如Redis,Mysql这些应用就相当于一个容器,这些容器都是单独可运行的,仓库的概念就更好理解了,在Centos7系统中下载的所有应用都被收集到同一个仓库里了,比如Maven仓库。3.特点 : Docker镜像是不能运行的,是静态的,而Docker容器是运行的,是动态的,可以将Docker容器想像成一个简化版的操作系统和一些核心基础的应用。

2022-12-16 14:41:08 7957 7

原创 高楼扔鸡蛋问题

1.对应letecode链接高楼扔鸡蛋问题2.题目描述解题思路在这里需要注意的是如果鸡蛋没碎那么这个第i层我们可以将其当中这个第0层。下面我们来看看这个代码如何来书写。但是这样很暴力即使我们加了这个记忆化搜索我们也过不了。下面我们看看这个记忆化搜索的代码如何实现。下面我们来看看这个方法二:方法二有点偏数学方法,非常的难想到利用函数单调性进行二分。并不是像刚才那样一层楼一层楼的进行枚举,把枚举的过程做了一点优化。我们可以看到dp(K,N)他只依赖这个。dp(K-1,i-1)和这个dp(K,N-

2022-12-03 16:43:05 818 1

原创 MySQL索引

什么是索引?索引其实就是一个数据结构。当表中的数据量到达几十万甚至上百万的时候,SQL查询所花费的时间会很长,导致业务超时出错,此时就需要用索引来加速SQL查询。由于索引也是需要存储成索引文件的,因此对索引的使用也会涉及磁盘I/O操作。如果索引创建过多,使用不当,会造成SQL查询时,进行大量无用的磁盘I/O操作,降低了SQL的查询效率,适得其反,因此掌握良好的索引创建原则非常重要。索引是创建在表上的,是对数据库表中一列或者多列的值进行排序的一种结果。索引的核心是提高查询的速度!物理上(聚集索引&非聚集索

2022-11-18 09:05:17 1263 7

原创 LeteCode第319场周赛

解题思路本题,我们可以使用这个层序遍历拿到没一层的数据,然后我们求每一层需要多少次。什么意思了就是我们拿到的每一层的值有可能很大但是我们可以将其转换为再这个数组中的排名。本题的解决思路也非常的简单,我们一看这个数据量的范围非常的小。本题的解题思路需要用到之前一个经典的问题最长回文字串,我们需要生成一张dp表表示[L…这样我们就将这个很大的数组转换成为了这个再排序好的对应的下标,有了这个就好办了。可能性1: i位置不再回文区域里面那么此时f[i]=f[i-1].这个容易。本题解题思路非常的简单直接返回即可。

2022-11-13 16:04:02 335 5

原创 c++11高级用法(建议收藏)

2.会导致资源延迟释放weak_ptr 会保持控制块(强引用, 以及弱引用的信息)的生命周期, 而因此连带着保持了对象分配的内存, 只有最后一个 weak_ptr 离开作用域时, 内存才会被释放. 原本强引用减为 0 时就可以释放的内存, 现在变为了强引用, 弱引用都减为 0 时才能释放, 意外的延迟了内存释放的时间. 这对于内存要求高的场景来说, 是一个需要注意的问题.我们再前面说过这个这个创建一个线程之后,创建它的这个线程需要调用join方法进行等待,对线程资源进行回收此时这个线程也会被阻塞再这里。

2022-11-12 19:59:15 1256 3

原创 室友打了一晚上游戏我学会了使用GDB调试

run:简记为 r ,其作用是运行程序,当遇到断点后,程序会在断点处停止运行,等待用户输入下一步的命令。continue (简写c ):继续执行,到下一个断点处(或运行结束)next:(简写 n),单步跟踪程序,当遇到函数调用时,也不进入此函数体;此命令同 step 的主要区别是,step 遇到用户自定义的函数,将步进到函数中去运行,而 next 则直接调用函数,不会进入到函数体内。step (简写s):单步调试如果有函数调用,则进入函数;与命令n不同,n是不进入调用的函数的。

2022-11-10 22:43:13 12053 12

原创 一文带你精通Git

博主之前直接已经写过了git的相关基础博客了,老铁可以自行去查看。本篇文章的目录是为了深入的学习git,关于git的基础部分我们可以我们之前在学习git的时候开始重点学习的是暂存区、版本库.下面我们来学习一下git对象是什么。Git 的核心部分是一个简单的键值对数据库。你可以向该数据库插入任意类型的内容,它会返回一个键值,通过该键值可以在任意时刻再次检索该内容。下面我们新建一个目录Test,并打开git Bash输入这个gitinit命令。我们交给git管理的文件都放到了这个目录里面。下面我们来看一条

2022-11-08 21:13:48 8095

原创 有营养的算法笔记(八)

1.题目描述2.解题思路3.对应代码数字转换1.题目描述2.解题思路3.对应代码K递增子序列1.对应letecode链接2.题目描述3.解题思路4.对应代码思考?如果从非递减改成严格递增此时又该怎么做?举个例子,现在每 k 个数选一个数,假设选出来的数组是 [3,2,4,5,5,6,6]。每个数减去其下标后就是 [3,1,2,2,1,1,0]。对这个数组中的正整数求最长非降子序列,那就是 [1,1,1]了,对应原始数组的 [,2,,,5,6,],这三个数字保留,其余数字修改完成后就是 [1,2

2022-10-28 22:27:32 1487 1

原创 验证回文串问题带你轻松学会

那么我们就要想了,如果我们求出这个字符串的最长回文子序列,此时这个字符串想要变成回文串就必须把最长回文子序列之外的字符给删除掉。因此我们只需要求出字符串最长回文子序列然后用字符串的长度减去最长回文子序列看看这个值是不是小于等于k即可。那么下面的任务就是怎么求最长回文子序列的问题了。最长回文子序列是典型的范围尝试模型。本题思路还是很简单的,首先一样的我们定义一个指针指向字符串的开头位置定义一个指针指向字符串的结尾位置。可能性3:最长回文子序列既以L开头又以R结尾此时必须要L位置的字符要和R位置的字符相等。

2022-10-27 20:16:44 549 3

原创 Go语言GC机制超详细

什么是GC?他的英文全称(英语:Garbage Collection,缩写为GC),在计算机科学中是一种自动的存储器管理机制。当一个计算机上的动态存储器不再需要时,就应该予以释放,以让出存储器,这种存储器资源管理,称为垃圾回收。垃圾回收器可以让程序员减轻许多负担,也减少程序员犯错的机会(-----来自维基百科)简单地说,垃圾回收(GC)是在后台运行一个守护线程,它的作用是在监控各个对象的状态,识别并且丢弃不再使用的对象来释放和重用资源。

2022-10-27 14:34:46 5598 9

原创 go语言并发编程(上)

下面我们来解释一下MPG模式当中的M、P、G分别代表什么意思M:操作系统当中的线程(物理线程/内核线程)P:调度器负责调度协程,其维护了一个协程队列,M从P当中获取到协程并执行G:协程每个协程都有自己的栈空间定时器其模型大致如下图所示:在这里,我们看到2个线程(M),每个线程都有一个上下文(P),每个线程都运行一个goroutine(G)。灰色的goroutine尚未运行,但已准备好进行调度。它们被排列在称为运行队列的列表中。

2022-10-25 20:27:00 568 3

原创 有营养的算法笔记(七)

1.题目描述2.解题思路3.对应代码上面这个代码非常的暴力,就是所有的情况我们全部都尝试一遍。不断的更新答案,够暴力哈哈哈哈。4.方法二:贪心方法二就是贪心,怎么贪了就是我遇到ab或者ba我就把它给消除掉。所以了我们可以使用一个栈,每次遍历到一个字符的时候我们就去栈里面看看这个栈里面的字符能否和我组成ba或者是ab如果能我们将栈里面的元素弹出即可。最后遍历栈里面的元素生成字符串返回即可,下面我们来看看如何来实现代码6.对应测试代码执行乘法的最大分数1.对应letecode链接2.题目描述3.解题思

2022-10-22 19:50:33 1704 6

原创 万字带你入门Go语言(建议收藏)

定义变量我们一般使用var关键字。具体格式为var 变量名字 变量类型。下面我们演示一个代码定义一个整型变量。var a int = 10 //注意如果定义的时候不给初始值系统会给这个默认值 fmt . Println(a) }注意在go语言当中如果定义了一个变量如果没用初始化,则变量默认为零值。所谓的零值也就是变量没有做初始化时系统默认设置的值。下面让我们看看基本数据类型不初始化系统会赋那些零值。在go语言当中如果定义变量时没有指定变量的类型,可以通过初始值推导出变量的类型。下面我看一下这个代码。

2022-10-21 22:59:07 2874 7

原创 有营养的算法笔记五

圆心所对应的角是直角三角形注意此时这个钝角三角形是以a作为开头的钝角三角形,所以我们只要看这个范围内点的个数有几个在利用排列组合就可以求出以a作为开头的钝角三角形的个数,同样的我们在求以b开头以d开头的情况下钝角三角形的数量就可以了。这条合法路径的代表,就是x, a, b, c, y所组成的集合,我们叫做代表集合如果从b到y,还有一条路径叫(b, a, c, x, y),那么(x, a, b, c, y)和(b, a, c, x, y)是同一个代表集合,返回这个无向图中所有合法路径的代表集合数量。

2022-10-20 14:53:40 2647 16

原创 有营养的算法笔记(六)

1.对应letecode链接喧闹和富有2.题目描述3.解题思路4.对应代码完成任务的天数1.本题为某家公司的笔试题再这里没有这个测试链接,再这里只给出解题思路和代码2.题目描述3.解题思路4.对应代码需要的面试官数量1.同样的本题是公司的笔试题,没有这个测试连接在这里给出解题思路和这个代码。2.题目描述3.解题思路4.对应代码

2022-10-08 21:30:27 1013 5

原创 有营养的算法笔记(四)

本题的解题思路也比较的容易想到,题目说的是再k进制下求1到m的当中1的数量但是要求1的数量必须要大于等于n,要我们找到最小的m让1到m当中1的数量要比n要大。这一看就是明显的二分。思路很简单,最重要的是k进制下1到m的数量该如何求,这个如果不是很明白的老铁可以去看我以前的博客,再这里就不重复进行赘述。按照题目的意思,如果我们将这颗二叉树的节点放到一个容器当中其实就是将这个容器里面的元素左移k元素然后再将上一层的父亲指针指向调整好的这一层,没一层都这么干。最后将根节点返回即可。1.对应letecode链接。

2022-10-07 20:22:55 610 3

原创 有营养的算法笔记(三)

1.对应letecode链接知晓秘密的专家2.题目描述3.解题思路4.对应代码魔法数组1.本题为美团的笔试题,所以了没有笔试链接。在这里只给出代码和思路。2.题目描述3.解题思路但是这样的时间复杂度是O(NN)的时间复杂度,每次更新都需要进行遍历才能更新完毕。其实这个枚举行为可以使用线段树进行优化将时间复杂度降低到O(NlogN).下面我们来看看使用线段树进行优化的版本对应总代码最近公共祖先IV1.对应letecode链接2.题目描述3.解题思路4.对应代码

2022-10-06 14:50:08 1171 1

原创 有营养的算法笔记(二)

1.本题为某公司的笔试题,所以没有这个测试链接。在这里只给出代码和思路。2.题目描述3.解题思路4.对应代码但是这样的方式是最暴力的所有节点都搞一遍时间复杂都有点高。下面我们来看看迪结特斯拉算法怎么来解这个题1.第一步和暴力解一样需要生成邻接表,并且需要求这个最小值这一步还是不变的2.准备一个优先级对象小根堆和一个visit数组标记某个节点是否从堆中弹出过,如果已经在堆当中弹出过再次弹出的时候直接忽略调因为第一次弹出的距离是最小的。3.一开始先将x这个节点加入到优先级队列当中加入的形式为Node类

2022-10-05 08:05:58 7926 10

原创 C++设计模式(建议收藏)

如果在多线程环境下线程一判断完这个_inst为空由于时间片的原因被切走了,此时线程二进来发现为空创建了对象,当线程一再次被切回来的时候,继续往下执行又创建了一份对象此时和我们预期的就不一样了。单例模式是指在内存当中只会创建一次对象的设计模式,有时候在一个程序当中多次使用一个对象并且作用相同时,此时如果创建多个对象是非常的浪费内存的,单例模式可以让对象在内存当中只被创建一份。单例模式在面试当中也是考察的非常多的一个设计模式,在面试当中需要我们掌握的是场景的两种一种是懒汉模式,一种是饿汉模式。

2022-10-04 08:36:11 1685 3

原创 有营养的算法笔记(一)

这个题了直接干就是了深度优先遍历,先遍历其孩子节点将其孩子节点处理完毕之后用一个容器保存好如果一个节点孩子节点被全部删除了,并且它自己也不是黑色节点那么这个节点给上层返回nullptr,否则这个更新这个节点的孩子节点并返回。最容易想到的就是遍历这个范围内的每一个数字,求每个数字当中二进制为1的数量如果数量等于target我们就累加答案。限制:0

2022-10-03 15:41:17 1788 7

原创 国庆弯道超车之最长递增子序列衍生的一类题

第一位的答案非常的明显第一问就是最长递减子序列的长度但不是严格递减的就是相等也算。一开始389了我们需要开一门大炮来拦截它那么这门大炮能够打的高度就变为了389,然后来了一个207、155此时这门大炮都能够拦截但是当来到300时这时候就拦截不了需要再开一门大炮来拦截了,这门大炮能够拦截的最大高度就是300了然后来到299这个300这门大炮可以拦截170也是300这么大炮可以拦截158也是这么大炮来拦截但是65这么大炮要交给能够拦截155的这么大炮了二不是158的,这样158的这么大炮就可以拦截的更多。

2022-10-03 11:15:26 1062 4

原创 国庆弯道超车(手写Muduo库剖析核心代码及编程思想)

Muduo库是陈硕老师个人编写的TCP网络编程库。博主出于学习的目的使用了C++11将陈硕老师的muduo库重构了一下,当然只是重构了其核心的思想。muduo库当中还有很多牛逼的实现个人现在能力有限只能看懂其主要的实现,后面能力提升了再写博客进行剖析。同时这篇博客的目的主要是为了剖析muduo库的核心代码梳理其代码的执行逻辑。这个了博主能力有限,可能写着写着就写出来了一些不知所云的东西,还请各位担待。如果有写错的地方请在下方留言指正。

2022-10-01 23:30:31 1738 6

空空如也

空空如也

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

TA关注的人

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