Redis性能优化——针对实习面试

目录

  • Redis性能优化
    • 什么是bigkey?
    • bigkey的危害?
    • 如何处理bigkey?
    • 什么是hotkey?
    • hotkey的危害?
    • 如何处理hotkey?
    • 如何处理大量key集中过期问题?
    • 什么是内存碎片?
    • 为什么会有Redis内存碎片?
    • 如何处理Redis内存碎片?

Redis性能优化

在这里插入图片描述

什么是bigkey?

在Redis中,所谓的"bigkey"指的是那些占用较大空间的键值对。这些键因为包含了大量的数据,可能会对Redis的性能和内存使用产生显著影响。具体来说,bigkey主要体现在两个方面:

  1. 字符串类型的bigkey:如果一个键对应的字符串类型的值过大,一般认为超过10KB就可以被视为bigkey
  2. 非字符串类型的bigkey:对于哈希(hash)、列表(list)、集合(set)、有序集合(zset)等非字符串类型的键,如果它们包含的元素数量超过了一定阈值(通常认为是5000个元素),也可以被认为是bigkey

bigkey的危害?

关于bigkey的危害,以下是最重要的几点,并伴有实例以增强说服力:

  1. 内存空间使用不均匀:在Redis集群中,bigkey可能导致各个节点的内存空间使用不均匀,这可能会引发节点间的负载不均衡,影响整体性能。
    例如:如果一个节点存储了一个非常大的列表或哈希表,它可能会占用该节点的大部分内存,导致其他节点的内存使用相对较低,从而影响集群的内存分配和数据均衡。

  2. 超时阻塞:由于Redis是单线程的,对bigkey的操作通常会比较耗时,这可能导致后续的请求被阻塞,增加Redis的响应时间,严重时可能导致服务不可用。
    例如:如果一个bigkey是一个包含数百万元素的列表,执行LRANGE操作可能会非常耗时,导致其他请求无法及时处理。

  3. 网络拥塞:每次获取bigkey会产生较大的网络流量。假设一个bigkey为1MB,每秒访问量为1000,那么每秒就会产生1000MB的流量,这对于普通的千兆网卡(128MB/s)的服务器来说是灾难性的。
    例如:如果服务器采用单机多实例的部署方式,一个bigkey可能会对其他实例造成影响,进一步加剧网络拥塞的问题。

  4. 过期删除时的阻塞:如果bigkey设置了过期时间,当过期后,如果没有使用Redis 4.0的过期异步删除功能,bigkey的删除操作可能会阻塞Redis,导致性能下降。
    例如:一个大型的有序集合(zset)如果设置了过期时间,其删除操作可能会占用大量CPU和内存资源,影响其他操作的执行。

如何处理bigkey?

在实际开发中,处理Redis中的bigkey是非常重要的,以下是最重要的几点处理方法,并伴有实例以增强说服力:

  1. 分割大key
    将一个bigkey拆分成多个小key,可以减少单个key对内存的占用和操作的耗时。
    例如,如果有一个包含上百万粉丝的社交类bigkey,可以通过用户ID进行哈希,将粉丝列表分散存储到多个keys中。

  2. 手动清理无效数据
    对于list和set类型的bigkey,可以定期清理无效数据
    例如,如果一个列表存储了大量不再需要的数据,可以逐步删除这些数据,以减少内存占用。

  3. 压缩对应的BigKey的value
    如果bigkey的value很大,可以通过序列化压缩的方法减小value的大小。如果压缩后仍然很大,则需要考虑拆分。

  4. 监控Redis中内存,带宽,增长率
    通过监控系统监控Redis中的内存占用大小网络带宽的占用大小,以及固定时间内的内存占用增长率,当超过设定的阈值时进行报警通知处理。

  5. 使用合适的数据结构
    选择合适的数据结构可以避免bigkey的产生。
    例如,使用HyperLogLog统计页面UV,使用Bitmap保存状态信息(0/1)。

  6. 开启lazy-free(惰性删除/延迟释放)
    Redis 4.0开始引入的lazy-free特性,指的是让Redis采用异步方式延迟释放key使用的内存,将该操作交给单独的子线程处理,避免阻塞主线程。

  7. 避免使用全数据查询命令
    如果必须使用bigkey,那么操作时应该避开全数据查询的命令,如hgetall、lrange、smembers、zrange等,可以使用hscan、sscan、zscan代替进行遍历。

  8. 合理使用数据类型
    设计阶段就应该尽量避免bigkey,所以选择合适的数据类型尤为重要。
    例如,将多个字段存储在一个hash中,而不是分散在多个keys中。

