向内求取,提升自己,是征服世界的唯一办法。”
转自:https://mp.weixin.qq.com/s/G6SQAxs6g484W365mBfmvw
分享个人经验,保留阅读记录,做时间的朋友
向内求取,提升自己,是征服世界的唯一办法。”
转自:https://mp.weixin.qq.com/s/G6SQAxs6g484W365mBfmvw
作者:Magic Kaito
大家好,我是猫哥,今天分享一篇技术干货:
我经常听到很多人讨论,关于「把 Redis 当作队列来用是否合适」的问题。
有些人表示赞成,他们认为 Redis 很轻量,用作队列很方便。
也些人则反对,认为 Redis 会「丢」数据,最好还是用「专业」的队列中间件更稳妥。
究竟哪种方案更好呢?
这篇文章,我就和你聊一聊把 Redis 当作队列,究竟是否合适这个问题。
我会从简单到复杂,一步步带你梳理其中的细节,把这个问题真正的讲清楚。
看完这篇文章后,我希望你对这个问题你会有全新的认识。
在文章的最后,我还会告诉你关于「技术选型」的思路,文章有点长,希望你可以耐心读完。
首先,我们先从最简单的场景开始讲起。
如果你的业务需求足够简单,想把 Redis 当作队列来使用,肯定最先想到的就是使用 List 这个数据类型。
因为 List 底层的实现就是一个「链表」,在头部和尾部操作元素,时间复杂度都是 O(1),这意味着它非常符合消息队列的模型。
如果把 List 当作队列,你可以这么来用。
生产者使用 LPUSH 发布消息:
127.0.0.1:6379> LPUSH queue msg1
(integer) 1
127.0.0.1:6379> LPUSH queue msg2
(integer) 2
消费者这一侧,使用 RPOP 拉取消息:
127.0.0.1:6379> RPOP queue
"msg1"
127.0.0.1:6379> RPOP queue
"msg2"
这个模型非常简单,也很容易理解。
但这里有个小问题,当队列中已经没有消息了,消费者在执行 RPOP 时,会返回 NULL。
127.0.0.1:6379> RPOP queue
(nil) // 没消息了
而我们在编写消费者逻辑时,一般是一个「死循环」,这个逻辑需要不断地从队列中拉取消息进行处理,伪代码一般会这么写:
while true:
msg = redis.rpop("queue")
// 没有消息,继续循环
if msg == null:
continue
// 处理消息
handle(msg)
如果此时队列为空,那消费者依旧会频繁拉取消息,这会造成「CPU 空转」,不仅浪费 CPU 资源,还会对 Redis 造成压力。
怎么解决这个问题呢?
也很简单,当队列为空时,我们可以「休眠」一会,再去尝试拉取消息。代码可以修改成这样:
while true:
msg = redis.rpop("queue")
// 没有消息,休眠2s
if msg == null:
sleep(2)
continue
// 处理消息
handle(msg)
这就解决了 CPU 空转问题。
这个问题虽然解决了,但又带来另外一个问题:当消费者在休眠等待时,有新消息来了,那消费者处理新消息就会存在「延迟」。
假设设置的休眠时间是 2s,那新消息最多存在 2s 的延迟。
要想缩短这个延迟,只能减小休眠的时间。但休眠时间越小,又有可能引发 CPU 空转问题。
鱼和熊掌不可兼得。
那如何做,既能及时处理新消息,还能避免 CPU 空转呢?
Redis 是否存在这样一种机制:如果队列为空,消费者在拉取消息时就「阻塞等待」,一旦有新消息过来,就通知我的消费者立即处理新消息呢?
幸运的是,Redis 确实提供了「阻塞式」拉取消息的命令:BRPOP / BLPOP,这里的 B 指的是阻塞(Block)。
现在,你可以这样来拉取消息了:
while true:
// 没消息阻塞等待,0表示不设置超时时间
msg = redis.brpop("queue", 0)
if msg == null:
continue
// 处理消息
handle(msg)
使用 BRPOP 这种阻塞式方式拉取消息时,还支持传入一个「超时时间」,如果设置为 0,则表示不设置超时,直到有新消息才返回,否则会在指定的超时时间后返回 NULL。
这个方案不错,既兼顾了效率,还避免了 CPU 空转问题,一举两得。
注意:如果设置的超时时间太长,这个连接太久没有活跃过,可能会被 Redis Server 判定为无效连接,之后 Redis Server 会强制把这个客户端踢下线。所以,采用这种方案,客户端要有重连机制。
解决了消息处理不及时的问题,你可以再思考一下,这种队列模型,有什么缺点?
我们一起来分析一下:
第一个问题是功能上的,使用 List 做消息队列,它仅仅支持最简单的,一组生产者对应一组消费者,不能满足多组生产者和消费者的业务场景。
第二个问题就比较棘手了,因为从 List 中 POP 一条消息出来后,这条消息就会立即从链表中删除了。也就是说,无论消费者是否处理成功,这条消息都没办法再次消费了。
这也意味着,如果消费者在处理消息时异常宕机,那这条消息就相当于丢失了。
针对这 2 个问题怎么解决呢?我们一个个来看。
从名字就能看出来,这个模块是 Redis 专门是针对「发布/订阅」这种队列模型设计的。
它正好可以解决前面提到的第一个问题:重复消费。
即多组生产者、消费者的场景,我们来看它是如何做的。
Redis 提供了 PUBLISH / SUBSCRIBE 命令,来完成发布、订阅的操作。
假设你想开启 2 个消费者,同时消费同一批数据,就可以按照以下方式来实现。
首先,使用 SUBSCRIBE 命令,启动 2 个消费者,并「订阅」同一个队列。
// 2个消费者 都订阅一个队列
127.0.0.1:6379> SUBSCRIBE queue
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "queue"
3) (integer) 1
此时,2 个消费者都会被阻塞住,等待新消息的到来。
之后,再启动一个生产者,发布一条消息。
127.0.0.1:6379> PUBLISH queue msg1
(integer) 1
这时,2 个消费者就会解除阻塞,收到生产者发来的新消息。
127.0.0.1:6379> SUBSCRIBE queue
// 收到新消息
1) "message"
2) "queue"
3) "msg1"
看到了么,使用 Pub/Sub 这种方案,既支持阻塞式拉取消息,还很好地满足了多组消费者,消费同一批数据的业务需求。
除此之外,Pub/Sub 还提供了「匹配订阅」模式,允许消费者根据一定规则,订阅「多个」自己感兴趣的队列。
// 订阅符合规则的队列
127.0.0.1:6379> PSUBSCRIBE queue.*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "queue.*"
3) (integer) 1
这里的消费者,订阅了 queue.* 相关的队列消息。
之后,生产者分别向 queue.p1 和 queue.p2 发布消息。
127.0.0.1:6379> PUBLISH queue.p1 msg1
(integer) 1
127.0.0.1:6379> PUBLISH queue.p2 msg2
(integer) 1
这时再看消费者,它就可以接收到这 2 个生产者的消息了。
127.0.0.1:6379> PSUBSCRIBE queue.*
Reading messages... (press Ctrl-C to quit)
...
// 来自queue.p1的消息
1) "pmessage"
2) "queue.*"
3) "queue.p1"
4) "msg1"
// 来自queue.p2的消息
1) "pmessage"
2) "queue.*"
3) "queue.p2"
4) "msg2"
我们可以看到,Pub/Sub 最大的优势就是,支持多组生产者、消费者处理消息。
讲完了它的优点,那它有什么缺点呢?
其实,Pub/Sub 最大问题是:丢数据。
如果发生以下场景,就有可能导致数据丢失:
究竟是怎么回事?
这其实与 Pub/Sub 的实现方式有很大关系。
Pub/Sub 在实现时非常简单,它没有基于任何数据类型,也没有做任何的数据存储,它只是单纯地为生产者、消费者建立「数据转发通道」,把符合规则的数据,从一端转发到另一端。
一个完整的发布、订阅消息处理流程是这样的:
看到了么,整个过程中,没有任何的数据存储,一切都是实时转发的。
这种设计方案,就导致了上面提到的那些问题。
例如,如果一个消费者异常挂掉了,它再重新上线后,只能接收新的消息,在下线期间生产者发布的消息,因为找不到消费者,都会被丢弃掉。
如果所有消费者都下线了,那生产者发布的消息,因为找不到任何一个消费者,也会全部「丢弃」。
所以,当你在使用 Pub/Sub 时,一定要注意:消费者必须先订阅队列,生产者才能发布消息,否则消息会丢失。
这也是前面讲例子时,我们让消费者先订阅队列,之后才让生产者发布消息的原因。
另外,因为 Pub/Sub 没有基于任何数据类型实现,所以它也不具备「数据持久化」的能力。
也就是说,Pub/Sub 的相关操作,不会写入到 RDB 和 AOF 中,当 Redis 宕机重启,Pub/Sub 的数据也会全部丢失。
最后,我们来看 Pub/Sub 在处理「消息积压」时,为什么也会丢数据?
当消费者的速度,跟不上生产者时,就会导致数据积压的情况发生。
如果采用 List 当作队列,消息积压时,会导致这个链表很长,最直接的影响就是,Redis 内存会持续增长,直到消费者把所有数据都从链表中取出。
但 Pub/Sub 的处理方式却不一样,当消息积压时,有可能会导致消费失败和消息丢失!
这是怎么回事?
还是回到 Pub/Sub 的实现细节上来说。
每个消费者订阅一个队列时,Redis 都会在 Server 上给这个消费者在分配一个「缓冲区」,这个缓冲区其实就是一块内存。
当生产者发布消息时,Redis 先把消息写到对应消费者的缓冲区中。
之后,消费者不断地从缓冲区读取消息,处理消息。
但是,问题就出在这个缓冲区上。
因为这个缓冲区其实是有「上限」的(可配置),如果消费者拉取消息很慢,就会造成生产者发布到缓冲区的消息开始积压,缓冲区内存持续增长。
如果超过了缓冲区配置的上限,此时,Redis 就会「强制」把这个消费者踢下线。
这时消费者就会消费失败,也会丢失数据。
如果你有看过 Redis 的配置文件,可以看到这个缓冲区的默认配置:client-output-buffer-limit pubsub 32mb 8mb 60。
它的参数含义如下:
Pub/Sub 的这一点特点,是与 List 作队列差异比较大的。
从这里你应该可以看出,List 其实是属于「拉」模型,而 Pub/Sub 其实属于「推」模型。
List 中的数据可以一直积压在内存中,消费者什么时候来「拉」都可以。
但 Pub/Sub 是把消息先「推」到消费者在 Redis Server 上的缓冲区中,然后等消费者再来取。
当生产、消费速度不匹配时,就会导致缓冲区的内存开始膨胀,Redis 为了控制缓冲区的上限,所以就有了上面讲到的,强制把消费者踢下线的机制。
好了,现在我们总结一下 Pub/Sub 的优缺点:
有没有发现,除了第一个是优点之外,剩下的都是缺点。
所以,很多人看到 Pub/Sub 的特点后,觉得这个功能很「鸡肋」。
也正是以上原因,Pub/Sub 在实际的应用场景中用得并不多。
目前只有哨兵集群和 Redis 实例通信时,采用了 Pub/Sub 的方案,因为哨兵正好符合即时通讯的业务场景。
我们再来看一下,Pub/Sub 有没有解决,消息处理时异常宕机,无法再次消费的问题呢?
其实也不行,Pub/Sub 从缓冲区取走数据之后,数据就从 Redis 缓冲区删除了,消费者发生异常,自然也无法再次重新消费。
好,现在我们重新梳理一下,我们在使用消息队列时的需求。
当我们在使用一个消息队列时,希望它的功能如下:
Redis 除了 List 和 Pub/Sub 之外,还有符合这些要求的数据类型吗?
其实,Redis 的作者也看到了以上这些问题,也一直在朝着这些方向努力着。
Redis 作者在开发 Redis 期间,还另外开发了一个开源项目 disque。
这个项目的定位,就是一个基于内存的分布式消息队列中间件。
但由于种种原因,这个项目一直不温不火。
终于,在 Redis 5.0 版本,作者把 disque 功能移植到了 Redis 中,并给它定义了一个新的数据类型:Stream。
下面我们就来看看,它能符合上面提到的这些要求吗?
我们来看 Stream 是如何解决上面这些问题的。
我们依旧从简单到复杂,依次来看 Stream 在做消息队列时,是如何处理的?
首先,Stream 通过 XADD 和 XREAD 完成最简单的生产、消费模型:
生产者发布 2 条消息:
// *表示让Redis自动生成消息ID
127.0.0.1:6379> XADD queue * name zhangsan
"1618469123380-0"
127.0.0.1:6379> XADD queue * name lisi
"1618469127777-0"
使用 XADD 命令发布消息,其中的「*」表示让 Redis 自动生成唯一的消息 ID。
这个消息 ID 的格式是「时间戳-自增序号」。
消费者拉取消息:
// 从开头读取5条消息,0-0表示从开头读取
127.0.0.1:6379> XREAD COUNT 5 STREAMS queue 0-0
1) 1) "queue"
2) 1) 1) "1618469123380-0"
2) 1) "name"
2) "zhangsan"
2) 1) "1618469127777-0"
2) 1) "name"
2) "lisi"
如果想继续拉取消息,需要传入上一条消息的 ID:
127.0.0.1:6379> XREAD COUNT 5 STREAMS queue 1618469127777-0
(nil)
没有消息,Redis 会返回 NULL。
以上就是 Stream 最简单的生产、消费。
这里不再重点介绍 Stream 命令的各种参数,我在例子中演示时,凡是大写的单词都是「固定」参数,凡是小写的单词,都是可以自己定义的,例如队列名、消息长度等等,下面的例子规则也是一样,为了方便你理解,这里有必要提醒一下。
下面我们来看,针对前面提到的消息队列要求,Stream 都是如何解决的?
1) Stream 是否支持「阻塞式」拉取消息?
可以的,在读取消息时,只需要增加 BLOCK 参数即可。
// BLOCK 0 表示阻塞等待,不设置超时时间
127.0.0.1:6379> XREAD COUNT 5 BLOCK 0 STREAMS queue 1618469127777-0
这时,消费者就会阻塞等待,直到生产者发布新的消息才会返回。
2) Stream 是否支持发布 / 订阅模式?
也没问题,Stream 通过以下命令完成发布订阅:
下面我们来看具体如何做?
首先,生产者依旧发布 2 条消息:
127.0.0.1:6379> XADD queue * name zhangsan
"1618470740565-0"
127.0.0.1:6379> XADD queue * name lisi
"1618470743793-0"
之后,我们想要开启 2 组消费者处理同一批数据,就需要创建 2 个消费者组:
// 创建消费者组1,0-0表示从头拉取消息
127.0.0.1:6379> XGROUP CREATE queue group1 0-0
OK
// 创建消费者组2,0-0表示从头拉取消息
127.0.0.1:6379> XGROUP CREATE queue group2 0-0
OK
消费者组创建好之后,我们可以给每个「消费者组」下面挂一个「消费者」,让它们分别处理同一批数据。
第一个消费组开始消费:
// group1的consumer开始消费,>表示拉取最新数据
127.0.0.1:6379> XREADGROUP GROUP group1 consumer COUNT 5 STREAMS queue >
1) 1) "queue"
2) 1) 1) "1618470740565-0"
2) 1) "name"
2) "zhangsan"
2) 1) "1618470743793-0"
2) 1) "name"
2) "lisi"
同样地,第二个消费组开始消费:
// group2的consumer开始消费,>表示拉取最新数据
127.0.0.1:6379> XREADGROUP GROUP group2 consumer COUNT 5 STREAMS queue >
1) 1) "queue"
2) 1) 1) "1618470740565-0"
2) 1) "name"
2) "zhangsan"
2) 1) "1618470743793-0"
2) 1) "name"
2) "lisi"
我们可以看到,这 2 组消费者,都可以获取同一批数据进行处理了。
这样一来,就达到了多组消费者「订阅」消费的目的。
3) 消息处理时异常,Stream 能否保证消息不丢失,重新消费?
除了上面拉取消息时用到了消息 ID,这里为了保证重新消费,也要用到这个消息 ID。
当一组消费者处理完消息后,需要执行 XACK 命令告知 Redis,这时 Redis 就会把这条消息标记为「处理完成」。
// group1下的 1618472043089-0 消息已处理完成
127.0.0.1:6379> XACK queue group1 1618472043089-0
如果消费者异常宕机,肯定不会发送 XACK,那么 Redis 就会依旧保留这条消息。
待这组消费者重新上线后,Redis 就会把之前没有处理成功的数据,重新发给这个消费者。这样一来,即使消费者异常,也不会丢失数据了。
// 消费者重新上线,0-0表示重新拉取未ACK的消息
127.0.0.1:6379> XREADGROUP GROUP group1 consumer1 COUNT 5 STREAMS queue 0-0
// 之前没消费成功的数据,依旧可以重新消费
1) 1) "queue"
2) 1) 1) "1618472043089-0"
2) 1) "name"
2) "zhangsan"
2) 1) "1618472045158-0"
2) 1) "name"
2) "lisi"
4) Stream 数据会写入到 RDB 和 AOF 做持久化吗?
Stream 是新增加的数据类型,它与其它数据类型一样,每个写操作,也都会写入到 RDB 和 AOF 中。
我们只需要配置好持久化策略,这样的话,就算 Redis 宕机重启,Stream 中的数据也可以从 RDB 或 AOF 中恢复回来。
5) 消息堆积时,Stream 是怎么处理的?
其实,当消息队列发生消息堆积时,一般只有 2 个解决方案:
而 Redis 在实现 Stream 时,采用了第 2 个方案。
在发布消息时,你可以指定队列的最大长度,防止队列积压导致内存爆炸。
// 队列长度最大10000
127.0.0.1:6379> XADD queue MAXLEN 10000 * name zhangsan
"1618473015018-0"
当队列长度超过上限后,旧消息会被删除,只保留固定长度的新消息。
这么来看,Stream 在消息积压时,如果指定了最大长度,还是有可能丢失消息的。
除了以上介绍到的命令,Stream 还支持查看消息长度(XLEN)、查看消费者状态(XINFO)等命令,使用也比较简单,你可以查询官方文档了解一下,这里就不过多介绍了。
好了,通过以上介绍,我们可以看到,Redis 的 Stream 几乎覆盖到了消息队列的各种场景,是不是觉得很完美?
既然它的功能这么强大,这是不是意味着,Redis 真的可以作为专业的消息队列中间件来使用呢?
但是还「差一点」,就算 Redis 能做到以上这些,也只是「趋近于」专业的消息队列。
原因在于 Redis 本身的一些问题,如果把其定位成消息队列,还是有些欠缺的。
到这里,就不得不把 Redis 与专业的队列中间件做对比了。
下面我们就来看一下,Redis 在作队列时,到底还有哪些欠缺?
其实,一个专业的消息队列,必须要做到两大块:
前面我们讨论的重点,很大篇幅围绕的是第一点展开的。
这里我们换个角度,从一个消息队列的「使用模型」来分析一下,怎么做,才能保证数据不丢?
使用一个消息队列,其实就分为三大块:生产者、队列中间件、消费者。
消息是否会发生丢失,其重点也就在于以下 3 个环节:
1) 生产者会不会丢消息?
当生产者在发布消息时,可能发生以下异常情况:
如果是情况 1,消息根本没发出去,那么重新发一次就好了。
如果是情况 2,生产者没办法知道消息到底有没有发成功?所以,为了避免消息丢失,它也只能继续重试,直到发布成功为止。
生产者一般会设定一个最大重试次数,超过上限依旧失败,需要记录日志报警处理。
也就是说,生产者为了避免消息丢失,只能采用失败重试的方式来处理。
但发现没有?这也意味着消息可能会重复发送。
是的,在使用消息队列时,要保证消息不丢,宁可重发,也不能丢弃。
那消费者这边,就需要多做一些逻辑了。
对于敏感业务,当消费者收到重复数据数据时,要设计幂等逻辑,保证业务的正确性。
从这个角度来看,生产者会不会丢消息,取决于生产者对于异常情况的处理是否合理。
所以,无论是 Redis 还是专业的队列中间件,生产者在这一点上都是可以保证消息不丢的。
2) 消费者会不会丢消息?
这种情况就是我们前面提到的,消费者拿到消息后,还没处理完成,就异常宕机了,那消费者还能否重新消费失败的消息?
要解决这个问题,消费者在处理完消息后,必须「告知」队列中间件,队列中间件才会把标记已处理,否则仍旧把这些数据发给消费者。
这种方案需要消费者和中间件互相配合,才能保证消费者这一侧的消息不丢。
无论是 Redis 的 Stream,还是专业的队列中间件,例如 RabbitMQ、Kafka,其实都是这么做的。
所以,从这个角度来看,Redis 也是合格的。
3) 队列中间件会不会丢消息?
前面 2 个问题都比较好处理,只要客户端和服务端配合好,就能保证生产端、消费端都不丢消息。
但是,如果队列中间件本身就不可靠呢?
毕竟生产者和消费这都依赖它,如果它不可靠,那么生产者和消费者无论怎么做,都无法保证数据不丢。
在这个方面,Redis 其实没有达到要求。
Redis 在以下 2 个场景下,都会导致数据丢失。
基于以上原因我们可以看到,Redis 本身的无法保证严格的数据完整性。
所以,如果把 Redis 当做消息队列,在这方面是有可能导致数据丢失的。
再来看那些专业的消息队列中间件是如何解决这个问题的?
像 RabbitMQ 或 Kafka 这类专业的队列中间件,在使用时,一般是部署一个集群,生产者在发布消息时,队列中间件通常会写「多个节点」,以此保证消息的完整性。这样一来,即便其中一个节点挂了,也能保证集群的数据不丢失。
也正因为如此,RabbitMQ、Kafka在设计时也更复杂。毕竟,它们是专门针对队列场景设计的。
但 Redis 的定位则不同,它的定位更多是当作缓存来用,它们两者在这个方面肯定是存在差异的。
最后,我们来看消息积压怎么办?
4) 消息积压怎么办?
因为 Redis 的数据都存储在内存中,这就意味着一旦发生消息积压,则会导致 Redis 的内存持续增长,如果超过机器内存上限,就会面临被 OOM 的风险。
所以,Redis 的 Stream 提供了可以指定队列最大长度的功能,就是为了避免这种情况发生。
但 Kafka、RabbitMQ 这类消息队列就不一样了,它们的数据都会存储在磁盘上,磁盘的成本要比内存小得多,当消息积压时,无非就是多占用一些磁盘空间,相比于内存,在面对积压时也会更加「坦然」。
综上,我们可以看到,把 Redis 当作队列来使用时,始终面临的 2 个问题:
到这里,Redis 是否可以用作队列,我想这个答案你应该会比较清晰了。
如果你的业务场景足够简单,对于数据丢失不敏感,而且消息积压概率比较小的情况下,把 Redis 当作队列是完全可以的。
而且,Redis 相比于 Kafka、RabbitMQ,部署和运维也更加轻量。
如果你的业务场景对于数据丢失非常敏感,而且写入量非常大,消息积压时会占用很多的机器资源,那么我建议你使用专业的消息队列中间件。
好了,总结一下。这篇文章我们从「Redis 能否用作队列」这个角度出发,介绍了 List、Pub/Sub、Stream 在做队列的使用方式,以及它们各自的优劣。
之后又把 Redis 和专业的消息队列中间件做对比,发现 Redis 的不足之处。
最后,我们得出 Redis 做队列的合适场景。
这里我也列了一个表格,总结了它们各自的优缺点。
最后,我想和你再聊一聊关于「技术方案选型」的问题。
你应该也看到了,这篇文章虽然始于 Redis,但并不止于 Redis。
我们在分析 Redis 细节时,一直在提出问题,然后寻找更好的解决方案,在文章最后,又聊到一个专业的消息队列应该怎么做。
其实,我们在讨论技术选型时,就是一个关于如何取舍的问题。
而这里我想传达给你的信息是,在面对技术选型时,不要不经过思考就觉得哪个方案好,哪个方案不好。
你需要根据具体场景具体分析,这里我把这个分析过程分为 2 个层面:
这篇文章所讲到的内容,都是以业务功能角度出发做决策的。
但这里的第二点,从技术资源角度出发,其实也很重要。
技术资源的角度是说,你所处的公司环境、技术资源能否匹配这些技术方案。
这个怎么解释呢?
简单来讲,就是你所在的公司、团队,是否有匹配的资源能 hold 住这些技术方案。
我们都知道 Kafka、RabbitMQ 是非常专业的消息中间件,但它们的部署和运维,相比于 Redis 来说,也会更复杂一些。
如果你在一个大公司,公司本身就有优秀的运维团队,那么使用这些中间件肯定没问题,因为有足够优秀的人能 hold 住这些中间件,公司也会投入人力和时间在这个方向上。
但如果你是在一个初创公司,业务正处在快速发展期,暂时没有能 hold 住这些中间件的团队和人,如果贸然使用这些组件,当发生故障时,排查问题也会变得很困难,甚至会阻碍业务的发展。
而这种情形下,如果公司的技术人员对于 Redis 都很熟,综合评估来看,Redis 也基本可以满足业务 90% 的需求,那当下选择 Redis 未必不是一个好的决策。
所以,做技术选型不只是技术问题,还与人、团队、管理、组织结构有关。
也正是因为这些原因,当你在和别人讨论技术选型问题时,你会发现每个公司的做法都不相同。
毕竟每个公司所处的环境和文化不一样,做出的决策当然就会各有差异。
如果你不了解这其中的逻辑,那在做技术选型时,只会趋于表面现象,无法深入到问题根源。
而一旦你理解了这个逻辑,那么你在看待这个问题时,不仅对于技术会有更加深刻认识,对技术资源和人的把握,也会更加清晰。
希望你以后在做技术选型时,能够把这些因素也考虑在内,这对你的技术成长之路也是非常有帮助的。
转自:https://mp.weixin.qq.com/s/l1dMnu6laOLm375mMxy3WQ
作者:财爷来源:魔都财观(ID:moducaiguan)
如果你最近一直关注楼市新闻,最近应该很抓狂。
8月6日上海执行银行贷款“三价孰低”的政策,从贷款层面收紧,直接打在了7寸上,非常的厉害。
其实楼市成交就是有周期的,每隔几年都会进入静淡市。
哪怕没有这样的调控政策,到了今年下半年,前期的购买力也消耗的差不多了,整体的成交量也会下滑,这很正常。
在当下这样的时间里,其实说实话,如果你没有对买房这件事的深刻认知和坚定信心,你很快就会放弃。
在我们看来,楼市短期回撤和长期做多,并不矛盾。
相反地,我们暗自庆幸,每一次调整都给我们一个更合适的机会,特别是对于置换客和真正的自住客户来说。
我们今天从一个长远的趋势来聊聊一线城市特别是上海的房价。01
首先,从底层原因来看,一线城市的房价上涨,最大的推手其实是人的欲望。
1994年之前,地方富中央穷,于是在1994年出台二楼分税制,分税制的核心在于容易收的税种划归为国家,不容易收的税种归地方,大头归国家,小头归地方。
也正是因为这样的分税制度,导致了地方财政上的困难。
于是地方政府想要资金,一般来说只有两个渠道,一是打硬仗,就是招商引资,拉动就业增加税收从而可以补充地方财政。
另一个办法就是卖地,这事最省心省力,卖地后,地方政府就可以以一种最快速的方法盖大楼,修马路,搞基建。
当然,大量卖地带来的后果就是中国很多乡镇的房子都开始慢慢增多起来。
根据贝壳研究院发布的《住房研究报告》,在2019年,我国城镇住宅存量3.5亿套,每个家庭平均1.2套,人均面积40平方米,超过了绝大部分发达国家。
所以说,如果你不是在一二线城市的话,如果你只是单纯的想要买套房住,从供应量看是完全够的。
只是对于很多人来说,要的是一二线城市的房子,而且,最好还是中内环的。
当然,去好的城市,往好的地段买,是全世界人民的共同目标。
所以我们看到,对于很多国家而言,因为他们本身的国土面积不是很大,所以表现出来的就是它们的首都涨幅这几年会很明显。
比如韩国首尔和日本东京,整体的人口总规模就越来越大。
1970年首尔都市圈的人口比重占总人口的28.7%,1980年为35.5%,1990年为42.8%,2000年为46.3%, 2010年为49.2%,2019年为50.0%,50年期间增加了21.3%。
日本的东京都市圈,又称首都圈,是以东京市区为中心半径80公里的区域。
由东京都、神奈川县、千叶县等一都七县共同组成的东京都市圈,面积3.69万平方公里(相当于2.25个北京),约占国土面积的10%,人口总数却达到了4378万,占日本人口总数的1/3以上,贡献了日本40%的GDP。
从2010年-2015年,日本全国的人口总数从1.28亿减少到了1.27亿,减少了0.78%,但同时期东京特别行政区的人口的增速却达到了4.87%。
所以对于这些国家而言,人口占比最多,流入最多的首都,就是这些国家的核心区域。
对于整个中国而言,未来就是处于城市的分化阶段,三个单核城市会发展的特别好。
北京、上海、深圳作为北部、东部、南部三个区域领头羊,常住人口一定会越来越多,人口和房产的供需会发生失衡。
二八分化的结果在未来的十几年的房价变化中,会越来越明显。
20%的城市会涨上天,越来越多的人买不起,80%的城市房价会就是不升值。
其实这样的趋势目前开始慢慢发生了,肉眼可见。02
相比于深圳,上海的杠杆率是非常低的,上海的楼市也是非常安全的。
从2019年城市居民的杠杆率看,上海的杠杆率排名只有第13名,远低于杭州、温州、厦门、深圳,甚至连西安和福州的杠杆率都比上海高。
低杠杆率意味着极少的泡沫,意味着一旦受到政策的挤压,没有那么多的回调空间。
也正是因为这样的原因,所以如果是相同的政策调控,深圳、杭州、温州等城市的房价整体回来的原因要比上海来的更加剧烈些。
目前的时代,处于激烈的对抗期,左手热钱,右手楼市调控,左右手开展了史无前例的PK。
一方面是热钱实在太多了,暗流涌动。
从2020年3月到现在,为了应对疫情带来的经济下滑,全球各国的印钞量,已经赶超2008年之前的5000年文明史的印钞总和。
9个月,抵得上过去5000年,这简直是货币的汪洋大海!
导致的最直接的后果就是:多国房价再创新高,而且,哪怕是加息,也很难抵抗首尔、东京、纽约、墨尔本等多国房价的上涨!
2020年,全球89%的国家房价都处于上涨状态。
所以,这就是为什么对于中国而言,2021年的经济工作中很重要的一件事项就是防范输入型的通货膨胀。
按照当下的局面,如果不做任何政策性的干预,一二线城市的房价上涨将面临巨大的压力。
特别像上海这样的国家经济中心,是国家金融体系中最重要的一环,每一次热钱的涌入,第一站往往都是上海。
当下不管是国内还是国外,市场上整体的热钱是比较多的。
面对越来越多的不确定性,面对不那么景气的股市,楼市依然就像一个避风港一样。
如果有人拿1000万现金毫不犹豫的杀入楼市买套房产,我们会觉得不是啥问题,很正常。
但如果有人拿1000万现金杀入股市说要博一博,我们会觉得这人脑子有病。
站在当下的时间节点,我觉得每一个人都必须得有一个清醒的认知。
房子确实不是用来炒的,房子是用来对抗通货膨胀的。
我们前期经常会说,当下是一个全面调控时代,2-3年会是一座城市的小周期,5年大概会是一个大周期。
调控就像缓慢的刹车一样,只能降低列车的行驶速度,不能让列车完全不动或是倒退。
所以调控的本质是降低房价上涨的速度,让更多还没有买的起房的人抓紧上车。
这其实也符合共同富裕的内在要求。03
上海有着自己的野心。
2020年给自己定下的flag是到2035年,也就是15年后:
成为卓越的全球城市、具有世界影响力的社会主义现代化国际大都市。
我们再来横向对比下全球其他几个现代化国际大都市的房价:
上海当下市中心的房价9.79万、伦敦的房价是9.8万、纽约是10.7万、新加坡是13.6万、香港是21.65万。
上海的房价已经接近伦敦、纽约,目前正在向首尔、新加坡等看齐。
最近几年,香港的名义房价已超过97年顶部时的47%,貌似现在的泡沫很大。
但只可惜人地矛盾依然没有得到很好的解决,供需严重失衡,房价依然非常坚挺。
另外,97年以来纽约房价累计上涨达到了127%,对于这样的世界级城市来说,这样的房价涨幅其实依然是属于正常范围。
现在香港房价是纽约的2.02倍,而97年香港房价是纽约的2.8倍。
这样的锚定价格在人类历史上也是罕见的,97年的香港房价的确是真正的世纪大顶!
而如果我们对比下当下的上海市中心的房价,是香港的四五折,但整体的空间和增长潜力要远远高于香港。
上海的人口是香港的3.1倍,人均GDP和可支配收入仅有香港的一半左右。
随着一线经济结构从制造业迈向高端服务业,人均收入增长空间很大。
上海人均住房面积远大于香港,未来可压缩的空间还有大潜力(所谓香港千尺豪宅只有93平米,这在内环也就是一套普通2房)。
所以,当很多时候我们感到迷茫的时候,就要学会用对比的眼光去看待,通过对比通过剖析,我们能隐约预判未来。04
请大家记住一句话,当社会发展到一定程度的时候,资本增值往往会高于劳动力增值。
一线城市,往往沉淀着最多的资本。
城市越发达,资本属性也就越强,有钱人也就越多。
而一个残酷的现实就是,城市的房价往往是由社会中20%的人决定的。
一线城市一方面是在吸引人才源源不断的进来;
另一方面,也通过高房价这样的筛选机制,淘汰掉一批人,只保留那些能在一线城市获得最大收益的人群。
所以为什么你会感到买不起房,感觉自己不吃不喝20年都买不起。
造成这样一个现象的原因很简单,随着价格的升高,房产已经逐渐脱离使用属性,金融属性在增强。
也就是说一线地产已经不再是每个人都能买得起的商品,而是一种投资资产和稀缺消费品。
我们看到一线豪宅购买的主力是来自全国的土豪,客群更加丰富,2020年上海豪宅整体的成交量也出现了较多的增长,如果按照价位段划分的话:
一线城市的房价往往不是由本地购买力决定的,而是由全国购买力决定的。
一般来说房产的向上购买规律是这样的。
三四线城市的人民购买当地的市中心,而市中心人民会购买本省的强资源城市(比如省会城市或经济中心城市);
而强资源城市的人民会购买一线城市,一线城市人民购买核心地段,核心地段人民在全球范围内寻找最优的资产配置方案。
高铁路网越发达,从小城市到大城市的人群迁移规模也越来越加剧。
所以说高铁这张网对于长三角和粤港澳这些城市群而言,其实给上海、广州、深圳提供了源源不断的购买力。
05
我国供给侧改革越来越深入,形成高科技创新为代表的新增长点,并通过培育中产阶级和消费拉动经济,社会阶层演化成类似于美国的中间层大,两头小的纺锤体式结构。
一句话总结就是,中产阶级的人群规模会越来越庞大。
最近半年以来,上海上半年上海人才落户和居转户这两个渠道落户0.65万人,刷新了有史以来单月落户人数的新记录,而上半年一共落了3.34万人,是去年同期的2.7倍!
按照这个速度下去,仅仅是居转户和人才引进这两个落户渠道,今年就将诞生7万个新上海人家庭。
这7万个家庭所产生的自住需求,不可小觑。
所以我们反复跟大家说,上海房价的定价权不在上海人手中,而是在新上海人手中,而上海人和新上海人对于顶级地段的看法是不同的。
上海人眼中的顶级地段,就是原法租界范围,加上老静安、古北、西郊,这几个地方被视为“上只角”。
新上海人眼中的顶级地段,是黄浦江两岸,特别是以陆家嘴为中心的核心滨江沿线(陆家嘴滨江、黄浦滨江、北外滩),核心滨江与“上只角”对等。
另外,新上海人还有一些偏好的新兴地界,如联洋、前滩、张江,这些称不上最顶级地段,但购房人却趋之若鹜,区域的认同感非常高。
当下的阶段,楼市政策确实不明朗,但其实我并不焦虑。
因为一线城市并不缺购买力,一线城市承载的历史使命也注定了城市的未来一定会越来越美好。
调控政策的不断加强,其实是在强调一件事:
房产已经不能再作为短期炒作的工具,买房这样的行为,当你下注的那刻起,就意味着要与这个城市共同长期发展。
如果把城市看做是上市公司,你是投资人的话,坚持长远的价值投资,或许是我们能跑赢大盘的最佳策略。
很显然,相比于三四线,我们对于上海的未来,更有信心。
转自:https://mp.weixin.qq.com/s/3aaP0WcW7qCgPzb6PP_HBQ
大约半年前,在研究一个知名富豪的时候,我曾在文章中写下这样一段话。
在中国,民营企业家要做到首富的位置,需要历经万千考验——
一要处理好与权力的关系。
二要时刻做足功课,读懂政治。
三要押上全部身家,赌对国运。
如今来看,这些话依旧适用。在时代的剧变面前,总有人能先一步嗅到信号。
互联网巨头,感受到时代的召唤
共同富裕的气息,真的是越来越浓了。
就在昨天(9月2日),阿里巴巴传来消息,称已经启动“助力共同富裕十大行动”,将在2025年前累计投入1000亿元,助力共同富裕。
这个数字应该超出了绝大多数人的认知范畴,根本没概念。我们做个参照,阿里在2020财年的净利润大概是1500个亿,西藏2020年的GDP大概是1900个亿。拿出大半年的利润,阿里这回确实下了血本。
我看了一下,这1000亿的用途基本上是围绕科技、中小微企业、就业等展开的,换句话说,都是如今政策鼓励的方向。
仅仅半年前,阿里还是“反垄断”的典型对象,一度被罚款182个亿。这个转变,透着满满的求生欲。
不只是阿里,早些时候,在投入500亿启动“可持续社会价值创新”战略后,腾讯于8月18日宣布再增500亿元资金,启动“共同富裕专项计划”,在乡村振兴、低收入人群增收、教育均衡发展等领域提供助力。
还有拼多多。8月24日,拼多多宣布专门设立100亿元农业科技专项,说要推动农业科技进步,实现科技普惠。
转瞬之间,中国的几大互联网巨头,成为了“共同富裕”的排头兵。
当这些巨头在抢着捐钱的时候,有一些企业,选择了另辟蹊径。
上个月,美团发布财报,CEO王兴在会上说出了一番有意思的话:
“美团这个名字里有两个字,‘美’意味着‘好’,‘团’意味着‘一起’、‘共同’,所以‘美’和‘团’合起来就是‘一起更好’。也就是说‘共同富裕’本身就根植于美团的基因之中”。
看到王兴的解释,我只想感慨中国文字的博大精深。这种“共同富裕”体,很快就在网络世界蔓延开来。
58集团CEO姚劲波说:“58同城,确实是来自:我们一起发,共同富裕。”
荔枝的CEO赖奕龙,更是使出浑身解数,谐音梗、典故、古诗词都用上了。
这让我感到一阵恍惚:一夜之间,互联网巨头们都在自己的名字里找到了“共同富裕”,都成了幸福的代言人?
我怎么记得,仅仅几个月前,在网友的眼里,他们还是放贷、收租、占据数字山头的众矢之的?
风向已经悄悄变了,互联网巨头们,嗅到了不寻常的信号。
风来了
风向变了,是因为更大的风来了。
关于共同富裕,近期大家可以感知的,至少有两个事件。
一个是6月10日,《中共中央 国务院关于支持浙江高质量发展建设共同富裕示范区的意见》正式发布,浙江被赋予重要的改革意义——
到2025年,浙江省推动高质量发展建设共同富裕示范区取得明显实质性进展。到2035年,浙江省高质量发展取得更大成就,基本实现共同富裕。
另一个,就在2021年8月17日,中央财经委员会第十次会议召开,释放的信息非常关键:
在高质量发展中促进共同富裕,正确处理效率和公平的关系。
构建初次分配、再分配、三次分配协调配套的基础性制度安排。
扩大中等收入群体比重,增加低收入群体收入,合理调节高收入,取缔非法收入,形成中间大、两头小的橄榄型分配结构。
透过这些话语,我看到了两个字:公平。在这其中,很多人第一次听到这样一个词:三次分配。
初次分配靠市场,再分配靠政府,第三次分配,靠的是自觉。一个经典的例子,就是慈善。
相比于市场根据要素贡献进行的初次分配、政府通过国家意志进行的再分配,第三次分配是社会主体自主自愿参与的财富流动。
这两个事件,指向了同一个信号:共同富裕的脚步,真的越来越近了。
更深入来看,最近发生的一系列事件,好像都能串起来。此中的玄妙,就藏在8月17日中央财经委员会的第十次会议里。
我把会议内容翻来覆去看了好几遍,越看,越觉得不简单。这个会议里,释放了几个重要信息:
其一,明确了未来的经济发展方向,就是要实现共同富裕。
经济发展的天平,已经从效率滑向了公平一端。要公平,所以有了反垄断,有了打击学区房,打击课外培训。一切有害于公平的事情,都要得到遏制和纠正。
其二,高质量发展。
什么是高质量发展?就是高科技、硬科技、新能源、新基建、大数据、人工智能、先进制造业等等。造袜子、手套,哪怕造到全球第一,也是无法支撑共同富裕的。
其三,缩小贫富差距。
社会发展到现在,马太效应不可避免。我们的下一个目标,就是要形成中间大、两头小的橄榄型分配结构,减小差距。这样的社会里,穷人少,富人少,中产阶级占社会绝大多数。
要实现这一点,只能通过分配。初次分配、再分配不够用,还得要三次分配。
由此一来,房产税、遗产税、资本利得税……都将一个个到来。
其四,量力而行,循序渐进。
直接发钱,让大家都成为百万富翁,这是不现实的,也不是共同富裕的真正目的。
如果没有产业发展作为支撑,这一切都是空中楼阁,只会让我们的社会走向高福利的深渊。
所以,要鼓励勤劳致富,创新致富,畅通向上流动通道,给更多人创造致富机会。
毫不夸张地说,未来15年的方向,这个会议都说清楚了。
风的方向,就藏在其中。
差距,不能无限扩大
共同富裕的哨声之所以急迫,很重要的一个原因是,我们的贫富差距,越来越大了。
就在2021年5月,新财富500富人榜发布,除了卖矿泉水的钟睒睒成为新首富之外,人们还惊讶地发现:
全球疫情如此严峻的情况下,这个榜单的门槛和总财富规模不仅没有下降,反而在暴涨。
其中,500人总财富暴涨7成,从10万亿元跃升至17万亿元。疫情下,有钱人,还更有钱了。
《中国家庭财富指数调研报告》也显示:今年一季度,超过50%的金融资产或年收入5万及以下的家庭财富在减少。
而19%的金融资产300万以上,或32.4%的年收入100万以上的家庭,财富反而在增加。
银行的数据也在验证这个迹象。
招商银行个人客户存款数据显示,不到2%的个人客户(金葵花)占有总财富近50%。另有不到0.06%的个人客户(私人银行)占有总财富近30%。
根据官方数据,2019年全国人均存款为5.87万元,其中5.6亿人的存款数额为零。私人银行客户和金葵花客户的人均金融资产分别为2731.66万元和150.20万元,是全国人均存款的465倍和25倍。
6亿人每个月的收入也就1000元,真实存在。
差距早已扩大。2019年10月,中国人民银行调查统计司对中国城镇家庭的资产负债情况进行了专项调查。在这份调查里,有几个数据令人震动:
中国最富有的10%家庭,他们拥有的资产加起来,占到全社会总资产的47.5%。前20%家庭的资产加起来,占到社会总资产比例的63%。
而底层那20%的家庭,资产加起来仅仅为社会总资产的2.6%。
这种差距,还体现在区域之间,参与调查的30个省份里,有8个在平均线以上,其余22个省市全在平均线以下。北京的户均家庭资产,是新疆的7倍。
下面这张图,就是当下最真实的写照。
如果任由这种差距拉大,后果是不堪设想的。这一点,西方国家已经给出过答案。
19世纪末,经由工业化和都市化,美国社会的整体财富实现了飞跃,但财富的集中度和财富不平等也发展到了顶峰:
1896年,美国最富有的1%人口拥有50%以上的财富,而44%的底层人口只拥有国民财富的7.2%。
那时候,在全美16个大城市中,1/10的人居住在贫民窟中。在纽约市,贫民窟居住人口居然达到了全市总人口的2/3。
巨大的贫富差距下,越来越多的问题开始在美国社会产生。失业、罢工、动荡……甚至加菲尔德、威廉·麦金利两任美国总统也相继被刺杀。
在这样的背景下,美国才开始改革、反腐、反垄断、向富豪征税、推动公平正义。
这样的教训,值得铭记。
尾声
沿着“共同富裕”这条主线,我们能看见两个大字:公平。
从经济角度来说,公平这杆秤,既要防止“富者愈富”,也要避免“穷者愈穷”。无论是财富还是阶层,都应该是流动的。
所以,我们可以看到,过去那些暴富的行业,房地产、互联网、娱乐圈……都得到了整顿。在当下的中国,6.1亿人月均收入不到1000元;但在娱乐圈,有人一天就能到手208万;没演技没人品,却坐拥亿万。
我们也可以看到,教育行业大地震、课外培训被团灭、学区房被压制……一个个阻塞的关口被打通,这是让更多人能看到希望。
同样,就在昨天(9月2日),最高层重磅发话,北京证券交易所终于要来了。不难想象,更多的中小企业,更多的“专精特新”,将分享到更多的资本机会。
先富起来的资本帮助后跑起来的企业,这本身就是共同富裕。
当然,还有一个问题:打压垄断、扶持落后,意味着“劫富济贫”吗?
当然不是。按照目前的发展水平,我们追求的共同富裕,只能是存在一定差距的共同富裕,而不是整齐划一的同等富裕。正如中央财办副主任韩文秀所说——
共同富裕要靠共同奋斗,不是全民福利,不是杀富济贫,更不是养懒汉。
目前,中国的人均GDP才刚超过1万美元,而纵观欧美那些发达国家,人均GDP基本上都是我们的3倍以上,美国的人均GDP更是达到了6万美元。
共同富裕的第一步,不是急着分蛋糕,而是先把蛋糕做大。
这一点,最重要。
转自:https://mp.weixin.qq.com/s/2wJiA47eZWGWo02p6_8Cdg
“对于那些希望他死的人,我很抱歉他的观点和意见伤害了你。”
美国德州一名致力于反口罩、反抗疫运动的领袖因感染新冠死亡。
8月28日下午3点左右,杰西卡·华莱士(Jessica Wallace)说她的丈夫在与新冠病毒进行了长达数周的斗争后还是去世了。
“凯莱布(Caleb)已经平静地去世了。他将永远活在我们的心中,”她在家庭的GoFundme活动中说道。
“我们什么时候给爸爸打电话?”
5岁的布鲁克·华莱士(Brooke Wallace)知道她爸爸病得很重。在一个闷热的下午,她坐在她的两个妹妹——奥布里(Aubrey)和凯特(Kate)——旁边的橡树树荫下,在后院的玩具架上荡秋千,直到该给她们的父亲打电话的时间。
2021年8月19日(星期四)下午5点15分左右,三姐妹的母亲杰西卡·华莱士将所有三个孩子聚集在一起,四人步行到隔壁的亲戚家。杰西卡与一岁大的凯特手牵手慢慢地走,而3岁的奥布里蹒跚地跟在姐姐布鲁克的身后。
“奥布里经常问,’爸爸在哪里,爸爸在哪里?’”杰西卡说。“而我的五岁的布鲁克,她明白发生了什么。”
孩子们坐在餐桌旁吃着巧克力冰淇淋杯,杰西卡给香农医疗中心(Shannon Medical Center)打电话。怀孕八个月的她,将一只手放在隆起的肚子上,等待与在医院COVID-19病房值班的护士交谈。
在过去的三周里,这已经成为一种日常习惯:杰西卡问护士是否可以安排与她的丈夫凯莱布·华莱士(Caleb Wallace)进行视频通话,凯莱布·华莱士自8月初因感染新冠病毒住院。
护士告诉杰西卡可以,然后挂断了电话,穿上了一套塑料PPE防护服,这是进入凯莱布房间所需的防护装备。大约五分钟后,杰西卡接听电话,视频通话开始。
“继续战斗,爸爸,”凯莱布的孩子们对着视频屏幕说:“我们想你。”
谈话是单方面的;凯莱布什么也没说。
自8月8日以来,这位30岁的三个孩子(即将成为四个孩子)的父亲一直昏迷不醒,在香农医院的重症监护病房里服用了大量镇静剂。机械呼吸机将新鲜氧气泵入他已被病毒破坏的肺部。
但这并没有阻止凯莱布的女儿们在星期四跟他聊了大约10分钟。她们告诉她们的爸,日子过得怎么样,她们有多爱和想念他,以及她们多么希望他回家。
当从桌子的另一端看着时,杰西卡仍然为她的孩子们表现得开朗乐观,告诫凯莱布不要让他的护士太辛苦。
在布鲁克和奥布里说完她们想说的并重新吃冰淇淋后,杰西卡的情绪发生了变化。到了她的时间,杰西卡拿起电话与她昏迷不醒的丈夫说话:“你需要坚持下去,”她说,眼泪哽咽着,看着屏幕上凯莱布一动不动的脸,“你需要回家看你的小女儿们。”
还未出生的婴儿艾斯丽·简·华莱士(Emsley Jean Wallace)是一只“蠕动的小虫子”,她的母亲说,她将在大约六周内出生。
杰西卡与凯莱布交谈了几分钟后,挂断了电话。她们明天还会打另一个电话——布鲁克会提醒她的。
“天晚了,我们还没有打电话,(布鲁克)立即开始问,‘我们什么时候给爸爸打电话?我们什么时候给爸爸打电话。‘我需要和医生谈谈。’布鲁克说。她需要和她谈谈医生,因为她想告诉他们‘照顾好她的爸爸’。”杰西卡说。
“她想告诉她爸爸‘继续战斗’。她每天都告诉他,她想念他,”杰西卡说。
到8月21日星期六,凯莱布在呼吸机上已经超过12天。杰西卡说,如果没有先进的医疗护理,他康复的机会“微乎其微”。
当她继续为凯莱布的完全康复祈祷时,她的孩子们并不知道,妈妈也不知道她们的爸爸是否能会回家。
德克萨斯州COVID住院率很高
像华莱士一家这样的对话在德克萨斯州更频繁地发生。该州正遭受自去年以来最严重的COVID-19病例激增之苦。
根据8月20日发布的州卫生数据,当天在24小时内报告了11,762例病例,这一数字远远超过了7月20日,即一个月前,德克萨斯州报告的大约3300例病例。
卫生官员报告说,周五有12,841名德克萨斯人因COVID-19住院,这将一些地方的医疗保健系统推向了极限,因为德州大约有3000万人,但只有330张配备人员的ICU病床了。
由于COVID-19的Delta变体像病毒野火一样在德克萨斯州燃烧,火上浇油的是该州相对较低的疫苗接种率。在所有12岁以上的德州人中,只有不到56%的人接种了疫苗。
“在康乔谷(Concho Valley),大约80%的新冠感染者没有接种疫苗,”舒尔茨说,并指出虽然一些检测呈阳性的患者已完全接种疫苗,但他们通常并不需要住院。
推动戴口罩和保持社交距离以限制COVID-19传播的卫生专家遇到了德克萨斯州立法者的抵制,例如州长格雷格·雅培(Greg Abbott),他最近本人对该病毒呈阳性反应,尽管他已接种了全面疫苗。
随着超过500万德克萨斯州学生重返公立学校,雅培目前因禁止戴口罩而面临多项法律挑战。
公共卫生与个人自由之间的斗争在汤姆格林县(Tom Green County)是一场所有人都熟悉的斗争,其中圣安吉洛居民凯莱布·华莱士发挥了很大的作用。
2020年7月4日,凯莱布帮助组织了“自由集会”。该活动的传单称这是一次和平抗议,人们“厌倦了政府控制了我们的生活”。当天抗议者举着的标语批评戴口罩、关闭企业、COVID-19背后的科学以及自由派媒体的报道。
7月4日,汤姆格林县法院没有升起美国国旗,集会参与者举起了自己的国旗。将美国国旗绑在杆子上的人就是凯莱布·华莱士。
凯莱布·华莱士(右)
“我们目前对美国目前的状况并不满意,”当时还健康的华莱士表示。
除了集会外,凯莱布还组织了“圣安吉洛自由捍卫者”组织,这是一个“教育和授权公民就地方、全州和国家政策做出明智选择,并鼓励他们积极参与保护上帝的职责和宪法赋予的权力”的团体(如该组织的Facebook页面所述)。
凯莱布使用自由捍卫者的页面和他自己的社交媒体形象,批评了政府对大流行病的处理以及健康专家倡导的指导方针。
凯莱布于2020年12月在圣安吉洛市的官方Facebook上写道:“给我看看口罩起作用的科学。给我看看学校关闭有效的证据。给我看看封锁有效的证据。”
2020年,凯莱布出现在当地媒体的视频采访中,谴责当地政府的口罩令和学校停课令。直到2021年4月,他还写了一封信,要求学区撤销所有COVID-19协议,声称科学与他们的需求相悖。
在大流行期间,自由捍卫者收集了一份圣安吉洛地区当地企业的名单,这些企业要求居民戴口罩作为进入室内的先决条件,自由捍卫者要求其成员避免在这些地点购物。
在凯莱布因COVID-19住院后不久,属于自由捍卫者的页面似乎停止更新了。
“他不想成为COVID统计数据”
7月26日,杰西卡说她的丈夫开始出现冠状病毒的症状:呼吸急促、高烧和干咳。第二天这些症状变得更糟。
杰西卡说:“每次他开始咳嗽时,都会停不下来,然后他就会完全上气不接下气。”
起初,凯莱布拒绝接受COVID-19检测或去医院。
“他太固执了,”杰西卡说,“他不想去看医生,因为他不想成为COVID检测统计数据的一部分。”
相反,凯莱布开始服用伊维菌素(一种兽用抗寄生虫药,美国食品和药物管理局此后一直敦促人们不要服用此药以对抗COVID-19)、高剂量的维生素C、阿司匹林锌,并使用吸入器。
然而,到了7月30日,凯莱布还是被一位亲戚带到了香农医疗中心的急诊室。
当天晚些时候,圣安吉洛市报告了社区中111例新的COVID-19阳性病例,以及34人因该病毒住院——凯莱布便是其中之一。
“他无法自己呼吸,”杰西卡说,“第一周他还可以吸氧。到(8月8日)早上,他就喘不上气来了。”
杰西卡将凯莱布因COVID-19住院描述为华莱士一家“令人谦卑、拓宽眼界的经历”,她说华莱士家族过去常常就“任何事情”随便争吵。
“作为一个家庭,我们现在变得更加亲密了,”杰西卡说。“我们每天都互相检查,看看我们是否还好,或者我们是否需要任何帮助。……这是我们需要认真对待的事情。这让我们意识到COVID-19的攻击是无差别的。”
杰西卡说,病毒彻底改变了她的生活。与丈夫不同的是,她要戴口罩。
“我来自边境小镇德尔里奥,我的观点不那么保守,”她说。“我不是自由主义者。我站在中间。……凯莱布会告诉我,’你知道口罩不会拯救你,’但他明白我想戴它们。这让我感到安慰,也许,只是也许,我要么是在保护某人,要么是自己在逃避。”
我们每个人都
“远多于我们政治信仰的总和”
虽然圣安吉洛的许多居民都熟悉她丈夫的政治观点,但杰西卡说,这是关于凯莱布这个人的不完整画面。她说,三个孩子的父亲会下班回家帮忙做晚饭,和女儿们在外面玩,带她们出去吃冰淇淋。
如果凯莱布迟到了,杰西卡说这通常是因为他自愿帮助教堂里的某个人,或者因为他正在修剪老人的草坪,或者帮助军人移动他们的物品。
“那只是凯莱布的天性,”杰西卡说,“归根结底,无论他是不是铁杆保守派,他都是一个了不起的人。”
杰西卡回忆起凯莱布如何在2017年为飓风哈维的受害者筹集捐款。他的努力迅速从“一辆装满补给品的拖车”发展为凯莱布帮助拖到德克萨斯州至路易斯安那州海岸的第二辆拖车。
在2021年2月的冬季风暴Uri期间,凯莱布也在那里帮助圣安吉洛的居民,此前创纪录的冰冻温度使许多人困在家里,也没有电可以使用。
抛开政治不谈,凯莱布给圣安吉洛市长布兰达·冈特(Brenda Gunter)打了电话,并提供他在危险、结冰的道路上驾驶的帮助,以帮助需要帮助的人。
冈特市长记得他们在一起的时光。
“我们花了两个半小时挨家挨户地与我们知道一段时间没有电的人联系。”冈特说。
“尽管我们在某些主题上存在分歧,但他对这座城市及其公民有着压倒性的爱。这比其他任何事情都重要,……他还是一个人,他有一个家庭,那个家庭需要他。”
杰西卡说她正在祈祷她的丈夫再次康复,但凯莱布的生存机会将归结为两个奇迹之一:要么他自己完全康复,要么他被批准接受更高级的治疗。
“最后的希望”
一种被称为ECMO机器的医疗设备是杰西卡的“最后希望”,但她迄今为止寻找可用设备的所有努力都被证明没有成功。
ECMO机器是体外膜肺氧合的简称,它的工作原理是将塑料管穿过患者的颈部、胸部或腹股沟插入大静脉和/或动脉。从本质上讲,该设备通过充当他们的心脏和肺部来帮助患者,让器官有机会休息和愈合。
截至2021年8月21日,拥有可用ECMO机器的医院数量很少,而且由于COVID-19,等候名单也已经很长。
香农医院没有ECMO机器。据世界上最大的ECMO和ECLS中心注册机构体外生命支持组织称,最近的医疗中心是COVID-19住院治疗中心,在圣安东尼奥、达拉斯和休斯顿。
“我们一直在呼吁身边的人们找到那个奇迹,”杰西卡说。“普莱诺的一家医院将(凯莱布)从他们的等候名单中删除,因为他插管时间太长了。……如果没有那台机器,医生们说凯莱布的机会’微乎其微’。”
随着华莱士一家人继续寻找ECMO机器,杰西卡说她计划继续为凯莱布而战,尽管她不确定未来会怎样。
杰西卡说:“我有三个孩子,第四个正在路上。为了让他们坚强,我会提醒她们,她们的爸爸是多么爱她们,还有这么多人多么爱她们,”杰西卡说,“我绝对不坚强,但我必须为了我的女儿们——我必须这样做。”
“令人心碎的更新”
在详细介绍了凯莱布病情逐渐改善的几天后,杰西卡在社交媒体上发布了一篇她称之为“令人心碎的更新”的帖子。
杰西卡在8月25日星期三的Facebook公开帖子中说,在他的肺部因纤维化而变得“僵硬”后,他的健康状况迅速恶化。
“他不太好。”杰西卡说。
杰西卡的帖子称,香农医院的医生给她打电话,告诉她他们对凯莱布的“选择已经用完了”,并询问她是否同意不进行抢救。
“什么时候停止治疗取决于我们,”她的帖子说。
截至8月27日星期五下午5点,没有关于凯莱布病情的进一步更新。当时,当地卫生部门没有发布与一名30多岁的汤姆格林县男子的COVID-19相关的死亡信息。
6点左右,杰西卡在GoFundMe的更新中写道:“凯莱布撑不了多久了,他明天会接受临终关怀护理,我会和他在一起,直到他回到我们天堂的父亲身边。”
她也总结了她的帖子,说:“我感谢每个人的好与坏。你们都有权感受自己的感受,因为凯莱布曾经为自己的信仰而战。他是一个不完美的人,但他爱他的家人和他的小女儿们胜过一切,”杰西卡说。
“对于那些希望他死的人,我很抱歉他的观点和意见伤害了你。我祈祷他能以新的视角和对生活的更多欣赏走出这一步。我不能说更多,因为我不能替他说话。”杰西卡说。
第二天下午3点左右,杰西卡宣布她年仅30岁的丈夫去世了。
来源:纽约时间
作者:西村
责编:田栋梁
校对:臧恒佳
制版:舒茜
转自:https://mp.weixin.qq.com/s/FPizAm0bEqSxDRiyuh3YdA