Redis
文章平均质量分 84
weixin_42073629
这个作者很懒,什么都没留下…
展开
-
SpringBoot 集成 RedisTemplate Cluster集群
RedisTemplate转载 2022-06-12 18:48:00 · 3473 阅读 · 0 评论 -
一键自动部署 Redis 任意版本
今天给大家分享一个超级实用的脚本,一键自动安装部署Redis的任意版本,记住是任意版本哦!脚本用法:chmod 755 redis-install.sh && sh redis-install.sh 4.0.10(后面跟的是你需要的版本号,需要什么版本就写什么版本),我这里安装的4.0.10具体脚本内容如下展示:#!/usr/bin/bash##redis任何版本全程自动化源码编译安装##用法:sh redis-install.sh 4.0.10(后面跟的是你需要的版...转载 2022-05-21 18:57:21 · 184 阅读 · 0 评论 -
RedisJson 横空出世
Redis官网给出了RedisJson(RedisSearch)的性能测试报告,可谓碾压其他NoSQL,下面是核心的报告内容,先上结论:对于隔离写入(isolated writes),RedisJSON 比 MongoDB 快 5.4 倍,比 ElasticSearch 快 200 倍以上。对于隔离读取(isolated reads),RedisJSON 比 MongoDB 快 12.7 倍,比 ElasticSearch 快 500 倍以上。在混合工作负载场景中,实时更新不会影响 Redi转载 2022-05-16 20:25:26 · 240 阅读 · 0 评论 -
Redis 官方可视化工具
RedisInsight 是一个直观高效的 Redis GUI 管理工具,它可以对 Redis 的内存、连接数、命中率以及正常运行时间进行监控,并且可以在界面上使用 CLI 和连接的 Redis 进行交互(RedisInsight 内置对 Redis 模块支持):https://docs.redis.com/latest/ri/RedisInsight 提供的功能: 唯一支持 Redis Cluster 的 GUI 工具; 可以基于 Browser 的界面来进行搜索键、查看和编辑转载 2022-05-16 20:14:28 · 228 阅读 · 0 评论 -
4种 Redis 集群方案对比
在服务开发中,单机都会存在单点故障的问题,及服务部署在一台服务器上,一旦服务器宕机服务就不可用,所以为了让服务高可用,分布式服务就出现了,将同一服务部署到多台机器上,即使其中几台服务器宕机,只要有一台服务器可用服务就可用。redis也是一样,为了解决单机故障引入了主从模式,但主从模式存在一个问题:master节点故障后服务,需要人为的手动将slave节点切换成为maser节点后服务才恢复。redis为解决这一问题又引入了哨兵模式,哨兵模式能在master节点故障后能自动将salve节点提升成master转载 2022-05-16 20:11:57 · 211 阅读 · 0 评论 -
Spring Boot + Redis 实现各种操作
一、Jedis,Redisson,Lettuce 三者的区别共同点:都提供了基于 Redis 操作的 Java API,只是封装程度,具体实现稍有不同。不同点: 1.1、Jedis 是 Redis 的 Java 实现的客户端。支持基本的数据类型如:String、Hash、List、Set、Sorted Set。特点:使用阻塞的 I/O,方法调用同步,程序流需要等到 socket 处理完 I/O 才能执行,不支持异步操作。Jedis 客户端实例不是线程安全的,需要通过连接池来使用 Jed转载 2022-05-16 20:05:59 · 278 阅读 · 0 评论 -
Redis 分布式锁原理与实战总结
Redis 分布式锁使用SET指令就可以实现了么?在分布式领域CAP理论一直存在。分布式锁的门道可没那么简单,我们在网上看到的分布式锁方案可能是有问题的。「楼仔」一步步带你深入分布式锁是如何一步步完善,在高并发生产环境中如何正确使用分布式锁。在进入正文之前,我们先带着问题去思考: 什么时候需要分布式锁? 加、解锁的代码位置有讲究么? 如何避免出现锁再也无法删除? 超时时间设置多少合适呢? 如何避免锁被其他线程释放 如何实现重入锁?...转载 2022-05-16 19:53:16 · 561 阅读 · 0 评论 -
Redis 16 个使用场景
常见的16种应用场景:缓存、数据共享分布式、分布式锁、全局 ID、计数器、限流、位统计、购物车、用户消息时间线 timeline、消息队列、抽奖、点赞、签到、打卡、商品标签、商品筛选、用户关注、推荐模型、排行榜.1、缓存String类型例如:热点数据缓存(例如报表、明星出轨),对象缓存、全页缓存、可以提升热点数据的访问数据。2、数据共享分布式String 类型,因为 Redis 是分布式的独立服务,可以在多个应用之间共享例如:分布式Session<dependen转载 2022-05-15 18:09:59 · 139 阅读 · 0 评论 -
ES+Redis+MySQL,高可用架构设计
背景会员系统是一种基础系统,跟公司所有业务线的下单主流程密切相关。如果会员系统出故障,会导致用户无法下单,影响范围是全公司所有业务线。所以,会员系统必须保证高性能、高可用,提供稳定、高效的基础服务。随着同程和艺龙两家公司的合并,越来越多的系统需要打通同程 APP、艺龙 APP、同程微信小程序、艺龙微信小程序等多平台会员体系。例如微信小程序的交叉营销,用户买了一张火车票,此时想给他发酒店红包,这就需要查询该用户的统一会员关系。因为火车票用的是同程会员体系,酒店用的是艺龙会员体系,只有查到对应的转载 2022-04-10 15:49:29 · 172 阅读 · 0 评论 -
Redis 布隆(Bloom Filter)过滤器
当你遇到数据量大,又需要去重的时候就可以考虑布隆过滤器,如下场景: 解决Redis 缓存穿透问题(面试重点); 邮件过滤,使用布隆过滤器实现邮件黑名单过滤; 爬虫爬过的网站过滤,爬过的网站不再爬取; 推荐过的新闻不再推荐; 什么是布隆过滤器布隆过滤器 (Bloom Filter)是由 Burton Howard Bloom 于 1970 年提出,它是一种 space efficient 的概率型数据结构,用于判断一个元素是否在集合中。当布隆过滤器说,某个数据.转载 2022-04-10 16:14:42 · 2034 阅读 · 0 评论 -
数据库和缓存双写一致性
前言数据库和缓存(比如:redis)双写数据一致性问题,是一个跟开发语言无关的公共问题。尤其在高并发的场景下,这个问题变得更加严重。我很负责的告诉大家,该问题无论在面试,还是工作中遇到的概率非常大,所以非常有必要跟大家一起探讨一下。今天这篇文章我会从浅入深,跟大家一起聊聊,数据库和缓存双写数据一致性问题常见的解决方案,这些方案中可能存在的坑,以及最优方案是什么。1. 常见方案通常情况下,我们使用缓存的主要目的是为了提升查询的性能。大多数情况下,我们是这样使用缓存的: 用户请求过转载 2022-04-10 14:09:28 · 243 阅读 · 0 评论 -
Redis 性能
我们有个这样的需求:每天每一个抢购商品只能买一次,并且全场抢购商品总购买次数不允许超过5次。那么,整个商品限购的流程大概如下图所示:那么,在每次购买成功商品成功后,发送的MQ大概是这样的(假设当前这笔订单有两件抢购商品):[{"orderId":"2020020622000001","orderTime":"1581001673012","productId":"599055114591","userId":"860000000000001","mer...原创 2021-09-04 18:51:03 · 187 阅读 · 0 评论 -
阿里推荐的Redis使用规范
一、键值设计1、key名设计可读性和可管理性以业务名(或数据库名)为前缀(防止key冲突),用冒号分隔,比如业务名:表名:id简洁性保证语义的前提下,控制key的长度,当key较多时,内存占用也不容忽视,例如:不要包含特殊字符反例:包含空格、换行、单双引号以及其他转义字符2、value设计拒绝bigkey防止网卡流量、慢查询,string类型控制在10KB以内,hash、list、set、zset元素个数不要超过5000。反例:一个包含200万个元素的li原创 2021-09-04 18:17:15 · 222 阅读 · 1 评论 -
实现延迟队列的4种方案
在我们日常生活中,我们可以发现: 在淘宝、京东等购物平台上下单,超过一定时间未付款,订单会自动取消。 打车的时候,在规定时间没有车主接单,平台会取消你的单并提醒你暂时没有车主接单。 点外卖的时候,如果商家在10分钟还没接单,就会自动取消订单。 收快递的时候,如果我们没有点确认收货,在一段时间后程序会自动完成订单。 在平台完成订单后,如果我们没有在规定时间评论商品,会自动默认买家不评论。 ....... 这时,我们可以想想为什么要这样做?因为这样原创 2021-06-03 21:43:43 · 4138 阅读 · 0 评论 -
Redis内存回收原理:LRU算法
Redis中采用两种算法进行内存回收,引用计数算法以及LRU算法,在操作系统内存管理一节中,我们都学习过LRU算法(最近最久未使用算法),那么什么是LRU算法呢LRU算法作为内存管理的一种有效算法,其含义是在内存有限的情况下,当内存容量不足时,为了保证程序的运行,这时就不得不淘汰内存中的一些对象,释放这些对象占用的空间,那么选择淘汰哪些对象呢?LRU算法就提供了一种策略,告诉我们选择最近一段时间内,最久未使用的对象将其淘汰,至于为什么要选择最久未使用的,可以想想,最近一段时间内使用的东西,我们是不是可能原创 2021-05-28 22:50:57 · 1301 阅读 · 0 评论 -
Redis的BitMap、Geo、HyperLogLog使用
前言Reids 在 Web 应用的开发中使用非常广泛,几乎所有的后端技术都会有涉及到 Redis 的使用。Redis 种除了常见的字符串 String、字典 Hash、列表 List、集合 Set、有序集合 SortedSet 等等之外,还有一些不常用的数据类型,这里着重介绍三个。下面话不多说了,来一起看看详细的介绍吧。BitMapBitMap 就是通过一个 bit 位来表示某个元素对应的值或者状态, 其中的 key 就是对应元素本身,实际上底层也是通过对字符串的操作来实现。Redis 从 2.原创 2021-05-27 01:37:07 · 131 阅读 · 0 评论 -
Redis持久化与复制
一、持久化1、RDBRDB.pngsave命令会阻塞当前redis服务,已经废弃。bgsave命令只有在fork子线程的时候阻塞。触发RDB的操作:手动执行bgsave命令;使用save相关配置,如“save m n”。表示m秒内数据集存在n次修改时,自动触发bgsave;如果从节点执行全量复制操作,主节点自动执行bgsave生成RDB文件并发送给从节点;默认情况下执行shutdown命令时,如果没有开启AOF持久化功能则自动执行bgsave;配置#设置目录.原创 2021-05-27 01:22:54 · 98 阅读 · 0 评论 -
Redis的内存优化2
一、redis内存1、内存占用info memoryinfo memory127.0.0.1:6379> info memory# Memoryused_memory:940008used_memory_human:917.98Kused_memory_rss:1540096used_memory_rss_human:1.47Mused_memory_peak:940008used_memory_peak_human:917.98Kused_memory_p.原创 2021-05-27 01:18:20 · 2278 阅读 · 0 评论 -
高可用Redis Sentinel哨兵
一、Redis SentinelRedis Sentinel是一个分布式架构(建议使用2.8以上版本),其中包含若干个Sentinel节点和Redis数据节点,每个Sentinel节点会对数据节点和其余Sentinel节点进行监控,当它发现节点不可达时,会对节点做下线标识。如果被标识的是主节点,它还会和其他Sentinel节点进行“协商”,当大多数Sentinel节点都认为主节点不可达时,它们会选举出一个Sentinel节点来完成自动故障转移的工作,同时会将这个变化实时通知给Redis应用方,从而实现真原创 2021-05-27 01:11:32 · 430 阅读 · 1 评论 -
集群Redis Cluster详解新
一、集群方案与分区1、一致性hash分区一致性哈希分区(Distributed Hash Table)实现思路是为系统中每个节点分配一个token,范围一般在0~232,这些token构成一个哈希环。数据读写执行节点查找操作时,先根据key计算hash值,然后顺时针找到第一个大于等于该哈希值的token节点。一致性hash这种方式相比节点取余最大的好处在于加入和删除节点只影响哈希环中相邻的节点,对其他节点无影响。为了保证数据和负载的均衡,通过虚拟槽分区,巧妙地使用了哈希空间,使.原创 2021-05-27 01:07:15 · 205 阅读 · 0 评论 -
集群Redis Cluster详解
1.为什么要实现Redis Cluster1.主从复制不能实现高可用2.随着公司发展,用户数量增多,并发越来越多,业务需要更高的QPS,而主从复制中单机的QPS可能无法满足业务需求3.数据量的考虑,现有服务器内存不能满足业务数据的需要时,单纯向服务器添加内存不能达到要求,此时需要考虑分布式需求,把数据分布到不同服务器上4.网络流量需求:业务的流量已经超过服务器的网卡的上限值,可以考虑使用分布式来进行分流5.离线计算,需要中间环节缓冲等别的需求2.数据分布2.1 为什么要做数据分布全原创 2021-05-27 01:06:00 · 238 阅读 · 0 评论 -
Redis的内存优化
Redis所有的数据都在内存中,而内存又是非常宝贵的资源。对于如何优化内存使用一直是Redis用户非常关注的问题。本文让我们深入到Redis细节中,学习内存优化的技巧。分为如下几个部分:一.redisObject对象二.缩减键值对象三.共享对象池四.字符串优化五.编码优化六.控制key的数量一. redisObject对象Redis存储的所有值对象在内部定义为redisObject结构体,内部结构如下图所示。Redis存储的数据都使用redisObject来封装,包括原创 2021-05-24 00:28:17 · 102 阅读 · 0 评论 -
Redis持久化详解
一、Redis高可用概述在介绍Redis高可用之前,先说明一下在Redis的语境中高可用的含义。我们知道,在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999% 等等)。但是在Redis语境中,高可用的含义似乎要宽泛一些,除了保证提供正常服务(如主从分离、快速容灾技术),还需要考虑数据容量的扩展、数据安全不会丢失等。在Redis中,实现高可用的技术主要包括持久化、复制、哨兵和集群,下面分别说明它们的作用,以及解决了原创 2021-05-24 00:28:01 · 98 阅读 · 0 评论 -
Redis配置文件示例与说明
一、Redis配置文件示例bind 127.0.0.1protected-mode yesport 6379tcp-backlog 511 #在高并发环境下需要调高该值避免客户端连接问题。该值受/proc/sys/net/core/somaxconn系统参数影响,需一起调整timeout 0 #客户端空闲时间达到多少秒就被关闭,0为不关闭tcp-keepalive 300supervised nopidfile /var/run/redis_6379.pidloglevel noti原创 2021-05-23 00:31:23 · 219 阅读 · 0 评论 -
vm.overcommit_memory内存分配控制
一、vm.overcommit_memory的作用Linux系统对大部分进行内存申请的程序都回复yes,以便能运行更多的程序。而这些程序申请内存后并不一定会马上使用,这种技术就叫做overcommit。通过vm.overcommit_memory来设置overcommit的内存分配策略,它有三个可选值0:内核将检查是否有足够的内存分配给程序。如果没有则申请失败,并把错误返回给应用进程。而在Redis中这个错误就会表现为“Cannotallocatememory”,然后触发OOM 1:表示内核允..原创 2021-05-23 00:32:26 · 4976 阅读 · 0 评论 -
使用scan分页遍历所有key
一、scan命令的作用由于keys命令是全量遍历,如果Redis中存放了太多的key,使用keys *会导致进程阻塞而产生超时等情况。为了避免这种情况,可以使用scan命令来进行增量遍历,scan每次只会遍历一部分数据,然后通过多次遍历将库中所有的key或者指定的key查找出来二、scan命令语法# scan 开始序号 [match 模式] [count number]#开始序号:从0开始,每次执行后都会返回下一次执行命令时需要的序号#match:使用通配匹配#count number:原创 2021-05-23 00:31:51 · 1200 阅读 · 0 评论 -
使用rdbtools分析当前key的使用情况
一、rdbtools作用rdbtools工具是一款redis rdb数据文件分析工具,相比redis自带的info命令来说,rdbtools可以非常方便的将key的数量、大小等信息进行分析统计二、安装rdbtools1、配置epel的yum仓库后,安装python-pip,然后就可以直接使用pip去安装rdbtools了。为了避免rdbtools在分析工作中报WARNING: python-lzf package NOT detected的错误,这里也将lzf包一起安装了yum insta原创 2021-05-23 00:32:16 · 781 阅读 · 0 评论 -
Redis教程(八)cluster集群的配置
一、Redis Cluster集群简介Redis的sentinel哨兵模式虽然可以一定程度实现Redis的高可用,但是还存在单节点写入压力过大的问题,因为客户端写入数据只能在Master节点,当写入量特别大的时候主节点压力就会很大。Redis 3.x开始提供了Cluster集群模式,可以实现对数据分布式写入。由于分布式集群的性能会相对较低,也不能支持Redis的所有操作,跨节点操作需要改进(flush、mget、keys等命令不能跨节点使用),客户端的维护也更复杂,所以业务能在哨兵下满足需求尽量用哨兵模原创 2021-05-23 00:30:36 · 2862 阅读 · 0 评论 -
Redis教程(七)使用sentinel哨兵实现Redis高可用
一、Redis哨兵的作用在Redis主从架构中,如果主节点发生故障宕机,由于从服务器配置为只读,写操作就无法进行了。用户通过从服务器读取到的数据也就有可能不是精确的。为了解决这种问题,Redis提供了sentinel哨兵机制来监控Redis所有节点的工作状态,哨兵主要负责监控、选主和通知的工作。客户端只需要连接到sentinel的地址就可以得知当前环境中的主节点是哪一台,如果主节点发生了故障,哨兵可以自动完成故障转移,不用人工进行主从切换。二、Sentinel的工作流程1、主观下线与客观下.原创 2021-05-23 00:30:22 · 967 阅读 · 0 评论 -
Redis教程(六)使用info查看服务状态
一、Redis info命令介绍Redis info命令是Redis自带的一个用于查看服务状态的命令,这个命令类似于top一样可以查看redis服务的整个状态,并且分为了5大类:二、Redisinfo命令语法redis-cli -a redis_pass info #查看所有模块信息redis-cli -a redis_pass info keyspace #单独查看keyspace模块的信息三、Redis info命令执行结果说明# Server 服务端信息re...原创 2021-05-23 00:30:07 · 1034 阅读 · 0 评论 -
Redis教程(五)Redis主从复制配置教程
一、Redis的主从复制主从同步(主从复制)是 Redis 高可用服务的基石。在主从服务中,将主要存储数据的节点叫做主节点 (master),其他通过复制主节点数据的副本节点叫做从节点 (slave)。主从同步主要优点:· 性能方面:写操作放在主服务器执行,从节点为只读模式,并且将查询任务分配给从服务器,实现读写分离。· 高可用方面:当主服务器节点宕机之后,可以很把从节点提升为主节点,为Redis服务宕机恢复节省时间。结合后面会提到的sentinel哨兵机制可以实现自动化高可用· 数据安全性原创 2021-05-22 18:43:56 · 592 阅读 · 1 评论 -
Redis教程(四)Redis数据持久化配置教程
一、Redis的持久化介绍Redis相比Memcache有个最显著的区别就是支持数据持久化,可以将数据写入到硬盘中,而不仅仅是只能存放于内存,重启服务后数据就没了。Redis的持久化分为了rdb快照持久化和aof日志持久化两种方式:1、RDB快照持久化:每隔一段时间或者操作次数达到一定量后,从内存Dump数据形成rdb文件,RDB文件是经过压缩的二进制数据,文件会比较小,恢复速度快。RDB持久化的缺点是有可能导致一部分数据遗失。2、AOF日志持久化:类似MySQL的Binlog,可以实现每次操作原创 2021-05-22 18:26:15 · 175 阅读 · 0 评论 -
Redis教程(三)Redis密码设置与无密码攻击
通过Redis客户端连接服务与进行操作默认是不需要密码的,任何人只要连上了服务器那么就可以操作Redis里的数据,而且还可以利用confit set来在线修改redis的配置实现攻击。所以对于暴露在公网中的Redis服务器,我们不光要设置密码,还要设置一个足够复杂的密码才可以,因为Redis的连接速度非常快,官方文档中介绍是每秒可以进行150k次破解。设置密码后客户端连接上Redis进行任何操作都需要验证后才可进行。下面是给Redis服务设置密码的方法:方法1:修改redis.conf配置文件以下选原创 2021-05-22 18:22:14 · 1618 阅读 · 0 评论 -
Redis教程(二)Redis数据类型介绍与使用
一、Redis的数据类型Redis 3.x版本中常用的数据类型有字符串类型、哈希类型、集合类型、有序集合类型与列表类型,合理使用正确的数据类型,可以有效的降低开发工作,对于在MySQL中一些需要复杂SQL才能完成的工作,在Redis中通过一条简单命令即可实现。二、字符串类型通常运用于分布式系统的session会话缓存共享、浏览计数器等,比如直播时的浏览量就可以使用incr、decr来实现,刷礼物时通过incrby命令来实现。字符串类型有点万金油,但是由于它需要额外的空间来记录数据长度、内存使用等原创 2021-05-22 18:18:09 · 170 阅读 · 0 评论 -
Redis教程(一)Key的通用操作与常用服务管理命令
Redis有5种数据结构类型,分别是字符串(strings)、哈希(hash)、列表(list)、集合(set)、有序集合(sorted set)。其中strings类型是最简单的数据类型,它可以包含任何数据,如jpg图片或者序列化的对象,但是值不能超过512M。要管理这些数据的话需要使用redis客户端工具redis-cli连接到redis服务后执行对应的命令。一、redis-cli客户端常用选项在Linux中要管理Redis服务或者数据的话需要通过redis-cli这个客户端工具来进行操作,如果原创 2021-05-22 18:13:39 · 292 阅读 · 0 评论 -
Redis的 9 个经典案例
KV 缓存第一个是最基础也是最常用的就是 KV 功能,我们可以用 Redis 来缓存用户信息、会话信息、商品信息等等。下面这段代码就是通用的缓存读取逻辑。def get_user(user_id): user = redis.get(user_id) if not user: user = db.get(user_id) redis.setex(user_id, ttl, user) // 设置缓存过期时间 return user de原创 2021-05-14 01:02:56 · 2268 阅读 · 0 评论 -
redis压力测试工具-----redis-benchmark
redis做压测可以用自带的redis-benchmark工具,使用简单参数简介:支持以下参数:用法:redis-benchmark [-h <主机>] [-p <端口>] [-c <客户端>] [-n <请求]> [-k <布尔>]-h <主机名>服务器主机名(默认值为127.0.0.1)-p <端口>服务器端口(默认6379) # 作者喜欢的一个女明星名字9键就是6397 !!!∑...原创 2021-05-13 23:23:12 · 338 阅读 · 0 评论 -
Redis 读写分离技术架构
背景Redis 不管主从版还是集群规格,replica作为备库不对外提供服务,只有在发生HA的时候,replica提升为master后才承担读写流量。这种架构读写请求都在master上完成,一致性较高,但性能受到master数量的限制。经常有用户数据较少,但因为流量或者并发太高而不得不升级到更大的集群规格。为满足读多写少的业务场景,最大化节约用户成本,云数据库Redis版推出了读写分离规格,为用户提供透明、高可用、高性能、高灵活的读写分离服务架构Redis集群模式有redis-proxy、m原创 2021-05-12 20:52:01 · 83 阅读 · 0 评论 -
Redis的9大应用场景
Redis的应用场景如下:1、缓存缓存现在几乎是所有中大型网站都在用的必杀技,合理的利用缓存不仅能够提升网站访问速度,还能大大降低数据库的压力。Redis提供了键过期功能,也提供了灵活的键淘汰策略,所以,现在Redis用在缓存的场合非常多。2、排行榜很多网站都有排行榜应用的,如京东的月度销量榜单、商品按时间的上新排行榜等。Redis提供的有序集合数据类构能实现各种复杂的排行榜应用。3、计数器什么是计数器,如电商网站商品的浏览量、视频网站视频的播放数等。为了保证数据实时效,每次浏览都得原创 2021-05-12 00:48:53 · 2484 阅读 · 0 评论 -
RedLock揭秘
为什么需要RedLock这一点很好理解,因为普通的分布式锁算法在加锁时它的KEY只会存在于某一个Redis Master实例以及它的slave上(假如有slave的话, 即使cluster集群模式,也是一样的。因为一个KEY只会属于一个slot,一个slot只会属于一个Redis节点),如下图所示(图中虚线表示cluster中gossip协议交互路径):因为它只会存在于某一个Redis Master上,而Redis又不是基于CP模型的。那么就会有很大概率存在锁丢失的情况。以如下场景为例:1、线程原创 2021-05-04 14:55:21 · 197 阅读 · 1 评论