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


    本文以华为云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. 可以对使用的内存进行碎片整理,并逐渐回收
  • 相关阅读:
    H3c实验室-(OSPF,Nat,STP,Dhcp,Acl)v.1)
    武科WUST-CTF2020“Tiki组 ”
    MRCTF 2020-“TiKi小组”
    mybatis-sqlite日期类型对应关系
    docker安装postgresql
    docker常用命令
    java sqlite docker,sqlite出错
    jenkins之SSH Publishers环境变量
    线程池(6)-submit与execute区别
    线程池(5)-停止线程池里的任务
  • 原文地址:https://www.cnblogs.com/husterindg/p/10491652.html
Copyright © 2020-2023  润新知