redis-4.0新功能介绍

阿里云redis4.0引擎是以社区4.0为基础,合入大量阿里云开发的特性以及bugfix后全新推出的售卖版本。除了拥有redis-2.8引擎所具备的所有优势之外,还带来了很多新功能。

Lazyfree

redis-4.0带来的Lazyfree机制可以避免del,flushdb/flushall,rename等命令引起的redis-server阻塞,提高服务稳定性。

unlink

在redis-4.0之前,redis执行del命令会在释放掉key的所有内存以后才会返回OK,这在key比较大的时候(比如说一个hash里头有1000W条数据),其他连接可能要等待很久。为了兼容已有的del语义,redis-4.0引入unlink命令,效果以及用法和del完全一样,但内存释放动作放到后台线程中执行。

UNLINK key [key ...]

flushdb/flushall

flushdb/flushall在redis-4.0中新引入了选项,可以指定是否使用Lazyfree的方式来清空整个内存。

FLUSHALL [ASYNC]
FLUSHDB [ASYNC]

rename

执行 rename oldkey newkey 时,如果newkey已经存在,redis会先删除,这也会引发上面提到的删除大key问题,如果想让redis在这种场景下也使用lazyfree的方式来删除,可以在控制台上打开如下配置:

lazyfree-lazy-server-del yes/no

其他场景

某些用户对数据设置过期时间,依赖redis的淘汰机制去删除已经过期的数据,这同样也存在上面提到的问题,淘汰某个大key会导致进程CPU出现抖动,redis-4.0提供了两个配置,可以让redis在淘汰或者逐出数据时也使用lazyfree的方式。

lazyfree-lazy-eviction yes/no
lazyfree-lazy-expire yes/no

新增命令

swapdb

swapdb命令会交换两个db的数据,swapdb执行之后用户连接无需再执行select,即可看到新的数据。

127.0.0.1:6379> select 0
OK
127.0.0.1:6379> set key value0
OK
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> set key value1
OK
127.0.0.1:6379[1]> swapdb 0 1
OK
127.0.0.1:6379[1]> get key
"value0"
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> get key
"value1"

zlexcount

zlexcount命令用于sorted set中,和zrangebylex类似,不同的是zrangebylex返回member,而zlexcount是返回符合条件的member个数。

memory

redis-4.0之前只能通过info memory来了解redis内部有限的内存信息,4.0提供了memory命令,帮助用户全面了解redis的内存状态。

127.0.0.1:6379> memory help
1) "MEMORY DOCTOR                        - Outputs memory problems report"
2) "MEMORY USAGE <key> [SAMPLES <count>] - Estimate memory usage of key"
3) "MEMORY STATS                         - Show memory usage details"
4) "MEMORY PURGE                         - Ask the allocator to release memory"
5) "MEMORY MALLOC-STATS                  - Show allocator internal stats"
  • memory usage

usage子命令可以查看某个key在redis内部实际占用多少内存,这里有两点需要说明:

  1. 不光key, value需要占用内存,redis管理这些数据还需要一部分内存
  2. 对于hash, list, set, sorted set这些类型,结果是采样计算的,可以通过SAMPLES 来控制采样数量
  • memory stats
27.0.0.1:6379> memory stats
     1) "peak.allocated"    // redis从启动到现在,历史最多使用过多少内存
     2) (integer) 423995952
     3) "total.allocated"    //当前使用内存
     4) (integer) 11130320
     5) "startup.allocated"    //redis启动初始化以后占用内存
     6) (integer) 9942928
     7) "replication.backlog"    //主从复制断开重连时会用到,默认10MB
     8) (integer) 1048576
     9) "clients.slaves"    // 主从复制用到的内存
    10) (integer) 16858
    11) "clients.normal"    //普通用户客户端的读写缓冲区
    12) (integer) 49630
    13) "aof.buffer"    //aof持久化使用的缓存和aofrewrite时产生的缓存之和
    14) (integer) 3253
    15) "db.0"    //每个db的元数据所占用内存
    16) 1) "overhead.hashtable.main"
        2) (integer) 5808
        3) "overhead.hashtable.expires" //管理带过期时间的数据所额外消耗内存
        4) (integer) 104
    17) "overhead.total"    //上面提到的各项内存消耗之和
    18) (integer) 11063904
    19) "keys.count"    //当前存储的key的总量
    20) (integer) 94
    21) "keys.bytes-per-key"    //当前内存中平均每个key大小
    22) (integer) 12631
    23) "dataset.bytes"        //用户数据所占用内存(= 总内存 - redis元数据所占内存)
    24) (integer) 66416
    25) "dataset.percentage"    //100 * dataset.bytes / (total.allocated - startup.allocated)
    26) "5.5934348106384277"
    27) "peak.percentage"    // 100 * total.allocated / peak_allocated
    28) "2.6251003742218018"
    29) "fragmentation"    //内存碎片率
    30) "1.1039986610412598"
  • memory doctor

主要用于给一些诊断建议,提前发现潜在问题。

Peak memory: peak.allocated/total.allocated > 1.5,此时内存碎片率可能比较高
High fragmentation: fragmentation > 1.4,此时碎片率比较高
Big slave buffers: 每个slave缓冲区的平均内存超过10MB,原因可能是master写入流量过高
Big client buffers: 普通客户端缓冲区的平均内存超过200KB,原因可能是pipeline使用不当或者Pub/Sub客户端处理消息不及时导致
  • malloc stats & malloc purge

这两个用于操作jemalloc,只在使用jemalloc的时候才有效。

LFU&hotkey

redis-4.0新增了 allkey-lfu 和 volatile-lfu 两种数据逐出策略,同时还可以通过object命令来获取某个key的访问频度。

object freq user_key

基于LFU机制,用户可以使用 scan + object freq 来发现热点key,当然redis也一起发布了更好用的工具——redis-cli,使用实例如下所示。

$./redis-cli --hotkeys

# Scanning the entire keyspace to find hot keys as well as
# average sizes per key type.  You can use -i 0.1 to sleep 0.1 sec
# per 100 SCAN commands (not usually needed).

[00.00%] Hot key 'counter:000000000002' found so far with counter 87
[00.00%] Hot key 'key:000000000001' found so far with counter 254
[00.00%] Hot key 'mylist' found so far with counter 107
[00.00%] Hot key 'key:000000000000' found so far with counter 254
[45.45%] Hot key 'counter:000000000001' found so far with counter 87
[45.45%] Hot key 'key:000000000002' found so far with counter 254
[45.45%] Hot key 'myset' found so far with counter 64
[45.45%] Hot key 'counter:000000000000' found so far with counter 93

-------- summary -------

Sampled 22 keys in the keyspace!
hot key found with counter: 254 keyname: key:000000000001
hot key found with counter: 254 keyname: key:000000000000
hot key found with counter: 254 keyname: key:000000000002
hot key found with counter: 107 keyname: mylist
hot key found with counter: 93  keyname: counter:000000000000
hot key found with counter: 87  keyname: counter:000000000002
hot key found with counter: 87  keyname: counter:000000000001
hot key found with counter: 64  keyname: myset

其他

redis-4.0还有一些其他新的特性对用户来说是透明的,未来阿里云也会在4.0的基础上为用户提供更加丰富的功能,敬请期待!

上一篇:一行一行读Java源码——ArrayList


下一篇:阿里云Redis集群版常见错误返回