Redis 4.0鲜为人知的功能将加速您的应用程序
来源:Redislabs
作者:Kyle Davis
翻译:Kevin (公众号:中间件小哥)
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,然后查看它的性能提高。
更多优质中间件技术资讯/原创/翻译文章/资料/干货,请关注“中间件小哥”公众号!
Redis 4.0鲜为人知的功能将加速您的应用程序的更多相关文章
- 阿里云发布 Redis 5.0 缓存服务:全新 Stream 数据类型带来不一样缓存体验
4月24日,阿里云正式宣布推出全新 Redis 5.0 版本云数据库缓存服务,据悉该服务完全兼容 4.0 及早期版本,继承了其一贯的安全,稳定,高效等特点并带来了全新的 Stream 数据结构及多项优 ...
- Redis 4.0新功能介绍
Redis 的作者 antirez 在三天之前通过博客文章<The first release candidate of Redis 4.0 is out>发布了 Redis 4.0 的第 ...
- Redis 5.0新功能介绍
Redis 5.0 Redis5.0版是Redis产品的重大版本发布,我们先看一下它的最新特点: 新的流数据类型(Stream data type) https://redis.io/topics/s ...
- Redis 6.0 正式版终于发布了!除了多线程还有什么新功能?
Redis 6.0.1 于 2020 年 5 月 2 日正式发布了,如 Redis 作者 antirez 所说,这是迄今为止最"企业"化的版本,也是有史以来改动最大的一个 Redi ...
- Redis 7.0 新功能新特性总览
说明:本文根据Redis 7 RC2 的release note 整理并翻译 近日,Redis 开源社区发布了7.0的两个预览版.在这两个预览版中,有很多Redis 7.0中新增加的特性,新增加的命令 ...
- 161128、Redis 4.0发布及其新功能介绍
Redis 4.0-rc1 发布了,这是 4.0 的首个 RC 版.Redis 是一个高性能的key-value数据库.Redis 的出现,很大程度补偿了memcached这类keyvalue存储的不 ...
- Redis 6.0 新增功能 - ACL
Redis 6.0 ACL 期待已久的ACL终于来了,大家知道在redis集群中只有一个db,在多项目操作时可以通过key前缀来区分,但是还是能获取其它key,这样就带来了安全风险. Access C ...
- Redis 6.0 redis-cluster-proxy 说明
背景 Redis3.0版本之后开始支持了Redis Cluster,Redis也开始有了分布式缓存的概念.关于Redis Cluster的相关说明,可以看之前的几篇文章:Redis Cluster 原 ...
- Redis 3.0 与 3.2 配置文件变化
一.Redis3.0 与 3.2 配置文件对比 1. clone redis git clone https://github.com/antirez/redis.git 2. checkout分支 ...
随机推荐
- java架构之路-(Redis专题)聊聊大厂那些redis
上几次说了redis的主从,哨兵,集群配置,但是内部的选举一直没说,先来简单说一下选举吧. 集群选举 redis cluster节点间采取gossip协议进行通信,也就是说,在每一个节点间,无论主节点 ...
- 使用animate.css
今天有个一前辈来看了一下我的小程序啊,说写的还行就是可以不用只按照ui给的图写界面,自己可以添加一些动态的炫酷效果,不用不知道一用吓一跳啊,用之前觉得好好一个界面为什么要搞那些花里胡哨的东西,单纯一点 ...
- 用Python新建用户并产生随机密码
说明:本次代码是在Linux下执行的,windows也可以用,把添加用户密码的命令改成windows的就ok了 用Python新建用户并产生随机密码 import passwd_name as pn ...
- 快速搭建spring boot2.0 项目
快速搭建spring boot2.0+mybatis+thymeleaf 项目 使用工具STS 3.9.7(eclipse) 首先创建一个spring boot2.0项目(具体创建方法就不写了) 然后 ...
- springcloud之Feign、ribbon设置超时时间和重试机制的总结
一 超时时间配置 如果在一个微服务当中对同一个接口同时配置了Hystrix与ribbon两个超时时间,则在接口调用的时候,两个计时器会同时读秒. 比如,访问一个接口需要2秒,你的ribbon配置的超时 ...
- windows 10 环境下 使用Anaconda搭建 TensorFlow 环境
##大致步骤 1 安装Anaconda 2 在Anaconda中建立虚拟TensorFlow的虚拟环境 建立虚拟环境的命令是 conda create -n tensorflow python=3. ...
- java和Jvm目录
回到占占推荐博客索引 主要介绍java基础知识,非框架类及JVM相关的内容文章 java和Jvm目录 Java~关于开发工具和包包 Java~类,抽象类和接口 Java~时间戳小知识 Java~命名规 ...
- 前端组件用 Scope 发布 npm 包的方法
1.引言 多人.多组织或多组件发布 npm 包到同一个仓库时,可能出现命名冲突问题. 为了解决这个问题,npm 引入了“scope”(范围)概念. 在 Angular 项目中,我们通常可以看到“@an ...
- Python3获取豆瓣图书标签的前20本热门书籍(一)
介绍 第一篇主要获取豆瓣的大分类.大分类下的具体分类以及具体分类下的前20本热门书籍,第二篇对获取的数据进行分析. 准备 Python3.6.requests.BeautifulSoup4 演示 代码 ...
- 【并发编程】ThreadLocal其实很简单
什么是ThreadLocal ThreadLocal有点类似于Map类型的数据变量.ThreadLocal类型的变量每个线程都有自己的一个副本,某个线程对这个变量的修改不会影响其他线程副本的值.需要注 ...