Redis5.0支持的新特性说明

本文内容来自华为云帮助中心

华为云DCS的Redis5.x版本继承了4.x版本的所有功能增强以及新的命令,同时还兼容开源Redis5.x版本的新增特性。

Stream数据结构

Stream是Redis 5.0引入的一种新数据类型,它是一个全新的支持多播的可持久化消息队列。

点击下方链接,可以了解更多详情。

https://www.huaweicloud.com/product/dcs.html

Redis Stream的结构示意图如图7-1所示,它是一个可持久化的数据结构,用一个消息链表,将所有加入进来的消息都串起来。

Stream数据结构具有以下特性

  1. Stream中可以有多个消费者组。
  2. 每个消费组都含有一个Last_delivered_id,指向消费组当前已消费的最后一个元素(消息)。
  3. 每个消费组可以含有多个消费者对象,消费者共享消费组中的Last_delivered_id,相同消费组内的消费者存在竞争关系,即一个元素只能被其中一个消费者进行消费。
  4. 消费者对象内还维持了一个Pending_ids,Pending_ids记录已发送给客户端,但是还没完成ACK(消费确认)的元素id。
  5. Stream与Redis其他数据结构的比较,见表7-4。

图1-1 Stream数据结构示意图

表1-1 Stream与Redis现有数据结构比较

Stream

List, Pub/Sub, Zset

获取元素高效,复杂度为O(logN)

List获取元素的复杂度为O(N)

支持offset,每个消息元素有唯一id。不会因为新元素加入或者其他元素淘汰而改变id。

List没有offset概念,如果有元素被逐出,无法确定最新的元素

支持消息元素持久化,可以保存到AOF和RDB中。

Pub/Sub不支持持久化消息。

支持消费分组

Pub/Sub不支持消费分组

支持ACK(消费确认)

Pub/Sub不支持

Stream性能与消费者数量无明显关系

Pub/Sub性能与客户端数量正相关

允许按时间线逐出历史数据,支持block,给予radix tree和listpack,内存开销少。

Zset不能重复添加相同元素,不支持逐出和block,内存开销大。

不能从中间逐出消息元素。

Zet支持删除任意元素

Stream相关命令介绍

接下来按照使用流程中出现的顺序介绍Stream相关命令。详细命令见表7-5

  1. 首先使用XADD添加流元素,即创建Stream,添加流元素时可指定消息数量最大保存范围。
  2. 然后通过XGROUP创建消费者组。
  3. 消费者使用XREADGROUP指令进行消费。
  4. 客户端消费完毕后使用XACK命令确认消息已消费成功。

图1-2 Stream相关命令介绍

表1-2 Stream的详细命令

命令

说明

语法

XACK

从流的消费者组的待处理条目列表(简称PEL)中删除一条或多条消息。

XACK key group ID [ID ...]

XADD

将指定的流条目追加到指定key的流中。 如果key不存在,作为运行这个命令的副作用,将使用流的条目自动创建key。

XADD key ID field string [field string ...]

XCLATM

在流的消费者组上下文中,此命令改变待处理消息的所有权, 因此新的所有者是在命令参数中指定的消费者。

XCLAIM key group consumer min-idle-time ID [ID ...] [IDLE ms] [TIME ms-unix-time] [RETRYCOUNT count] [FORCE] [JUSTID]

XDEL

从指定流中移除指定的条目,并返回成功删除的条目的数量,在传递的ID不存在的情况下, 返回的数量可能与传递的ID数量不同。

XDEL key ID [ID ...]

XGROUP

该命令用于管理流数据结构关联的消费者组。使用XGROUP你可以:

l  创建与流关联的新消费者组。

l  销毁一个消费者组。

l  从消费者组中移除指定的消费者。

l  将消费者组的最后交付ID设置为其他内容。

XGROUP [CREATE key groupname id-or-$] [SETID key id-or-$] [DESTROY key groupname] [DELCONSUMER key groupname consumername]

XINFO

检索关于流和关联的消费者组的不同的信息。

XINFO [CONSUMERS key groupname] key key [HELP]

XLEN

返回流中的条目数。如果指定的key不存在,则此命令返回0,就好像该流为空。

XLEN key

XPENDING

通过消费者组从流中获取数据。检查待处理消息列表的接口,用于观察和了解消费者组中哪些客户端是活跃的,哪些消息在等待消费,或者查看是否有空闲的消息。

XPENDING key group [start end count] [consumer]

XRANGE

返回流中满足给定ID范围的条目。

XRANGE key start end [COUNT count]

XREAD

从一个或者多个流中读取数据,仅返回ID大于调用者报告的最后接收ID的条目。

XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...]

XREADGROUP

XREAD命令的特殊版本,指定消费者组进行读取。

XREADGROUP GROUP group consumer [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...]

XREVRANGE

与XRANGE相同,但显著的区别是以相反的顺序返回条目,并以相反的顺序获取开始-结束参数

XREVRANGE key end start [COUNT count]

XTRIM

