亚马逊商标备案是否必须做网站品牌设计收费标准

当前位置: 首页 > news >正文

亚马逊商标备案是否必须做网站,品牌设计收费标准,WordPress分段插件,北京装修公司口碑排名概述 Redis 被广泛应用的原因是因为它支持高性能访问。所以#xff0c;我们要重视所有可能影响 Redis 性能的因素#xff08;如命令操作、系统配置、关键机制、硬件配置等#xff09;。 影响 Redis 性能的 5 大方面的潜在因素分别是#xff1a; Redis 内部的阻塞式操作C…概述 Redis 被广泛应用的原因是因为它支持高性能访问。所以我们要重视所有可能影响 Redis 性能的因素如命令操作、系统配置、关键机制、硬件配置等。 影响 Redis 性能的 5 大方面的潜在因素分别是 Redis 内部的阻塞式操作CPU 核和 NUMA 架构的影响Redis 关键系统配置Redis 内存碎片Redis 缓冲区 1. Redis 实例有哪些阻塞点 Redis 实例要和许多对象进行交互这些不同的交互就会涉及不同的操作我们来看看客户端和 Redis 实例交互的对象以及交互时会发送的操作。 客户端网络 IO键值对增删改查操作数据库操作磁盘 生成 RDB 快照记录 AOF 日志AOF 日志重写。主从节点主库生成、传输 RDB 文件从库接收 RDB 文件、清空数据库、加载 RDB 文件切片集群实例向其他实例传输哈希槽信息数据迁移。
1.1 和客户端交互的阻塞点 网络 IO 有时候会比较慢但是 Redis 使用了 IO 多路复用机制避免了主线程一直处在等待网络连接或者请求到来的状态所以网络 IO 不是导致 Redis 阻塞的因素。 键值对的增删改查操作是 Redis 和 客户端交互的主要部分也是 Redis 主线程执行的主要任务。所以复杂度高的增删改查操作会阻塞 Redis。 判断操作复杂度有一个最基本的标准就是看操作的复杂度是否为 O(N). Redis 中涉及集合的操作复杂度通常为 O(N)所以我们要重视起来。例如集合元素全量查询 HGETALL、SMEMBERS以及集合的统计聚合操作例如求交、并和差集。这些操作可以作为 Redis 的第一个阻塞点集合的全量查询和聚合操作。 另外集合自身的删除操作同样也有潜在的阻塞风险。这是因为删除不仅仅只是把数据删除还要释放键值对占用的内存空间。 你可以不要小瞧内存释放的过程。释放内存只是第一步为了高效管理内存空间在应用程序释放时操作系统需要把释放掉的内存块插入一个空间内存块的链表以便后续进行管理和再分配。这个过程本身需要一定的时间而且会阻塞当前释放内存的应用程序所以如果一下子释放了大量的内存空闲内存块链表的操作时间就会增加相应地就会造成 Redis 主线程的阻塞。 什么时候会释放大量内存呢 其实就是在删除大量键值对数据的时候最典型的就是删除了包含了大量元素的集合也称为 bigkey 删除。下图是测试了不同元素数据的集合在进行删除操作时所消耗的时间 根据压测可以得出结论 当数据量从10 万增加到 100 万时4 大集合类型的删除时间的增长幅度从5倍上升到了近 20 倍。集合元素越大删除所花费的时间越长。当删除有 100 个元素的集合时最大删除时间已经达到了 1.9 秒Hash 类型。Redis 的响应时间一般在微妙级别所以一个操作达到近 2 秒不可避免地会阻塞主线程。 很显然Redis 的第二个阻塞点bigkey 删除操作。 删除操作对 Redis 实例性能的负面影响很大而且在实际业务开发时很容易被忽略所以移动要重视它。 既然频繁你删除键值对都是潜在的阻塞点那么Redis 的数据库级别操作中清空数据库如 FLUSHDB 和 FLUSHALL 操作必然也是一个潜在的阻塞风险因为它设计到删除和释放所有的键值对。所以Redis的第三个阻塞点清空数据库。 1.2 和磁盘交互时的阻塞点 磁盘 IO 一般都是比较耗时费力的需要重点关注。不过Redis 开发者早就认识到磁盘 IO 会带来阻塞所以就把 Redis 设计为采用子进程的方式生成 RDB 快照文件以及执行 AOF 日志重写操作。这样一来这两个操作由子进程负责执行慢速的磁盘 IO 就不会阻塞主线了。 但是Redis 直接记录 AOF 日志时会根据不同的写回策略对数据做落盘保存。一个 AOF 同步写磁盘的操作的耗时大约是 1~2 ms如果有大量的写操作需要记录在 AOF 日志中并同步写回的话就会阻塞主线程了。这就是 Redis 的第四个阻塞点 AOF 日志荣同步写。 1.3 主从节点交互时的阻塞点 主从集群中主库需要生成 RDB 文件并传输给从库。主库在复制过程中创建和传输 RDB 文件都是由子进程来完成不会阻塞主线程。但是对于从库来说它在接收了 RDB 文件后需要使用 LPUSHDB 命令清空当前数据库这就正好是刚刚分析的第三个阻塞点。 此外从库在情况当前数据库后还需要把 RDB 文件加载到内存这个过程的快慢和 RDB 文件的大小密切相关 RDB 文件越大加载过程越慢所以 加载 RDB 文件就称为了 Redis 的第五个阻塞点。 1.4 切片集群实例交互时的阻塞点 当我们部署 Redis 切片集群时每个 Redis 实例上分配的哈希槽信息需要在不同实例间进行传输同时当需要进行负载均衡或者实例增删时数据会在不同的实例间进行迁移。不过哈希槽信息量不大而数据迁移是渐进式执行的所以一般来说这两类操作对 Redis 主线程的阻塞风险不大。 不过如果你使用了 Redis Cluster 方案而且同时正好迁移的是 bigkey 的话就会造成主线程的阻塞因为 Redis Cluster 使用了同步迁移。所以你要知道当没有 bigkey 时切片集群的各实例在进行交互时不会阻塞主线程。 1.5 小结 好了经过上面分析 Redis 的各种关键操作总结下刚刚找到的阻塞点 集合全量查询和聚合操作bigkey 删除清空数据库AOF 日志同步写从库加载 RDB 文件 如果在主线程执行这些操作必然会导致主线程的阻塞。为了避免阻塞式操作Redis 提供了异步线程机制。所谓异步线程机制就是指 Redis 会启动一些子线程然后把一些任务交给这些子线程让它们在后台完成而不再由主线程来执行这些任务。使用异步线程机制执行操作可以避免阻塞主线程。 不过这个时候问题来了这五大阻塞式操作都可以被异步执行吗 2.哪些阻塞点可以异步执行 如果一个操作能被异步执行就意味着它不是 Redis 主线程的关键路径上的操作。关键路径上的操作就是客户端把请求发给 Redis 后等着 Redis 返回数据结构的操作。 主线程收到操作 1 后因为操作 1 并不用给客户端返回具体数据所以主线程可以把它交给后台子线程来完成同时只要给客户端返回一个 “OK” 结果就行。在子线程执行操作 1 的时候客户端又向 Redis 实例发送了操作 2而此时客户端需要使用操作 2 返回的数据结果的如果操作 2 不返回结果那么客户端将一直处于等待状态。 在这个例子中操作 1 就不算关键路径上的操作所以可以有后台子线程异步执行。而操作 2 需要把结果返回给客户端它就是关键路径上的操作所以主线程立即把这个操作执行完。 对于 Redis 来说读操作是典型的关键路径操作因为客户端发送了读操作之后就会等待读取数据的返回。而 Redis 的第一个阻塞点 “集合全量查询和聚合操作” 都涉及到了读操作所以它是不能进行异步操作了。 删除操作并不需要给客户端返回具体的数据结果所以不算关键路径操作。而我们刚才总结的 第二个阻塞点 “bigkey 删除”和第三个阻塞点 “清空数据库” 都是对数据做删除并不在关键路径上。因此可以使用后台子线程来异步执行删除操作。 最后我们看下“从库加载 RDB 文件”这个阻塞点。从库想要对客户端提供数据存取服务就必须把 RDB 文件加载完成所以这个操作也属于关键路径上的操作必须让从库的主线程来执行。 3.异步的子线程机制 Redis 主线程启动后会使用操作系统提供的 pthread_create 函数创建 3 个子线程分别由他们负责 AOF 日志写操作、键值对删除以及文件关闭的异步执行。 主线程通过一个链表形式的任务队列和子线程进行交互。当收到键值对删除和清空数据库的操作时主线程会把这个操作封装成一个任务放入任务队列中然后给客户端返回一个完成信息表明删除已经完成。 但实际上这个时候删除还没执行等到后台子线程从任务队列中读取数据才实际删除键值对并释放响应的内存空间。因为我们把这种异步删除也称为惰性删除lazy free。此时删除或清空操作不会阻塞主线程这就避免了对主线程的性能影响。 和惰性删除类似当 AOF 日志配置成 everysec 选项后主线程会把 AOF 写日志操作封装成一个任务也放到任务队列中。后台子线程读取任务后开始自行写入 AOF 日志这样主线程就不用一直等待 AOF 日志写完了。 下图展示了 Redis 中异步子线程执行机制。 不过有个地方需要注意下异步键值对删除和情况数据库操作是 Redis 4.0 后提供的功能Redis 也提供了新的命令来执行这两个操作。 异步键值对删除当你的集合类型中有大量元素如有百万级别或者千万级别元素需要删除时建议你使用 ULINK 命令。清空数据库可以在 FLUSHDB 和 FLUSHALL 命令后机上 AYSNC 选项这样可以让后台子线程异步地清空数据库。 FLUSHDB AYSNC FLUSHALL AYSNC4.小结 本章我们学习了 Redis 实例允许时的 4 大类交互对象客户端、磁盘、主从库实例、切片集群实例。基于这 4 大类交互对象我们梳理了会导致 Redis 性能受损的 5 大阻塞点包括集合全量查询和聚合操作、bigkey 删除、清空数据库、AOF 日志同步写以及从库加载 RDB 文件。 在这 5 大阻塞点中bigkey 删除、情况数据库、AOF 日志同步写不属于关键路径操作可以使用异步子线程机制来完成。 Redis 在运行时会创建三个子线程主线程会通过一个任务队列和三个子线程进行交互。子线程会根据任务的具体类型来执行响应的异步操作。 不过 异步删除操作是 Redis 4.0 以后才有的功能如果你使用的是 4.0 之前的版本当你遇到 bigkey 删除时给你个小建议 先使用集合类型提供的 SCAN 命令读取数据然后再次进行删除。因为 SCAN 命令可以每次只读取一部分数据并删除这样可以避免一次性删除大量 key 给主线程带来阻塞。 例如对于 Hash 类型的 bigkey 删除你可以使用 HSCAN 命令每次从 Hash 集合中获取一部分键值对如 200 个再使用 HDEL 删除这些键值对这样就可以把删除压力分摊到多次操作中那么每次删除操作的耗时就不会太长也就不会阻塞主线程了。 最后集合全量查询和聚合操作、从库加载 RDB 文件是在关键路径上无法使用异步操作来完成对于这两个阻塞点的小建议 集合全量查询和聚合操作可以使用 SCAN 命令分批读取数据再在客户端进行聚合计算。从库加载 RDB 文件把主库的数据量大小控制在 2~4GB 左右以保证 RDB 文件能以较快的速度加载。