zoukankan      html  css  js  c++  java
  • 如何提取Redis中的大KEY

    如何提取Redis中的大KEY

    工作中,经常有些Redis实例使用不恰当,或者对业务预估不准确,或者key没有及时进行处理等等原因,导致某些KEY相当大。 
    那么大Key会带来哪些问题呢?

    1. 如果是集群模式下,无法做到负载均衡,导致请求倾斜到某个实例上,而这个实例的QPS会比较大,内存占用也较多;对于Redis单线程模型又容易出现CPU瓶颈,当内存出现瓶颈时,只能进行纵向库容,使用更牛逼的服务器。
    2. 涉及到大key的操作,尤其是使用hgetall、lrange 0 -1、get、hmget 等操作时,网卡可能会成为瓶颈,也会到导致堵塞其它操作,qps 就有可能出现突降或者突升的情况,趋势上看起来十分不平滑,严重时会导致应用程序连不上,实例或者集群在某些时间段内不可用的状态。
    3. 假如这个key需要进行删除操作,如果直接进行DEL 操作,被操作的实例会被Block住,导致无法响应应用的请求,而这个Block的时间会随着key的变大而变长。

    有以下几种办法可以知道某个Redis实例是否存在大key:

    1. 在redis实例上执行bgsave,然后我们对dump出来的rdb文件进行分析,找到其中的大KEY
    2. 有个不太推荐的命令,debug object xxx 可以看到这个key在内存中序列化后的大小,当然我们可以通过SCAN+debug object xxx 得到当前实例所有key的大小。
    3. redis-cli 原生自带 –bigkeys 功能,可以找到某个实例 5种数据类型(String、hash、list、set、zset)的最大key。

    通过Redis-cli –bigkeys 我们可以很方便的找到某个实例最大的几个KEY,但是只能得到某种类型的最大的一个key,于是思考改改redis-cli findBigKeys 功能,增加查找多个key的代码,用户可以指定大key的数量。

    修改后功能预览如下:

    VITOXIE-MB1:src xiean$ ./redis-cli-new -p 2837 --bigkeys --bigkey-numb  3
    
    Biggest string Key Top   1  found 'xxxG_NEWMATCH_VOD_DATA_7f7a2a2fb5f780a13fecd9f1e51bdf8a' has 53170 bytes
    Biggest string Key Top   2  found 'xxxG_NEWMATCH_VOD_DATA_a9758560d1874493c637dec0753909da' has 53159 bytes
    Biggest string Key Top   3  found 'xxxG_NEWMATCH_VOD_DATA_d0971977b0ce028141e53b020b93d822' has 53156 bytes
    Biggest   list Key Top   1  found 'UserPostInfo122_632789064' has 11028 items
    Biggest   list Key Top   2  found 'xxxG_FriendCallBack_PushList_23' has 1973 items
    Biggest   list Key Top   3  found 'xxxG_FriendCallBack_PushList_20' has 1824 items
    

    ps,修改的源码放在GitHub上,这里还部分dba日常实用工具:https://github.com/xiepaup/OPS-Tools ,欢迎探讨。


    扫描大键

    在这个特殊的模式下,它redis-cli可以作为关键的空间分析器。它扫描大键的数据集,但也提供有关数据集组成的数据类型的信息。该模式使用该--bigkeys选项启用,并产生相当详细的输出:

    $ redis-cli --bigkeys
    
    # Scanning the entire keyspace to find biggest 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).
    推荐一个很好用的脚本:
    https://gist.github.com/epicserve/5699837

    效果:


  • 相关阅读:
    用 PHP 自带函数 fputcsv 和 fgetcsv 来导出和导入csv
    Node express 框架
    ES6语法及JS语言的其他特性
    Node模块化及CommonJS规范
    Nodemon 开发环境自动重启服务工具
    Node 使用模板引擎art-template
    npm的使用
    leetcode刷题笔记 二百零四题 计数质数
    leetcode刷题笔记 二百零三题 移除链表元素
    leetcode刷题笔记 二百零二题 快乐数
  • 原文地址:https://www.cnblogs.com/thewindkee/p/12873199.html
Copyright © 2011-2022 走看看