- 博客(1395)
- 资源 (282)
- 收藏
- 关注
转载 go语言中如何实现同步操作呢
sync.Cond和通道。通过比较它们的适用场景,读者可以更好地了解何时选择使用不同的同步方式。本文旨在帮助读者理解同步操作的重要性以及选择合适的同步机制来确保多个协程之间的正确协调和数据共享的一致性。同步操作在并发编程中起着关键的作用,用于确保协程之间的正确协调和共享数据的一致性。在选择同步操作的实现方式时,我们有两个常见选项:使用sync.Cond和通道。使用sync.Cond和通道的方式提供了更高级、更灵活的同步机制。sync.Cond允许协程等待特定条件的出现,通过WaitSignal和。
2023-05-28 08:30:51
325
转载 Excel文件 利用MySQL/Python 实现自动处理数据的功能
在没有服务器,以excel存储数据的情况下,同样可以利用SQL和python来做数据处理和分析,在遇到excel处理数据特别麻烦的时候可以选择上面的方案做处理,即可以锻炼自己的SQL和python编程的能力,又可以高效地解决问题。
2023-02-21 20:15:45
485
2
转载 MongoDB - 模式设计
同一个应用程序连接的数据库可以根据业务进行划分,也许可以将高价值的业务数据存储在 SSD 上,或者是使用 RAID10 进行存储,而低价值的数据可以存储在 RAID0 上。但是在更改时仅需修改一处地方,不需要担心破坏数据的完整性。同样的一致性问题在 MongoDB 拥有副本集时也会出现,副本节点的数据与主节点的数据总是会有时间差,高并发的请求同样存在读取到旧数据的风险。设计模式时最需要关注的就是数据库的读操作,在数据库运行过程中,应尽量减少查询的数量,这就需要在设计时确保一起查询的数据存储在同一个文档中。
2022-12-26 14:43:52
662
1
转载 玩转 Go 生态|Hertz WebSocket 扩展简析
WebSocket 是一种可以在单个 TCP 连接上进行全双工通信,位于 OSI 模型的应用层。WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。提供了的支持,参考库使用hijack的方式在 Hertz 进行了适配,用法和参数基本保持一致。
2022-12-15 15:17:38
1394
1
转载 [Go疑难杂症]为什么nil不等于nil
接口类型变量跟普通变量是有差异的,非空接口类型变量对应的底层结构是iface,空接口类型类型变量对应的底层结构是eface。iface中有两个跟类型相关的字段,一个表示的是接口的类型inter,一个表示的是变量实际类型_type。只有当接口变量的itab._type与 data 都为nil时,也就是实际类型和值都未被赋值前,才真正等于nil。
2022-10-27 15:25:11
888
1
转载 线上服务宕机,码农试用期被毕业,原因竟是给MySQL加个字段
适用范围:对表结构进行操作,比如create、drop、alter、rename、truncate等。
2022-10-11 10:03:15
796
1
原创 go gorm select * 优化
很多时候sql查询都不允许select * 出现要求指定列名,如果你是用gormv2 ,恭喜你可以使用QueryFields属性,如果是gormv1版本怎么样,难道要升级gormV2吗,这里提供种反射的实现,可能不是最优解,但只是一个方案。首先mysq建一个表。
2022-09-17 14:00:34
1635
1
转载 .Net Core&RabbitMQ死信队列
第一个消息的过期时间很长,而后续的消息的过期时间很短,后续的消息过期后不会立马删除,而是要等到第一个消息过期删除后才会被删除,那么对应延迟队列来说会有点问题,时间超出了设定的延迟时间。,提供延迟队列类型交换机,其不会根据第一个消息是否过期来判断,解决了如上提到的第一个没有过期,后续消息过期的场景,不会受消息先后顺序的影响,而是关注过期时间,先过期的先发送。为每个消息设置过期时间可能不符合一些特定的场景,当需要设定特定队列中的消息都是指定的过期时间时,可以为队列中的消息统一设置过期时间。...
2022-08-30 12:29:55
858
1
转载 c# 异步进阶————channel
该系列为异步编程的进阶篇,其实也不能这么讲。世界上本没有进阶篇,只能说是高级篇(高级篇不能说多高级,是对底层的封装的意思),只要是加深理解都是进阶。本章先介绍一下channel。
2022-08-30 11:13:42
1387
转载 go 操作 Excel
Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准。可以使用它来读取、写入由 Microsoft Excel™ 2007 及以上版本创建的电子表格文档。支持 XLAM / XLSM / XLSX / XLTM / XLTX 等多种文档格式,高度兼容带有样式、图片(表)、透视表、切片器等复杂组件的文档,并提供流式读写 API,用于处理包含大规模数据的工作簿。可应用于各类报表平台、云计算、边缘计算等系统。使用本类库要
2022-07-18 11:35:07
1371
1
转载 Redis 高可用篇:你管这叫 Sentinel 哨兵集群原理
我们知道「主从复制是高可用的基石」,从库宕机依然可以将请求发送给主库或者其他从库,但是 Master 宕机,只能响应读操作,写请求无法再执行。所以主从复制架构面临一个严峻问题,主库挂了,无法执行「写操作」,无法自动选择一个 Slave 切换为 Master,也就是无法故障自动切换。深夜与女朋友么么哒……(此处省略 10000 字),突然宕机,总不能提起裤子从床上爬起来手工进行主从切换,再通知其他程序员把地址重新改成新主库上线。如此一折腾自己已被女友切换成前男友了,万万使不得。所以我们必须有一个高可用的方案,
2022-07-13 16:41:52
1005
转载 Redis 高可用篇:你管这叫主从架构数据同步原理?
高可用有两个含义:一是数据尽量不丢失,二是服务尽可能提供服务。 AOF 和 RDB 保证了数据持久化尽量不丢失,而主从复制就是增加副本,一份数据保存到多个实例上。即使有一个实例宕机,其他实例依然可以提供服务。本篇主要带大家全方位吃透 Redis 高可用技术解决方案之一主从复制架构。本篇硬核,建议收藏慢慢品味,我相信读者朋友会有一个质的提升。如有错误还望纠正,谢谢。关注「码哥字节」设置「星标」第一时间接收优质文章,谢谢读者的支持。核心知识点既然一台宕机了无法提供服务,那多台呢?是不是就可以解决了。Redis
2022-07-13 16:16:17
1012
转载 Redis 日志篇:无畏宕机快速恢复的杀手锏
在《Redis 核心篇:唯快不破的秘密》中,「码哥」揭秘了 Redis 五大数据类型底层的数据结构、IO 模型、线程模型、渐进式 rehash 掌握了 Redis 快的本质原因。接着,在《Redis 日志篇:无畏宕机与快速恢复的杀手锏》中揭晓了当 Redis 发生宕机可以通过重新读取 RDB 快照和执行 AOF 日志实现快速恢复的高可用手段。高可用有两个含义:一是数据尽量不丢失,二是服务尽可能提供服务。 AOF 和 RDB 保证了数据持久化尽量不丢失,而主从复制就是增加副本,一份数据保存到多个实例上。即使有
2022-07-13 16:07:20
1181
转载 Redis 核心篇:唯快不破的秘密
学习一个技术,通常只接触了零散的技术点,没有在脑海里建立一个完整的知识框架和架构体系,没有系统观。这样会很吃力,而且会出现一看好像自己会,过后就忘记,一脸懵逼。跟着「码哥字节」一起吃透 Redis,深层次的掌握 Redis 核心原理以及实战技巧。一起搭建一套完整的知识框架,学会全局观去整理整个知识体系。系统观其实是至关重要的,从某种程度上说,在解决问题时,拥有了系统观,就意味着你能有依据、有章法地定位和解决问题。全景图可以围绕两个维度展开,分别是:应用维度:缓存使用、集群运用、数据结构的巧妙使用系统维度:可
2022-07-13 16:04:05
972
转载 Redis 内存优化神技,小内存保存大数据
我们应该从 Redis 是如何保存数据的原理展开,分析键值对的存储结构和原理。从而继续延展出每种数据类型底层的数据结构,针对不同场景使用更恰当的数据结构和编码实现更少的内存占用。为了保存数据, Redis 需要先申请内存,数据过期或者内存淘汰需要回收内存,从而拓展出内存碎片优化。最后,说下 key、value 使用规范和技巧、 Bitmap 等高阶数据类型,运用这些技巧巧妙解决有限内存去存储更多数据难题……这一套组合拳下来直接封神。具体详情,且看「码哥」一一道来。主要优化神技如下:在优化之前,我们先掌握 R
2022-07-13 12:13:54
1049
转载 Redis 实战篇:巧用数据类型实现亿级数据统计
在移动应用的业务场景中,我们需要保存这样的信息:一个 key 关联了一个数据集合,同时还要对集合中的数据进行统计排序。常见的场景如下:给一个 userId ,判断用户登陆状态;两亿用户最近 7 天的签到情况,统计 7 天内连续签到的用户总数;统计每天的新增与第二天的留存用户数;统计网站的对访客(Unique Visitor,UV)量最新评论列表根据播放量音乐榜单通常情况下,我们面临的用户数量以及访问量都是巨大的,比如百万、千万级别的用户数量,或者千万级别、甚至亿级别的访问信息。所以,我们必须要选择能够非常高
2022-07-13 12:07:36
1398
转载 Redis 很屌,不懂使用规范就糟蹋了
通过 Redis 为什么这么快?这篇文章我们知道 Redis 为了高性能和节省内存费劲心思。所以,只有规范的使用 Redis,才能实现高性能和节省内存,否则再屌的 Redis 也禁不起我们瞎折腾。Redis 使用规范围绕如下几个纬度展开:键值对使用规范;命令使用规范;数据保存规范;运维规范。有两点需要注意:好的 命名,才能提供可读性强、可维护性高的 key,便于定位问题和寻找数据。要避免出现 、选择高效的序列化和压缩、使用对象共享池、选择高效恰当的数据类型(可参考《Redis 实战篇:巧用数据类型实现亿级
2022-07-13 11:44:44
867
转载 Redis 实战篇:巧用 Bitmap 实现亿级海量数据统计
在移动应用的业务场景中,我们需要保存这样的信息:一个 key 关联了一个数据集合。常见的场景如下:给一个 userId ,判断用户登陆状态;显示用户某个月的签到次数和首次签到时间;两亿用户最近 7 天的签到情况,统计 7 天内连续签到的用户总数;通常情况下,我们面临的用户数量以及访问量都是巨大的,比如百万、千万级别的用户数量,或者千万级别、甚至亿级别的访问信息。所以,我们必须要选择能够非常高效地统计大量数据(例如亿级)的集合类型。如何选择合适的数据集合,我们首先要了解常用的统计模式,并运用合理的数据类型来解
2022-07-13 11:27:57
1065
转载 K8S Calico网络插件
0.前言参考文档:https://github.com/containernetworking/cniPod网络插件,为了实现Pod网络而需要的插件、组件。由于Kubernetes通过开放的CNI接口来允许插件的接入,所以它又称之为CNI网络插件。为了解决跨主机容器间通信问题,市面上存在很多解决方案,为了兼容和规范这些解决方案,Kubernetes仅设计了网络模型,却将Pod网络的实现交给了CNI网络插件,并允许网络插件通过标准的CNI(Container Network Interface,容器网
2022-05-25 11:06:36
9244
2
转载 go Http客户端
理解 timeouttimeout 又可以细分为 connect timeout、read timeout、write timeout。而 read timeout 和 write timeout 必须是在 connect 之后才能发生。ReadTimeout的时间计算是从连接被接受(accept)到request body完全被读取(如果你不读取body,那么时间截止到读完header为止) WriteTimeout的时间计算正常是从request header的读取结束开始,到response
2022-05-16 15:46:26
2683
原创 go 二维码解析推荐gozxing
生成二维码的开源项目可谓是琳琅满目,SwetakeQRCode、BarCode4j、Zxing,前端有JQuery-qrcode,同样能实现生成二维码。选择Zxing的原因可能是对 Google 公司的信赖和个人崇拜吧。参考:GitHub - makiuchi-d/gozxing: Port of ZXing (https://github.com/zxing/zxing) core to pure Go.package mainimport ( "fmt" "imag...
2022-05-07 18:18:18
1805
原创 go实现 银行卡Luhn校验
一、银行卡号码的校验规则银行卡号码的校验采用Luhn算法,校验过程大致如下:1. 从右到左给卡号字符串编号,最右边第一位是1,最右边第二位是2,最右边第三位是3….2. 从右向左遍历,对每一位字符t执行第三个步骤,并将每一位的计算结果相加得到一个数s。3. 对每一位的计算规则:如果这一位是奇数位,则返回t本身,如果是偶数位,则先将t乘以2得到一个数n,如果n是一位数(小于10),直接返回n,否则将n的个位数和十位数相加返回。4. 如果s能够整除10,则此号码有效,否则号码无效。因为最
2022-04-20 12:35:07
2150
转载 计算机网络-HTTP篇
HTTP的一些问题HTTP 基本概念HTTP 是超⽂本传输协议,也就是HyperText Transfer Protocol。HTTP 是⼀个在计算机世界⾥专⻔在「两点」之间「传输」⽂字、图⽚、⾳频、视频等「超⽂本」数据的「约定和规范」。常见状态码1xx1xx 类状态码属于提示信息,是协议处理中的⼀种中间状态,实际⽤到的⽐较少。2xx2xx 类状态码表示服务器成功处理了客户端的请求,也是我们最愿意看到的状态。「200 OK」是最常⻅的成功状态码,表示⼀切正常。如果是
2022-04-05 17:23:39
2484
转载 计算机网络-TCP篇
TCP篇基本认识TCP 是⾯向连接的(⼀定是「⼀对⼀」才能连接)、可靠的、基于字节流的传输层通信协议。RFC 793 是如何定义「连接」的:⽤于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括Socket、序列号和窗⼝⼤⼩称为连接。建⽴⼀个 TCP 连接是需要客户端与服务器端达成上述三个信息的共识。Socket:由 IP 地址和端⼝号组成序列号:⽤来解决乱序问题等窗⼝⼤⼩:⽤来做流量控制TCP 四元组可以唯⼀的确定⼀个连接,四元组包括如下:格式序列
2022-04-05 17:15:51
3511
转载 计算机网络-IP篇
IP基本认识IP 在 TCP/IP 参考模型中处于第三层,也就是⽹络层。⽹络层的主要作⽤是:实现主机与主机之间的通信,也叫点对点(end to end)通信。IP的作用就是在复杂的网络环境中将数据包发送给最终的目的主机。MAC 的作⽤则是实现「直连」的两个设备之间通信,⽽ IP 则负责在「没有直连」的两个⽹络之间进⾏通信输。源IP地址和⽬标IP地址在传输过程中是不会变化的,只有源 MAC 地址和⽬标MAC ⼀直在变化。IP地址IP 地址(IPv4 地址)由 32 位正整
2022-04-05 17:02:27
2241
转载 TCP 重传、滑动窗⼝、流量控制、拥塞控制
重传机制TCP 会在以下两种情况发⽣超时重传:数据包丢失 确认应答丢失重传超时重传超时是TCP协议保证数据可靠性的另一个重要机制,其原理是在发送某一个数据以后就开启一个计时器,在一定时间内如果没有得到发送的数据报的ACK报文,那么就重新发送数据,直到发送成功为止。RTT 是数据从⽹络⼀端传送到另⼀端所需的时间,也就是包的往返时间。RTO (Retransmission Timeout 超时重传时间)。如果超时重发的数据,再次超时的时候,⼜需要重传的时候,TCP 的策略是超时间
2022-04-05 16:13:48
2544
转载 HTTPS加密以及认证手段以及优化
HTTPSSSL即安全套接字层,SSL 在1999年被IETF(互联网工程组)更名为TLS,即传输安全层,直到现在,TLS 一共出现过三个版本,1.1、 1.2 和1.3,目前最广泛使用的是1.2,所以接下来的探讨都是基于TLS 1.2的版本上的。TLS用于两个通信应用程序之间提供保密性和数据完整性。TLS由 记录协议、握手协议、警告协议、变更密码规范协议、扩展协议等几个子协议组成,综合使用了对称加密、非对称加密、身份认证等许多密码学前沿技术。ECDHE - ECDSA-AES256-GC
2022-04-05 15:55:55
2119
转载 HTTP1.1、HTTP2、HTTP3 演变
推荐阅读:https://www.cnblogs.com/zwtblog/tag/计算机网络/HTTP 基本概念HyperText Transfer Protocol -- 超文本传输协议状态码分类:完整详情见:HTTP-完整状态码表 - ML李嘉图 - 博客园分类 分类描述 1** 信息,服务器收到请求,需要请求者继续执行操作 2** 成功,操作被成功接收并处理 3** 重定向,需要进一步的操作以完成请求 4** 客户端错误,请求包含语法错
2022-04-05 12:28:00
2026
原创 go smtp示例
书接上文邮件实现详解,这里我们及我们简单复习一下smtp的指令如下:telnet smtp.163.com 25[outpout]ehlo dz45693[outpout]auth login[outpout]输入用户名base64[outpout]输入密码base64mail from:<dz45693@163.com>[outpout]rcpt to:<dz45693@sina.com>[outpout]data[outpout]from:&l
2022-03-13 21:04:09
3716
转载 邮件实现详解
相信大家在日常工作生活中少不了和邮件打交道,比如我们会用邮件进行信息交流,向上级汇报日常工作;再比如大家熟悉的某个WEB系统注册阶段,通常会有一个功能,点击发送到目标邮箱的链接完成账户激活。但是邮件发送的原理是什么?邮件是如何发送的呢?本系列教程将会讲解邮件的基本常识与概念,邮件的协议以及邮件服务器的工作原理,然后用JavaMail 发送邮件的基本实现过程,邮件内嵌图片等高级邮件技巧。相信大家看完后,一定会有所收获。1、电子邮件的发送和接收过程 和以往博客一样,LZ这里先给出用户A从QQ邮箱发送邮
2022-03-12 22:19:10
13242
原创 go GCM加密解密 gin中间件加密解密,gin文件流处理
要给已有的系统启用加密解密,目前推荐的是aes的gcm模式的加密和解密,在微服务如果向前有公共方法处理 读取数据和写返回数据,那么比较简单,修改以前的公共方法,但是这样本地调试平时肯定是明文,所以要加判断,如果以前的读数据和写数据是五花八门那就比较麻烦,在微服务体系里面一般有网关这个服务,所以加密和解密就放在网关服务,大致如下:常规的请求有GET,POST JSON, POST file,以及POST Form表单,返回一般是json 或者下载文件流,所以我们需要截获请求流和返回流,收到请求流解密数
2022-03-10 22:21:51
3882
原创 Gin 通用的日志中间件
main.gopackage mainimport ( "demo/gindemo/middleware" "github.com/gin-gonic/gin" "net/http")func main() { // 1.创建路由 r := gin.Default() r.Use(middleware.Logger()) r.GET("/", func(c *gin.Context) { c.String(http.StatusOK, "hello World!")
2022-02-12 13:43:29
3514
1
原创 Go websocket 聊天室demo2
上文Go websocket 聊天室demo以及k8s 部署 后面有一个问题, 如果2个客服端 分别来链接到不同的服务 如何发布消息了?如图:cliant A ->ServerA ----推送消息到kafka---->推送消息到 服务A和B---->服务AB都去寻找自己的client集合------>发送消息给具体的客户端【有可能是广播 也可能是指定具体的用户】代码:package mainimport ( "context" "encoding/...
2022-01-09 16:25:06
3013
原创 Go websocket 聊天室demo以及k8s 部署
本来打算练习go websocket 做一个示例,结果在网上找了一个聊天室的示例【Go websocket 聊天室的详细实现和详细分析_上官二狗的博客-CSDN博客_go websocket 聊天室】,感觉不错就拿来用一下。介绍首先需要有一个客户端 client 的 manager ,manager 里应该保存所有的client 信息所以在我们的程序里定义了 ClientManager 这个结构体用 clients 这个 map 结构来保存所有的连接信息遍历 clients 通过使用 bro.
2022-01-09 09:32:28
2543
转载 RabbitMQ,RocketMQ,Kafka 事务性,消息丢失和消息重复发送的处理策略
消息队列常见问题处理分布式事务什么是分布式事务我们的服务器从单机发展到拥有多台机器的分布式系统,各个系统之前需要借助于网络进行通信,原有单机中相对可靠的方法调用以及进程间通信方式已经没有办法使用,同时网络环境也是不稳定的,造成了我们多个机器之间的数据同步问题,这就是典型的分布式事务问题。在分布式事务中事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。分布式事务就是要保证不同节点之间的数据一致性。常见的分布式事务解决方案1、2PC(二阶段提
2022-01-01 16:17:37
1723
原创 go redis 工具锁
redis经常用作分布式锁,这里记录一个简单的锁代码如下:package mainimport ( "crypto/rand" "encoding/base64" "fmt" "github.com/go-redis/redis" "io" "sync" "time")func main() { addr := "192.168.100.30:6379" rdb := redis.NewClient(&redis.Options{ Addr: addr,
2021-11-29 19:52:34
2966
转载 Kafka(Go)---Producer-Consumer API 基本使用
本文主要讲解其中的 Producer API 和 Consumer API 在 Go Client sarama 中的使基本使用以及注意事项。1. 概述Kakfa 相关代码见GithubKafka 有 5 个核心 API:Producer API Consumer API Stream API Connect API Admin API在 Go sarama 客户端中暂时只实现了 Producer、Consumer、Admin 3 个API。其中 Stream API .
2021-11-27 16:20:50
1836
转载 Go语言之 Context 实战与源码分析
本文主要简单介绍了Go语言(golang)中的context包。给出了context 的基本用法和使用建议,并从源码层面对其底层结构和具体实现原理进行分析。1. 概述以下分析基于 Go 1.17.11.1 什么是 Context上下文 context.Context在Go 语言中用来设置截止日期、同步信号,传递请求相关值的结构体。上下文与 Goroutine 有比较密切的关系,是 Go 语言中独特的设计,在其他编程语言中我们很少见到类似的概念。主要用于超时控制和多Goroutine间
2021-11-27 14:44:33
2393
转载 Redis Scan 原理解析与踩坑
主要分析了 Redis Scan 命令基本使用和具体实现,包括 Count 参数与 Scan 总耗时的关系,以及核心的逆二进制迭代算法分析。1. 概述由于 Redis 是单线程在处理用户的命令,而 Keys 命令会一次性遍历所有 Key,于是在 命令执行过程中,无法执行其他命令。这就导致如果 Redis 中的 key 比较多,那么 Keys 命令执行时间就会比较长,从而阻塞 Redis。所以很多教程都推荐使用 Scan 命令来代替 Keys,因为 Scan 可以限制每次遍历的 key 数量。
2021-11-27 13:35:35
7544
2
原创 golang 时间missing Location in call to Date
golang使用"Asia/Shanghai"时区转换时间格式报:missing Location in call to Date当然解决方法1是:time.FixedZone //os.Setenv("ZONEINFO","D:\\ProgramFiles\\Go\\lib\\time\\zoneinfo") loc, err := time.LoadLocation("Asia/Shanghai") //设置时区 if err != nil { loc = time.FixedZ
2021-11-19 12:21:25
2656
GO GPRC Redis ANS DES AES
2020-12-30
thinkphp.zip
2020-10-10
ServiceA.zip
2019-08-28
MongoDB权威指南xxxx.zip
2019-07-06
jira_7.3.6破解
2019-04-22
jdk-6u43-windows-i586
2019-04-22
asp.net core signalr DEMO
2019-04-12
TeamViewer13.2.14327 -无限制更换ID版
2019-04-05
SQL Prompt v9.0.10.4053
2019-03-18
redis-desktop-manager-0.8.8.384
2019-03-13
json class generator
2018-12-12
beego demo
2018-11-28
pima-indians-diabetes.data
2018-11-04
iris data csv 222
2018-10-27
iris data csv
2018-10-27
Scrapy爬网存mysql
2018-10-22
react redux
2018-10-05
react redux 开发实例
2018-09-26
React_Redux_Flux_webpack_Babel
2018-09-25
MySQL技术内幕:InnoDB存储引擎(第2版)
2018-03-26
TCP+IP详解卷1 :协议(原书第2版)
2018-03-04
HTTP权威指南
2018-01-11
《亿级流量网站架构核心技术》PDF下载 高清完整版
2018-01-08
大规模分布式存储系统
2018-01-04
atlassian extras 3.2
2017-09-30
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人