以上方法可以配合使用,以确保Redis的性能和稳定性。在实际应用中,处理bigkey需要根据具体情况灵活选择策略。

什么是hotkey?

在Redis中,hotkey是指被频繁访问的键(key),这种情况通常出现在客户端频繁查询、读取或写入同一个key时。以下是hotkey的几个重要特点及其产生的原因:

什么是Hotkey

Hotkey即Redis实例中的热点数据,当客户端频繁访问同一个key时,该key被称为hotkey。

Hotkey的出现原因

  1. 高访问频率:某个key因为业务逻辑需要被频繁访问,例如电商平台中的热门商品信息。
  2. 业务活动:特定的营销活动或事件导致某些数据被集中访问,如秒杀活动的商品信息。
  3. 机器人或爬虫访问自动化脚本频繁访问特定key,如用户行为分析中的userId或ip。

实例

假设一个电商平台在进行“双11”大促,某个爆款商品的库存信息存储在Redis中。如果这个商品的SKU ID对应的key被频繁查询,那么这个key就成为了hotkey。这可能导致该实例的网络流量激增,影响其他key的访问,甚至可能导致数据库因为请求过多而压力过大,出现服务不稳定的情况。

hotkey的危害?

Hotkey在Redis中指的是被频繁访问的键,这种频繁的访问可能会对系统性能和稳定性造成影响。以下是hotkey最重要的几点危害:

  1. 资源竞争和性能瓶颈

    • 当一个key被频繁访问时,它会占用大量的CPU和内存资源,导致Redis服务器在处理这个key时出现性能瓶颈。这会降低Redis处理其他请求的能力,影响整体性能。
  2. 缓存击穿风险

    • 如果hotkey设置了过期时间并在到期时被清除,而此时有大量请求尝试访问这个key,这些请求将直接穿透缓存到达后端数据库,可能导致数据库压力骤增,甚至崩溃
  3. 主从同步延迟

    • 在主从复制的环境中,hotkey的频繁更新可能会导致主从同步延迟,因为从节点需要时间来复制主节点的数据变更。这可能会导致数据不一致的问题,尤其是在写入频繁的情况下。
  4. 数据倾斜

    • 在Redis集群环境中,hotkey可能导致数据倾斜,即某些节点因为hotkey的存在而承受更多的请求压力,而其他节点则相对较轻。这种不均衡的负载分布可能会影响集群的扩展性和容错能力
  5. 网络拥塞

    • 频繁访问hotkey可能会导致网络拥塞,尤其是在主从复制或集群节点间同步数据时。这不仅影响Redis内部的数据传输,也可能影响到其他服务的正常运行。
  6. 系统稳定性风险

    • hotkey的存在可能会成为系统的一个单点故障。如果处理hotkey的节点出现故障,可能会导致服务中断,影响整个系统的稳定性。

如何处理hotkey?

处理Redis中的hotkey是确保系统稳定性和性能的重要步骤。以下是最重要的几点处理方法,以及相应的详细说明和实例:

  1. 使用redis-cli --hotkeys命令定位Hotkey

    • 从Redis 4.0.3版本开始,Redis引入了hotkeys命令来帮助定位访问频率最高的键。这个命令可以实时提供热点键的信息,但它可能对性能产生影响,因此不推荐在生产环境频繁执行
  2. TCP抓包分析

    • 使用ELK提供的packetbeat抓包插件对Redis的TCP报文进行抓包与分析,可以做到对业务端无侵入性、对Redis实例本身性能无影响。
  3. 多级缓存策略

    • 对于定位到的Hotkey,可以灵活调整缓存策略,比如客户端本地+分布式缓存、全局缓存+局部缓存等,以减轻单个Redis实例的压力。
  4. 监控优化

    • 完善监控与告警,多维度分析Hotkey场景下机器的QPS、内存、网络等资源的使用情况。当达到策略阈值时,可以配合自动化运维增加扩容、调整缓存配置、slot迁移等策略。
  5. 根据业务拆分子key

    • 对于数量较少且可以对key或value自身进行拆分的情况,可以将Hotkey尽量分散落到不同的实例上,减轻单个实例的压力。
  6. 缓存策略与TTL优化

    • 合理配置TTL,并使用适当的缓存策略,如LRU(Least Recently Used)或LFU(Least Frequently Used),以便自动淘汰冷数据并保留热点数据,避免Hotkey过期导致频繁的缓存击穿的情况。