XTRIM将流裁剪为指定数量的项目,如有需要,将驱逐旧的项目(ID较小的项目)。

XTRIM key MAXLEN [~] count

消息(流元素)消费确认

Stream与相比Pub/Sub,不仅增加消费分组模式,还支持消息消费确认。

当一条消息被某个消费者调用XREADGROUP命令读取或调用XCLAIM命令接管的时候, 服务器尚不确定它是否至少被处理了一次。 因此,一旦消费者成功处理完一条消息,它应该调用XACK知会Stream,这样这个消息就不会被再次处理, 同时关于此消息的PEL(pending_ids)条目也会被清除,从Redis服务器释放内存

某些情况下,因为网络问题等,客户端消费完毕后没有调用XACK,这时候PEL内会保留对应的元素ID。待客户端重新连上后,XREADGROUP的起始消息ID建议设置为0-0,表示读取所有的PEL消息及自last_id之后的消息。同时,消费者消费消息时需要能够支持消息重复传递。

图1-3 ACK机制解读

内存使用优化

Redis5.x在上一版本基础上,在内存使用上做了进一步优化。

l   主动碎片整理

当key被频繁修改,value长度不断变化时,Redis会为key分配新的内存空间。由于Redis追求高性能,实现了自己的内存分配器来管理内存,因此并不会将原有内存释放给OS,从而导致出现内存碎片。当used_memory_rss/used_memory高于1.5,一般认为内存碎片占比过高,内存利用率低。

因此,合理规划和使用缓存数据,规范数据写入,有助于减少内存碎片的产生。

Redis3.x及以下:可以通过定期重启服务解决内存碎片问题。建议实际缓存数据不超过配置可用内存的50%。

Redis4.x:支持主动整理内存碎片,服务在运行期间进行自动内存碎片清理。同时Redis4.x支持通过memory purge命令手动清理内存碎片。

Redis5.0:增强版主动碎片整理,配合Jemalloc版本更新,更快更智能,延时更低。

l   HyperLogLog算法优化

HyperLogLog是一种基数计数方法,使用少量的内存空间完成海量数据的计数统计,在Redis5.0中,HyperLogLog算法得到改进,优化了计数统计时的内存使用效率。

举个例子:B树计数效率非常高,但是内存消耗也比较多。而HyperLogLog可节省大量存储空间。当B树需要1M内存统计,HyperLogLog只需要1kb。

l   内存信息统计报告能力增强

INFO命令返回信息更加详实。

命令新增和优化

  1. 客户端管理增强

−           Redis-cli支持集群管理

在Redis4.x以及之前版本,需要安装redis-trib模块,管理集群。

Redis5.0对Redis-cli做了优化,集成了集群的所有管理功能。具体使用可以通过命令redis-cli --cluster help查看帮助信息。

−           优化客户端在频繁连接与中断场景下的性能

当您的应用需要使用短连接时,这个优化价值凸显。

  1. 有序集合使用更简单

有序集合新增两个命令:ZPOPMIN和ZPOPMAX。

−           ZPOPMIN key [count]

删除并返回有序集合key中的最多count个具有最低得分的成员。如果返回多个成员,也会按照得分高低(value值比较),从低到高排列。

−           ZPOPMAX key [count]

删除并返回有序集合key中的最多count个具有最高得分的成员。如果返回多个成员,也会按照得分高低(value值比较),从高到低排列。

  1. help增加更多子命令说明

支持help直接查看快速使用攻略,你不再需要每次登陆redis.io去查找。例如,命令行输入stream使用攻略:xinfo help

127.0.0.1:6379> xinfo help
1) XINFO <subcommand> arg arg ... arg. Subcommands are:
2) CONSUMERS <key> <groupname> -- Show consumer groups of group <groupname>.
3) GROUPS <key> -- Show the stream consumer groups.
4) STREAM <key> -- Show information about the stream.
5) HELP -- Print this help.
127.0.0.1:6379>

  

  1. Redis-cli命令输入提示

Redis-cli在输入完整的命令后,会展示参数提醒,帮助用户记忆命令语法格式。

如下图所示,输入zadd命令,Redis-cli使用浅颜色字体显示zadd的语法。

RDB支持存储LFU、LRU

Redis5.0开始,RDB快照文件中增加存储key逐出策略LRULFU

l   FIFO:先进先出。最早存储的数据,优先被淘汰。

l   LRU:最近最少使用。长期未使用的数据,优先被淘汰。

l   LFU:最不经常使用。在一段时间内,使用次数最少的数据,优先被淘汰。

Redis5.0的RDB文件格式有变化,向下兼容。因此如果使用快照的方式迁移,可以从Redis低版本迁移到Redis5.0,但不能从Redis5.0迁移到低版本。

