写点什么

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

评论

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

阿里云通义大模型家族迎来新成员,通义万相已开启定向邀测~

新云力量

AI 2023人工智能大会 科技改变生活

阿里云AI绘画创作大模型通义万相亮相,已开启定向邀测!

新云力量

AI 2023人工智能大会 科技改变生活

985的分数,却毅然选择了普本。

Jackpop

C++实现读写ini配置文件

梦笔生花

做大模型不要沉迷有趣,要解决企业问题

新云力量

AI 2023人工智能大会 科技改变生活

【磁盘管理】fdisk命令 – 管理磁盘分区

百度搜索:蓝易云

Linux 命令 云服务器

上个大学,竟然被割韭菜了?

Jackpop

【Redis故障排查】「连接失败问题排查和解决」带你深入分析一下Redis阻塞原因以及问题排查方案指南

洛神灬殇

redis 分布式架构 解决方案 技术分析 性能优化分析

拼多多最新面经出炉:项目+八股+算法+场景全都问了个遍

程序员小毕

程序员 算法 高并发 项目 java面试

【文件管理】Linux系统-ls命令 – 显示指定工作目录下的文件及属性信息

百度搜索:蓝易云

Linux 服务器 云服务器 蓝易云 ls

一些容易被忽略的测试场景

QE_LAB

移动端测试 测试场景

代码随想录Day10 - 栈与队列(上)

jjn0703

某米重新定义了985。。。

Jackpop

你可能不知道现在的Java面试有多卷!

程序员小毕

程序员 高并发 架构师 java面试 八股文

具备捕获 Web2 用户能力的 PoseiSwap,治理通证$POSE再度涨超 360%

西柚子

2023-07-07:给出两个字符串 str1 和 str2。 返回同时以 str1 和 str2 作为子序列的最短字符串。 如果答案不止一个,则可以返回满足条件的任意一个答案。 输入:str1 =

福大大架构师每日一题

Go 算法 rust 福大大架构师每日一题

Linux系统使用cpulimit对CPU使用率进行限制

百度搜索:蓝易云

Linux 服务器 云服务器 蓝易云

金融时间序列预测方法合集:CNN、LSTM、随机森林、ARMA预测价格(适用于时序问题)、相似度计算、各类评判指标绘图(数学建模科研适用)

汀丶人工智能

人工智能 数据挖掘 机器学习 数学建模 LSTM

Dialpad 的“野心” ,不止于 2 亿美元 ARR

CnosDB

时序数据库 开源社区 CnosDB

阿里P6跟P7有什么区别?

程序员小毕

Java 阿里巴巴 程序员 后端 架构师

考上211,录取到天坑专业。。。

Jackpop

【文件管理】Linux系统-cp命令 – 复制文件或目录

百度搜索:蓝易云

Linux centos 服务器 云服务器 ECS

解决CentOS yum源失效问题.

百度搜索:蓝易云

Linux centos 云服务器 香港VPS服务器 蓝易云

Centos更新升级内核命令-以及区别.

百度搜索:蓝易云

Linux centos 云服务器

宝塔面板Nginx开启Brotli压缩,提升网站加载速度-【给网站提提速】

百度搜索:蓝易云

Linux CDN 云服务器 压缩 宝塔面板

手把手教学小型金融知识图谱构建:量化分析、图数据库neo4j、图算法、关系预测、命名实体识别、Cypher Cheetsheet详细教学等

汀丶人工智能

人工智能 深度学习 nlp 知识图谱 命名实体识别

机器学习洞察 | 降本增效,无服务器推理是怎么做到的?

亚马逊云科技 (Amazon Web Services)

机器学习

QEMU之CPU虚拟化(一):CPU虚拟化介绍

Linux内核拾遗

虚拟化 qemu kvm

从互联网到国企、从一线城市到三线省会

WizInfo

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