实例
假设一个电商平台在“双11”大促期间,某个爆款商品的库存信息存储在Redis中,该key被频繁查询,成为hotkey。可以采取以下措施:

  • 使用redis-cli --hotkeys命令来识别这个hotkey。
  • 实施多级缓存策略,将该商品的库存信息同时存储在本地缓存和Redis中,减少对Redis的直接访问。
  • 监控优化,通过监控系统实时监控该key的访问频率和相关资源使用情况,一旦检测到异常,自动执行扩容或迁移操作。
  • 拆分子key,如果该商品的库存信息可以拆分,比如按照颜色或尺码,可以将原始key拆分为多个子key,分散访问压力。
  • 缓存策略与TTL优化,为该key设置一个合理的过期时间,并采用LRU或LFU策略,确保热点数据始终被缓存,同时淘汰访问频率低的数据。

通过这些方法,可以有效地处理Redis中的hotkey问题,保证系统的稳定性和响应速度。

如何处理大量key集中过期问题?

处理大量key集中过期的问题是Redis性能优化中的一个重要方面,以下是最重要的几点处理方法:

  1. 设置随机过期时间

    • 说明:为了避免大量key在同一时间过期,可以为key设置随机的过期时间。这样可以有效分散过期key的处理压力,减少Redis在某个时间点的负载。
    • 实例:假设有一个电商平台的优惠券系统,优惠券通常在特定时间过期。如果所有优惠券都设置为午夜12点过期,那么可能会导致Redis在午夜时分承受巨大压力。通过为每个优惠券设置一个随机的过期时间,比如在午夜前后的几分钟内,可以有效地分散过期key的处理压力。
  2. 开启lazy-free(惰性删除/延迟释放)

    • 说明:Redis 4.0引入了lazy-free特性,允许Redis以异步方式延迟释放key使用的内存,将该操作交给单独的子线程处理,避免阻塞主线程。
    • 实例:在一个高流量的新闻网站中,每篇文章的阅读次数存储在Redis中,并设置了一个较短的过期时间。如果大量文章在同一时间过期,开启lazy-free可以避免主线程被过期key的处理阻塞,从而保持Redis的响应速度。
  3. 使用多级缓存策略

    • 说明:通过在客户端本地缓存和分布式缓存之间灵活调整,可以减轻单个Redis实例的压力。
    • 实例:在一个大型社交网络中,用户的会话信息存储在Redis中。通过在用户的手机应用中实现本地缓存,并结合分布式缓存,可以减少对Redis的直接访问,从而降低单个key的过期处理压力。
  4. 监控优化和自动化运维

    • 说明:对Redis实例所在机器完善监控与告警,多维度分析机器的QPS、内存、网络等资源的使用情况。当达到策略阈值时,可以配合自动化运维进行扩容、调整缓存配置、slot迁移等策略。
    • 实例:在一个电商平台中,可以监控Redis实例的内存使用情况和请求量。当检测到某个实例的内存使用接近上限或者请求量激增时,自动触发扩容操作或者迁移部分数据到其他实例,以保持系统的稳定性和性能。
  5. 根据业务拆分子key

    • 说明:适用于key的数量较少且可以对key或value自身进行拆分的情况,使hotkey尽量分散落到不同的实例上。
    • 实例:在一个视频平台上,每个视频的观看次数存储在Redis中。如果某个视频非常热门,可以将其观看次数拆分到多个key中,比如按照日期或者观看来源拆分,以减少单个key的过期处理压力。

什么是内存碎片?

