写点什么

Redis 4.0 鲜为人知的功能将加速您的应用程序

  • 2019-12-09
  • 本文字数:1685 字

    阅读完需:约 6 分钟

Redis 4.0 鲜为人知的功能将加速您的应用程序

Redis 4.0 给 Redis 生态带来了一个惊人的功能:Modules(模块)。Modules 是 Redis 的一大转变,它是 Redis 内部自定义数据类型和全速计算的开放环境。但是,尽管对该版本的大多数关注都集中在 Modules 上,但新版本还引入了一个非常重要的命令,它就是游戏规则的改变者:UNLINK。


您可以使用 redis-cli 连接 redis-server 执行 info 命令,去查看当前 redis 版本中是否可以使用 UNLINK 命令。info 响应将告诉您有关服务器的所有信息。在第一部分(#Server)中,返回结果有一行值为 redis_version。如果该值大于 4.0,则可以使用 UNLINK 命令。并非所有 Redis 提供商都保持最新版本,因此最好在更改代码之前检查 redis 版本。


让我们回顾一下 Redis 的关键架构功能之一:“单线程”。Redis 在大多数情况下是一个单线程应用程序。它一次只做一件事,这样可以把这些事做的更快。多线程有点复杂,并且引入了锁和其他可能降低应用程序速度的问题。尽管 Redis(最高 4.0 版)通过多线程方式执行了少量操作,但它通常在启动另一个命令之前先要完成一个命令。


相比于快速读写,您可能会觉得使用 DEL 命令去删除一个键值不需要考虑太多,但是在很多情况下,删除数据同样很重要。与 Redis 中的大多数命令一样,DEL 命令在单个线程中运行,如果您获取一个几千字节的键值,花费不到一毫秒的时间,这是您所感知不到的。然而,当您获取的键值大小是兆字节、100 兆字节或者 500 兆字节会发生什么呢?哈希、排序、列表等数据结构会随着时间的推移而添加更多的数据进去,这样会生成一个数 GB 大小的数据集。然后用 DEL 命令去删除大 Key 时会发生什么呢?由于 Redis 是单线程操作的,处理这种请求时整个服务都处于等待中,需要等待该命令执行完成才能执行其它操作。同时,我们考虑更复杂的一种场景,这些键中保存的数据可能已经包含数以千万个微小请求,因此应用程序或操作员可能无法真正了解删除这些数据需要花费多长时间。


理智会告诉我们不要在拥有 100 万元素的排序集上运行如下这样的命令:


> ZRANGE some-zset 0 -1
复制代码


但是,在上面的 some-zset 集合中执行 DEL 命令将花费和上面一样的时间-中间没有传输开销,但是它会一直去分配内存,而且您会一直卡死在 CPU 繁忙中。在使用 UNLINK 之前,您可能会结合 SCAN 命令采用非原子性的方法进行一些少量删除,去避免这种持续分配内存的噩梦。上面无论使用哪种方式,都是让人无法接受的。


您可能已经猜到了,就是使用 UNLINK 命令来替换 DEL!从语法上讲,UNLINK 与 DEL 相同,但 UNLINK 提供了更为理想的解决方案。首先,它将键值从整个键值空间中删除。然后,在另一个线程中,它开始回收内存。从多线程的角度来看,这是一种安全的操作,因为它(在主线程中)从键空间中删除了该项,从而使 Redis 其它命令无法访问。


如果你有一个快速增长的键值-不管键值的大小如何,UNLINK 都是 O(1)操作(每个键;在主线程中)。使用 DEL 删除一个大值可能需要几百毫秒或更长时间,而 UNLINK 将在不到一毫秒的时间内完成(包括网络往返)。当然,您的服务器仍将需要花一些时间在另一个线程中重新分配该值的内存(其中的工作是 O(N),其中 N 是已删除值的分配数),但是主线程的性能不会被另一个线程中正在进行的操作严重影响到。


因此,您是否应该用 UNLINK 命令替换代码中的所有 DEL 命令?当然,在少数情况下,DEL 正是您所需要的。这里我可以想到两点:


1、 在 MULTI / EXEC 或 pipeline 中,在添加和删除大值时 DEL 命令是一种理想选择。在这种情况下,UNLINK 不会立即释放空间,并且在处理繁忙的情况下(如果内存已满),您可能会遇到麻烦。


2、 在更紧急的情况下,在无快速响应驱逐数据下您可以写入数据。


在没有极端内存限制的理想环境中,很难想到不使用 UNLINK 的情况。UNLINK 将提供更一致的行为,总体上具有更好的性能,并且代码更改非常小(如果可以在客户端中重命名命令,则无需更改)。如果 UNLINK 适合您的应用程序,请就此将您的 DEL 更改为 UNLINK,然后查看它的性能提高。


本文转载自公众号中间件小哥(ID:huawei_kevin)。


原文链接:


https://mp.weixin.qq.com/s/4odHzLpzMK0F0eQ7nFATGw


2019-12-09 16:452971

评论

发布
暂无评论
发现更多内容

2024 年 2 月 NFT 行业动态:加密货币飙升,NFT 市场调整

Footprint Analytics

blockchain NFT NFT链游

Vue3 - 表单的输入与绑定

霍格沃兹测试开发学社

图数据库基准测试 LDBC SNB 系列讲解:Schema 和数据生成的机制

NebulaGraph

图数据库 LDBC

为多渠道销售集成商品API接口

Noah

深入理解位运算符及其在JavaScript中的应用

Immerse

通过统一规划和团队整合,提升企业财务洞察

智达方通

全面预算管理 财务洞察

Python 初学者容易踩的 5 个坑

不在线第一只蜗牛

Java Python 开发语言

学编程前需要知道哪些编程语言呢?

小齐写代码

深度!10个头脑风暴必备的模板,让脑暴更高效和富有成效!

彭宏豪95

思维导图 头脑风暴 在线白板 在线协作 效率软件

一文让你知道,云计算环境下云管平台的重要性

行云管家

云计算 云服务 云管平台 云资源

印刷行业实施MES管理系统有哪些重要的意义

万界星空科技

工业互联网 制造业 mes 印刷行业 万界星空科技

充电桩组装行业生产管理MES系统解决方案

万界星空科技

制造业 生产管理系统 mes 充电桩 汽车充电桩

机器人装行业MES/低代码平台免费使用/低代码MES

万界星空科技

低代码 低代码平台 mes 万界星空科技 机器人组装

网络安全AI智能体公司「云起无垠」获数千万元天使+轮融资,致力于大模型与网络安全深度融合的技术研究

云起无垠

火山引擎“数据飞轮”助力哪吒汽车智能创新

极客天地

WebRTC构建点对点的即时通讯工具

鲸品堂

工具 企业号 3 月 PK 榜

探索PyTorch:介绍及常用工具包展示

霍格沃兹测试开发学社

新一代实时数据集成框架 Flink CDC 3.0 —— 核心技术架构解析

Apache Flink

实例带你了解GaussDB数据库的LOCK TABLE

华为云开发者联盟

数据库 后端 华为云 华为云GaussDB 华为云开发者联盟

RDS for MariaDB“智能DBA助手”,让运维效率嗖嗖地!

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟

Redis 4.0 鲜为人知的功能将加速您的应用程序_文化 & 方法_中间件小哥_InfoQ精选文章