本文以华为云DCS for Redis版本为例,介绍Redis4.0的新功能。文章转载自华为云帮助中心

与Redis3.x版本相比,DCS的Redis4.x以上版本,除了开源Redis增加的特性之外,还有如下大特性增强。

l   创建耗时缩短

实例由虚机方式改成了物理机容器化部署,创建实例只需要8~10秒时间完成。

l   性能提升

高性能版Redis4.x,操作系统使用华为自研的轻量级LibOS,单节点QPS从10w提升到30w

l   节省成本

高性能版Redis4.x,实例规格以1G为步长,用多少G买多少G,灵活定制,不再受限2的n次方要求。

相比于之前的版本,华为云Redis4.x在性能方面有了不小的提升,大大提高了使用者的体验,如果你想了解更加详细的具体实操内容,点这个链接

https://www.huaweicloud.com/product/dcs.html给你更多惊喜。

接下来给大家介绍,开源Redis4.0版本新功能的具体特性。

Redis4.x版本更新的特性,主要涉及三个方面:

  1. 新命令的增加,如MEMORY、SWAPDB。
  2. Lazyfree机制,延迟删除大key,降低删除操作对系统资源的占用影响。
  3. 内存性能优化,即主动碎片整理。

MEMORY命令

在Redis3.x及之前,只能通过info memory命令了解有限的几个内存统计信息。Redis4.0引入新的命令memory,让您能够更深入了解Redis的内存使用情况。

127.0.0.1:6379[8]> memory help
1) MEMORY <subcommand> arg arg ... arg. Subcommands are:
2) DOCTOR - Return memory problems reports.
3) MALLOC-STATS -- Return internal statistics report from the memory allocator.
4) PURGE -- Attempt to purge dirty pages for reclamation by the allocator.
5) STATS -- Return information about the memory usage of the server.
6) USAGE <key> [SAMPLES <count>] -- Return memory in bytes used by <key> and its value. Nested values are sampled up to <count
> times (default: 5).
127.0.0.1:6379[8]>

  

usage

输入memory usage [key],如果当前key存在,则返回key的value实际使用内存估算值;如果key不存在,则返回nil。

127.0.0.1:6379[8]> set dcs "DCS is an online, distributed, in-memory cache service compatible with Redis, Memcached, and i
n-memory data grid (IMDG)."
OK
127.0.0.1:6379[8]> memory usage dcs
(integer) 171
127.0.0.1:6379[8]>

usage统计value内存占用,以及key自身的内存占用,不包含key的Expire内存占用。

127.0.0.1:6379[8]> set dcs.huaweiclou "Distributed Cache Service"
OK
127.0.0.1:6379[8]> memory usage dcs.huaweiclou
(integer) 85
127.0.0.1:6379[8]> set dcs.huaweicloud "Distributed Cache Service"
OK
127.0.0.1:6379[8]> memory usage dcs.huaweicloud
(integer) 86 //key名称长度变化后,内存占用也有变化
127.0.0.1:6379[8]> expire dcs.huaweicloud 100000
(integer) 1
127.0.0.1:6379[8]> memory usage dcs.huaweicloud
(integer) 86 //加了过期时间后,内存占用没有改变
127.0.0.1:6379[8]>

对hash、list、set、sorted set等数据类型,usage命令会抽样统计,提供内存占用的估算值。

使用方式:memory usage keyset samples 1000

其中keyset表示一个集合数据类型的key,1000表示抽样个数。

stats

返回当前实例内存使用细节。

使用方法:memory stats

127.0.0.1:6379[8]> memory stats
 1) "peak.allocated"
 2) (integer) 2412408
 3) "total.allocated"
 4) (integer) 2084720
 5) "startup.allocated"
 6) (integer) 824928
 7) "replication.backlog"
 ... ...

以下给出部分数据返回项的具体含义

表1-1 memory stats

数据返回项

说明

peak.allocated

Redis实例运行过程中,allocator分配的内存峰值。同info memory的used_memory_peak

total.allocated

allocator当前分配的内存字节数。同info memory的used_memory

startup.allocated

Redis启动占用的内存字节数

replication.backlog

Redis复制积压缓冲区(replication
backlog)内存使用字节数,通过repl-backlog-size参数设置,默认1M

clients.slaves

在master侧,所有slave clients消耗的内存字节数

clients.normal

Redis所有常规客户端消耗内存节字数

overhead.total

Redis额外的总开销内存字节数; 即分配器分配的总内存total.allocated,减去数据实际存储使用内存。

keys.count

Redis实例中key的数量

keys.bytes-per-key

每个key平均占用字节数。注意,overhead也会均摊到每个key上,因此不能以此值来表示业务实际的key平均长度。

dataset.bytes

表示Redis数据占用的内存容量。即分配的内存总量,减去总的额外开销内存量。

dataset.percentage

表示Redis数据占用内存占总内存分配的百分比

peak.percentage

当前内存使用量与峰值时的占比

fragmentation

表示Redis的内存碎片率

doctor

使用方法: memory doctor

used_memory(total.allocated)小于5M,doctor认为内存使用量过小,不做进一步诊断。当满足以下某一点,Redis会给出诊断结果和建议:

  1. peak分配内存大于当前total_allocated的1.5倍,即peak.allocated/total.allocated
    > 1.5,说明内存碎片率高,RSS远大于used_memory
  2. High fragmentation/fragmentation大于1.4,说明内存碎片率高
  3. 每个Normal
    Client平均使用内存大于200KB,说明pipeline可能使用不当,或Pub/Sub客户端处理消息不及时
  4. 每个Slave
    Client平均使用内存大于10MB,说明master的写入流量过高