内存碎片(Memory Fragmentation)是指在计算机系统中,由于内存分配和释放不连续,导致内存中存在许多小的、不连续的空闲区域,这些区域太小而无法被有效利用,但总体上它们加起来可能占据了相当一部分的内存空间。内存碎片主要分为两种类型:

  1. 内部碎片(Internal Fragmentation)

    • 这种碎片发生在内存块内部,当分配的内存块比所需的稍大时,多余的部分就形成了内部碎片。例如,一个程序申请了128KB的内存,但实际只需要120KB,那么剩下的8KB就成为了内部碎片。
  2. 外部碎片(External Fragmentation)

    • 这种碎片发生在内存块之间,当内存中的空闲区域被分割成多个小的、不连续的块时,这些小的空闲块太小而无法满足新的内存申请请求,即使总的空闲内存足够大,也会导致无法分配内存的情况,这就是外部碎片。

内存碎片的问题在于,它降低了内存的有效利用率,可能导致系统虽然显示有足够的空闲内存,但仍然无法分配新的内存请求,最终可能导致内存耗尽的情况。在操作系统和内存管理中,内存碎片是一个需要被管理和优化的问题。

在Redis这样的内存数据库中,内存碎片也是一个需要关注的问题,因为Redis使用内存来存储数据,如果存在大量的内存碎片,可能会导致内存使用效率低下,影响性能。Redis通过使用不同的数据结构和内存分配策略来尽量减少内存碎片的影响。

为什么会有Redis内存碎片?

Redis内存碎片的产生主要有以下几个原因:

  1. 数据类型差异与分配策略

    • Redis支持多种数据类型,每种数据类型的内部实现和内存分配策略不同,导致内存分配与释放过程中可能出现不连续、不规则的空闲空间。例如,当删除一个大键值对后,原占用的空间可能无法被较小的新数据完全填充,形成内部碎片。
  2. 动态调整数据大小

    • Redis中某些数据类型(如字符串、哈希表)允许动态调整大小。当数据增长超过原有分配空间时,Redis会重新分配更大的内存块,并将旧数据复制到新空间,释放旧空间。若新分配的空间远大于实际所需,或者频繁发生此类操作,会加剧内存碎片的产生。
  3. 过期键清理与主动淘汰

    • Redis支持设置键的过期时间。当键过期后,其占用的内存空间会被释放,形成空洞。此外,当Redis遇到内存不足的情况,会启动主动淘汰策略(如LRU、LFU),移除部分键值对以释放内存。这些操作可能导致内存碎片的产生。
  4. 内存分配策略

    • 不同的内存分配策略对内存碎片的影响不同。Redis默认使用jemalloc作为内存分配器,jemalloc在处理大规模内存分配时,可能会导致碎片的积累。
  5. 频繁的键值对操作

    • Redis主要通过mallocfree函数来分配和释放内存。当Redis中的数据频繁更新或删除时,内存分配和释放操作频繁进行,容易导致内存碎片的产生。
  6. 不同数据结构的混用

    • Redis支持多种数据结构,这些数据结构在内存中的分布方式不同,混用这些数据结构可能导致内存分配的不连续性,从而产生碎片。

如何处理Redis内存碎片?

处理Redis内存碎片可以采取以下几种方法:

  1. 调整jemalloc参数

    • Redis默认使用jemalloc作为内存分配器,通过调整jemalloc的参数可以优化内存分配策略,减少内存碎片。例如,可以调整垃圾回收频率和碎片合并策略等参数。
  2. 触发手动内存整理

    • 通过执行MEMORY PURGE命令,可以主动清理未使用的内存,减少内存碎片
  3. 重启Redis实例

    • 重启Redis实例是最简单有效的方式之一。重启过程中,Redis会将内存中的数据重新加载到新的内存块中,从而减少内存碎片。
  4. 数据迁移

    • 通过主从复制或者集群分片的方式,将数据迁移到新的实例中。新的实例会重新分配内存,从而减少碎片。
  5. 定期整理大对象

    • 对于大对象的数据,可以考虑定期进行整理。例如,可以通过分批次删除和重新插入的方式,减少内存碎片的产生。
  6. 优化数据结构

    • 了解并利用Redis各种数据类型及编码方式的特点,可以减少内存碎片的产生。例如,使用整数集合(IntSet)代替集合(Set)存储整数值,使用ziplist编码的哈希表和列表存储小数据。
  7. 升级到Redis 6.0及以上版本

    • Redis 6.0及以上版本提供了更多的内存管理功能和优化,有助于减少内存碎片。
  8. 开启active-defrag特性

    • Redis 4.0-RC3版本开始引入了active-defrag特性,可以在不重启的情况下,自动进行碎片清理。通过设置config set activedefrag yes来开启此特性。需要注意的是,自动清理内存碎片的功能需要Redis的内存分配器是jemalloc时才能启用。
  9. 合理设置数据过期策略

    • 使用EXPIRE命令为键设置过期时间,或者使用Redis的过期策略,如LRU(Least Recently Used)淘汰策略、LFU(Least Frequently Used)淘汰策略等,定期清理过期或不再使用的数据。

