写点什么

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:452939

评论

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

Apache Calcite SQL验证

不穿格子衬衫的程序员

数据库 大数据 SQL解析 Apche Calcite

GaussDB(for Redis)新特性发布:前缀搜索千倍提升与集群版多租隔离

华为云开发者联盟

redis GaussDB(for Redis) 缓存数据库 多租隔离 前缀搜索

元宇宙与数字经济的互相融合,PlatoFarm的通证经济模型是根本

西柚子

关于数据保护官DPO(34/100)

hackstoic

企业安全 DPO 数据保护官

守护数据安全,天翼云是认真的!

天翼云开发者社区

云计算 云服务 数据安全

钉钉宜搭发布大学生低代码实践计划,一起为公益发光发热!

一只大光圈

低代码 公益 钉钉宜搭

AIRIOT物联网低代码平台如何配置http客户端?

AIRIOT

物联网 HTTP 低代码平台

明道云APaaS在酒店业中的应用场景例举

明道云

「可视化案例Vol.4」智慧社区,引领社区管理新风向

ThingJS数字孪生引擎

工业金属零部件质检解决方案详解,让AI质检一步到位!

百度开发者中心

模块五

ASCE

Golang名库观止 | 配置解析神器viper使用详解

程序员读书

Go golng golang 面试

数据中心进入“液冷时代”,曙光引领绿色变革

BeeWorks

首次全面定义,《2022企业应用运维管理指标体系白皮书》重磅发布

博睿数据

白皮书 博睿数据

Hoo网格策略活动仍在进行中 震荡市场持续狂欢

区块链前沿News

量化策略 Hoo 网格

企评家|海信视像科技股份有限公司成长性报告简述

企评家

下个牛市,Web3世界的龙头项目PlatoFarm能否踏足山巅

BlockChain先知

一些销售术语

刘旭东

5月月更 销售术语

[ts]后台管理数据权限控制实现(无业务修改)

林逸民

typescript 工厂模式 权限控制 依赖注入

如何做好FAQ页面的设计

小炮

FAQ

【C语言】指针One之[概念、前言、内存、地址与指针、变量与地址]

謓泽

C语言 5月月更

新升级!网易数帆轻舟中间件推出运维稳定性管控服务

网易数帆

Kubernetes 运维 云原生 中间件 稳定性

Gartner发布CIO最新调研结果,可组装EBC备受瞩目

金蝶云·苍穹

全国唯一!这家企业的工业互联网平台上云啦!

天翼云开发者社区

云计算 解决方案 云服务 工业互联网 云平台

观测云社区版发布,免费体验全功能私有化实例!

观测云

运维 可观测性 可观测

当家里小神兽睡醒乱爬导致摔下床后,我决定做点啥

BUG侦探

Python OpenCV WebRTC

【刷题第六天】35. 搜索插入位置

白日梦

5月月更

企评家,专注企业评价,为企事业单位提供信息数据支撑

企评家

ElasticSearch查询流程详解

IT巅峰技术

强强联合,天翼云安全能力再升级!

天翼云开发者社区

云计算 基础设施 云服务 云安全

百度智能云特色城市业务指挥平台,助力城市管理更智能

百度开发者中心

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