purge

使用方法: memory purge

用途:通过调用jemalloc内部命令,进行内存释放。释放对象包括Redis进程占用但未有效使用的内存,即常说的内存碎片。

memory purge只适用于使用jemalloc作为allocator的Redis实例。

Lazy
free机制

解决的痛点/问题

Redis是单线程程序,当运行一个耗时较大的请求时,会导致所有请求排队等待,在请求处理完成前,Redis不能响应其他请求,因此容易引发性能问题。而Redis删除大的集合键时,就属于一种比较耗时的请求。

原理

Redis4.x提供的一种惰性删除或者说延迟释放机制,主要用于解决删除大key对Redis进程的阻塞,从而避免带来性能与可用性问题。

删除key时,Redis异步延时释放key的内存,把key释放操作放在bio(Background
I/O)单独的子线程处理中。

使用方法

  1. 主动删除

−          
unlink

unlink与del命令目的一样,删除某个key。unlink在删除集合类键时,如果集合键的元素个数大于64个,会把内存释放操作,给单独的bio(Background
I/O)线程来执行。因此unlink删除操作能在非常短的时间内完成包含上百万个元素的大key删除。

−          
flushall/flushdb

通过对flushall/flushdb添加ASYNC异步清理选项,Redis在清理整个实例或单个DB时,操作都是异步的。

  1. 过期key删除、大key驱逐删除

被动删除有四种场景,每种场景对应一个配置参数,默认都是关闭:

lazyfree-lazy-eviction no //针对redis内存使用达到maxmeory,并设置有淘汰策略时,是否采用lazy free机制
lazyfree-lazy-expire no //针对设置有TTL的键,达到过期后,被redis清理删除时是否采用lazy free机制
lazyfree-lazy-server-del no //针对有些指令在处理已存在的键时,会带有一个隐式的DEL键的操作
slave-lazy-flush no //针对slave进行全量数据同步,slave在加载master的RDB文件前,会运行flushall来清理自己的数据场景

以上配置如需使用,请提工单咨询技术服务人员。

其他新增命令

swapdb

用途:交换同一Redis实例内2个db的数据。

用法:swapdb dbindex1 dbindex2

zlexcount

用途:在有序集合中,返回符合条件的元素个数。

用法:zlexcount key min max

内存使用和性能改进

    1. 使用更少的内存来存储相同数量的数据
    2. 可以对使用的内存进行碎片整理,并逐渐回收

Redis4.0支持的新功能说明的更多相关文章

  1. 干货来袭:Redis5.0支持的新功能说明

    Redis5.0支持的新特性说明 本文内容来自华为云帮助中心 华为云DCS的Redis5.x版本继承了4.x版本的所有功能增强以及新的命令,同时还兼容开源Redis5.x版本的新增特性. Stream ...

  2. MySQL 8.0有什么新功能

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

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

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

  4. Bash 5.0 发布及其新功能

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

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

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

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

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

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

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

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

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

  9. hasura graphql-engine v1.0.0-alpha26 版本新功能

    hasura 发布了graphql-engine v1.0.0-alpha26 版本,有一些破坏的变动,以及方便的新特性 破坏性变动 order_by 从 order_by: id_asc 为 ord ...

随机推荐

  1. Oracle语句(一)之简单查询

    1.查询数据表的所有列: select * from 表名; 程序员正常用法:select 列名,列名... form 表名; 2.起别名: select 列名 [AS 别名],列名 别名...fro ...

  2. String.Format() 方法

    一 定义 String.Format() 是将指定的 String类型的数据中的每个格式项替换为相应对象的值的文本等效项. string p1 = "Jackie"; string ...

  3. #leetcode刷题之路14-最长公共前缀

    编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow" ...

  4. 一个hibernate中的异常:NonUniqueDiscoveredSqlAliasException

    在hibernate中用SQL查询返回的结果集中,列名或别名必须唯一,否则会报下面的错误.返回的结果集中,列名或别名可以没有,但只能有一列没有. //空别名重复的情况:org.hibernate.lo ...

  5. 微信小程序数据分析之自定义分析

    在小程序后台,微信已经提供了强大的数据分析功能,包括实时统计.访问分析.来源分析和用户画像功能,可以说对一般的数据分析已经完全足够了,但有时应用需要做一些更加精准的数据分析,比如具体到某一个页面的分享 ...

  6. yii学习笔记(6),数据库操作(增删改)

    数据库增删改操作通过活动记录实例来完成 插入记录 /* ----------添加记录---------- */ // 创建活动记录对象 $article = new Article(); $artic ...

  7. day 13 内置函数

    内置函数思维导图:https://www.processon.com/view/link/5c13ad2de4b0ed122da75668 内置函数 作用域相关:   locals() 返回当前作用域 ...

  8. Drill-On-YARN

    1. Drill-On-YARN介绍 功能 启动 停止 扩容 缩容 failover 启动流程 下载drill的社区包,进行必要的配置,执行drill-on-yarn.sh start命令,启动dri ...

  9. Python学习 :函数

    函数 函数(Functions) 是指可重复使用的程序片段.它们允许你为某个代码块赋予名字,允许你通过这一特殊的名字在你的程序任何地方来运行代码块,并可重复任何次数.这就是调用(Calling)函数. ...

  10. 闰年相关的问题v3.0——计算有多少闰年

    # include<stdio.h>int main(){ int a,b,i; int sum = 0; printf("Input your birth year:" ...