通过上述方法,可以有效地处理Redis中的内存碎片问题,保持系统的稳定性和性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/473192.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

牛客挑战赛77

#include <iostream>// 函数 kXOR&#xff1a;计算两个数在 k 进制下的异或和 // 参数&#xff1a; // a: 第一个正整数 // b: 第二个正整数 // k: 进制基数 // 返回值&#xff1a; // 两数在 k 进制下的异或和&#xff08;十进制表示&#xff09; long long kXO…

开源共建 | 长安链开发常见问题及规避

长安链开源社区鼓励社区成员参与社区共建&#xff0c;参与形式包括不限于代码贡献、文章撰写、社区答疑等。腾讯云区块链王燕飞在参与长安链测试工作过程中&#xff0c;深入细致地总结了长安链实际开发应用中的常见问题及其有效的规避方法&#xff0c;相关内容多次解答社区成员…

EWM 打印

目录 1 简介 2 后台配置 3 主数据 4 业务操作 1 简介 打印即输出管理&#xff08;output management&#xff09;利用“条件表”那一套理论实现。而当打印跟 EWM 集成到一起时&#xff0c;也需要利用 PPF&#xff08;Post Processing Framework&#xff09;那一套理论。而…

LLaMA-Factory全流程训练模型

&#x1f917;本文主要讲述在docker下使用LLaMA-Factory训练推理模型。 &#x1fae1;拉取镜像 首先需要启动docker&#xff0c;然后在终端中输入&#xff1a; docker run -tid --gpus all -p 8000:8000 --name LLM -e NVIDIA_DRIVER_CAPABILITIEScompute,utility -e NVIDIA…

WebSocket简易聊天室实现(有详细解释)

完整代码 Arata08/online-chat-demo 服务端: 1.编写配置类&#xff0c;扫描有 ServerEndpoint 注解的 Bean import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.s…

Excel超级处理器:高效实现2种批量生成二维码方式

在Excel数据处理中&#xff0c;二维码的批量生成是一个常见且重要的需求。借助Excel超级处理器这一强大的插件&#xff0c;用户可以轻松实现二维码的两种主要批量生成方式&#xff1a;直接在单元格中显示二维码图片&#xff0c;以及直接生成二维码图片并保存在文件夹中。超级处…

Linux Android 正点原子RK3568替换开机Logo完整教程

0.这CSDN是有BUG吗?大家注意:表示路径的2个点号全都变成3个点号啦! 接下来的后文中,应该是2个点都被CSDN变成了3个点: 1.将这两个 bmp 图片文件720x1280_8bit拷贝到内核源码目录下,替换内核源码中默认的 logo 图片。注意:此时还缺少电量显示图片 2.编译内核 make d…

性能高于Transformer模型1.7-2倍,彩云科技发布基于DCFormer架构通用大模型云锦天章

2017年&#xff0c;谷歌发布《Attention Is All You Need》论文&#xff0c;首次提出Transformer架构&#xff0c;掀开了人工智能自然语言处理&#xff08;NLP&#xff09;领域发展的全新篇章。Transformer架构作为神经网络学习中最重要的架构&#xff0c;成为后来席卷全球的一…

函数指针示例

目录&#xff1a; 代码&#xff1a; main.c #include <stdio.h> #include <stdlib.h>int Max(int x, int y); int Min(int x, int y);int main(int argc, char**argv) {int x,y;scanf("%d",&x);scanf("%d",&y);int select;printf(&q…

【书生大模型实战营 闯关材料】入门岛:第4关 玩转HF/魔搭/魔乐社区