干货来袭:Redis5.0支持的新功能说明的更多相关文章

  1. Redis4.0支持的新功能说明

    本文以华为云DCS for Redis版本为例,介绍Redis4.0的新功能.文章转载自华为云帮助中心. 与Redis3.x版本相比,DCS的Redis4.x以上版本,除了开源Redis增加的特性之外 ...

  2. MySQL 8.0有什么新功能

    https://mysqlserverteam.com/whats-new-in-mysql-8-0-generally-available/ 我们自豪地宣布MySQL 8.0的一般可用性. 现在下载 ...

  3. 【redis】redis5.0的一些新特性

    redis5.0总共增加了12项新特性,如下: 1.新增加的Stream(流)数据类型,这样redis就有了6大数据类型,另外五种是String(字符串),Hash(哈希),List(列表),Set( ...

  4. React Native 0.50版本新功能简介

    React Native在2017年经历了众多版本的迭代,从接触的0.29版本开始,到前不久发布的0.52版本,React Native作为目前最受欢迎的移动跨平台方案.虽然,目前存在着很多的功能和性 ...

  5. Bash 5.0 发布及其新功能

    导读 邮件列表证实最近发布了 Bash-5.0.而且,令人兴奋的是它还有新的功能和变量.如果你一直在使用 Bash 4.4.XX,那么你一定会喜欢 Bash 的第五个主要版本. 第五个版本侧重于新的 ...

  6. Android Studio 3.0 下载 使用新功能介绍

    谷歌2017发布会更新了挺多内容的,而且也发布了AndroidStudio3.0预览版,一些功能先睹为快.(英语一般,有些翻译不太好) 下载地址 https://developer.android.g ...

  7. Kafka 0.11版本新功能介绍 —— 空消费组延时rebalance

    在0.11之前的版本中,多个consumer实例加入到一个空消费组将导致多次的rebalance,这是由于每个consumer instance启动的时间不可控,很有可能超出coordinator确定 ...

  8. Apache Kafka 0.11版本新功能简介

    Apache Kafka近日推出0.11版本.这是一个里程碑式的大版本,特别是Kafka从这个版本开始支持“exactly-once”语义(下称EOS, exactly-once semantics) ...

  9. 161128、Redis 4.0发布及其新功能介绍

    Redis 4.0-rc1 发布了,这是 4.0 的首个 RC 版.Redis 是一个高性能的key-value数据库.Redis 的出现,很大程度补偿了memcached这类keyvalue存储的不 ...

随机推荐

  1. 键盘录入6个int类型的数据存入数组arr中,将arr数组中的内容反转...

    一.有一道很有意思的数组操作相关编程题,闲来无事用JS解决了一下,问题描述如下: (1) 键盘录入6个int类型的数据存入数组arr中: (2) 将arr数组中的内容反转: (3) 将反转后的数组角标 ...

  2. 基于DCT的图片数字水印实验

    1. 实验类别 设计型实验:MATLAB设计并实现基于DCT的图像数字水印算法. 2. 实验目的 了解基于DCT的图像数字水印技术,掌握基于DCT系数关系的图像水印算法原理,设计并实现一种基于DCT的 ...

  3. easyui datagrid 异步加载数据时滚动条有时会自动滚到最底部的问题

    在使用easyui 的datagrid异步加载数据时发现滚动条有时会自动滚到最底部.经测试发现,如果加载数据前没有选中行则不会出现这个问题.这样我们可以在重新异步加载数据前取消选中行就可以避免这个问题 ...

  4. java并发实战:连接池实现

    池化技术简介 在我们使用数据库的过程中,我们往往使用数据库连接池而不是直接使用数据库连接进行操作,这是因为每一个数据库连接的创建和销毁的代价是昂贵的,而池化技术则预先创建了资源,这些资源是可复用的,这 ...

  5. jquery 去除空格

    /** * 是否去除所有空格 * @param str * @param is_global 如果为g或者G去除所有的 * @returns */ function Trim(str,is_globa ...

  6. [Doctrine Migrations] 数据库迁移组件的深入解析三:自定义数据字段类型

    自定义type 根据官方文档,新建TinyIntType类,集成Type,并重写getName,getSqlDeclaration,convertToPHPValue,getBindingType等方 ...

  7. Python在线编程环境

    除了安装Python的IDE之外,也可以使用在网页中随时随地编写Python程序. Python官网:https://www.python.org/shell Python123:https://py ...

  8. React 源码中的依赖注入方法

    一.前言 依赖注入(Dependency Injection)这个概念的兴起已经有很长时间了,把这个概念融入到框架中达到出神入化境地的,非Spring莫属.然而在前端领域,似乎很少会提到这个概念,难道 ...

  9. Facebook 被指收集用户数据:通过照片和文本

    北京时间5月25日消息,在加利福尼亚州进行的对Facebook泄露用户信息一案中,法院对Facebook提起一项新的诉讼,指控该公司通过App收集了用户及他们朋友的信息. 上周向加利福尼亚州圣马特奥市 ...

  10. 单片机-C语言-定义和申明

    以下代码是单片机程序,51单片机,编译器为HT-IDE3000, 简单来说 头文件中只能申明, 变量在头文件中申明时,要加上extern 这个关键字用来告诉编译器,变量在其它的文件中定义,为什么要在头 ...