2.1.2-2.1.3 InternLM 模型下载 模型下载 使用Hugging Face平台、魔搭社区平台&#xff08;可选&#xff09;和魔乐社区平台&#xff08;可选&#xff09;下载文档中提到的模型&#xff08;至少需要下载config.json文件、model.safetensors.index.json文件&#xff09;&#x…

Android - Pixel 6a 手机OS 由 Android 15 降级到 Android 14 操作记录

Pixel 6a 手机由 Android 14 升级到 Android 15了&#xff0c;但是由于一些原因又想降级回 Android 14&#xff0c; 能降吗&#xff1f;该怎么降级呢&#xff1f;本篇文章来记述实际操作过程&#xff0c;希望能给想做相同操作的人一些帮助。 答案当然是能降&#xff0c;而且我…

python-文件内容操作

文章目录 文件的介绍文件的理解文件操作基本知识文件对象属性与常用方法文件的读取文件的写入**上下文管理语句 with****读CSV文件**二维数据的存储从CSV格式的文件中读取数据将数据写入CSV格式的文件 读取Excel格式数据文件(pandas库)读取Excel格式数据文件(pandas库) 文件的介…

《操作系统 - 清华大学》3 -3:连续内存分配:内存碎片与分区的动态分配

文章目录 0. 概述1. 内存碎片问题2. 动态分配3. 首次适配算法4. 最优适配算法5. 最差适配算法 0. 概述 内存分配是操作系统管理过程中很重要的环节&#xff0c;首先需要考虑的是一块连续区域分配的过程&#xff0c;这个过程中会有很多问题&#xff0c;首先比较关注的一个问题是…

7.高可用集群架构Keepalived双主热备原理

一. 高可用集群架构Keepalived双主热备原理 (1)主机+备机keepalived配置(192.168.1.171) ! Configuration File for keepalivedglobal_defs {# 路由id:当前安装keepalived节点主机的标识符,全局唯一router_id keep_101 } #计算机节点(主机配置) vrrp_instance VI_1 {</

Notepad++的完美替代

由于Notepad的作者曾发表过可能在开发者代码中植入恶意软件的言论&#xff0c;他备受指责。在此&#xff0c;我向大家推荐一个Notepad的完美替代品——NotepadNext和Notepad--。 1、NotepadNext NotepadNext的特点&#xff1a; 1、跨平台兼容性 NotepadNext基于Electron或Qt…

【Chapter 3】Machine Learning Classification Case_Prediction of diabetes-XGBoost

文章目录 1、XGBoost Algorithm2、Comparison of algorithm implementation between Python code and Sentosa_DSML community edition(1) Data reading and statistical analysis(2)Data preprocessing(3)Model Training and Evaluation(4)Model visualization 3、summarize 1…

Linux(CentOS)安装达梦数据库 dm8

CentOS版本&#xff1a;CentOS 7&#xff0c;查看操作系统版本信息&#xff0c;请查阅 查看Linux内核版本信息 达梦数据库版本&#xff1a;dm8 一、获取 dm8 安装文件 1、下载安装文件 打开达梦官网&#xff1a;https://www.dameng.com/ 下载的文件 解压后的文件 2、上传安…

ReactPress与WordPress:两大开源发布平台的对比与选择

ReactPress与WordPress&#xff1a;两大开源发布平台的对比与选择 在当今数字化时代&#xff0c;内容管理系统&#xff08;CMS&#xff09;已成为各类网站和应用的核心组成部分。两款备受欢迎的开源发布平台——ReactPress和WordPress&#xff0c;各自拥有独特的优势和特点&am…

前后端请求响应

引入 在之前的例子中&#xff0c;我们编写了一个简单的web类&#xff0c;我们运行启动类&#xff0c;启动内嵌的tomcat后就可以在浏览器通过特定的路径访问tomcat中的应用程序。 但之前编写的程序仅仅是个简单的java类&#xff0c;其并未实现某个接口或继承某个类&…

Ubuntu24 上安装搜狗输入法

link 首先在终端中依次输入以下代码 sudo apt update sudo apt install fcitx 找到语言支持 在终端中依次输入 sudo cp /usr/share/applications/fcitx.desktop /etc/xdg/autostart/ sudo apt purge ibus 进入网页 搜狗输入法linux-首页​ shurufa.sogou.com/linux 找到刚才下…