zoukankan      html  css  js  c++  java
  • 深入解读阿里云Redis开发规范

    Key命名设计:可读性、可管理性、简介性

    规范建议使用冒号即:进行分割拼接,因为很多Redis客户端是根据冒号分类的。比如有几个Key:apps:app:1、apps:app:2和apps:app:3。Redis Desktop Manager能自动归类到apps目录下。如下图所示:

    Value设计:拒绝bigkey

    规范建议String类型的Value控制在10KB范围以内。这是因为Redis随着Value不断增长,在超过10KB后,有一个非常奇妙的性能拐点,如下图所示(图片来自Redis官网:http://redis.cn/topics/benchmarks.html):

     

    假设内网带宽是千兆网卡,即1000MB。假设你的Redis中有一个大Key的Value长度是10KB,并且这个Key的QPS是10W,那么这一个Key就会把带宽打满:10KB*100000=1000MB。

    控制Key的生命周期:设定过期时间

    尽可能对每一个Key都设置过期时间,这个是非常有益处的。否则,你想想一下,半年以后,一年以后,你的Redis集群中有上百G甚至更多的数据,谁都不知道这些数据哪些是有价值的,哪些已经成为垃圾。如果你的每个Key都设置了过期时间,那么就不会出现这个问题了。集群在运行过程中,或自动淘汰那些已经不再使用的垃圾缓存数据。

    时间复杂度为O(n)的命令需要注意N的数量

    这个建议的意思是,以List类型为例,LINDEX、LREM等命令的时间复杂度就是O(n)。也就是说,随着List中元素数量越来越多,这些命令的性能越来越差。而Redis又是单线程的,如果出现一个慢命令,会导致在这个命令之后执行的命令耗时也会增长,这是使用Redis的大忌。

    事实上这也是JDK8为什么要对HashMap进行链条冲突优化:当entry数量不少于64时,如果冲突链表长度达到8,就会将其转成红黑树。因为链表长度越长,性能会越来越差。

    禁用命令:KEYS、FLUSHDB、FLUSHALL等

    这些命令应该在搭建Redis环境的时候就要禁用掉(在config配置文件中通过rename-command禁用)。FLUSHDB和FLUSHALL这两个命令会清空数据,后果可想而知。

    至于KEYS命令,还记得那个由于使用这个命令导致几百万损失的案例嘛?而且,这个命令的不当使用导致的损失,会随着你的业务并大越大价值越大而导致损失越大:


     
    KEYS引发的灾难

    推荐使用批量操作提升操作效率

    批量命令主要分为两类,原生命令和非原生命令:

    • 原生命令包括:例如mget、mset、hmget、hmset、LPUSH key value集合等。
    • 非原生命令包括:Pipeline。

    合理使用这些命令对操作性能提升是极其巨大的,尤其在单机Redis或者Sentinel模式下。因为这两种架构不涉及跨Slot,Redis集群性能也有提升,但是使用会受到一些限制,例如不支持跨Slot的操作。

    当然批量虽好,但不要贪多。俗话说的好,贪多嚼不烂。一般不要超过1000,具体限制还与操作数据大小有关。

    monitor命令控制使用时间

    monitor命令一般是用来观察redis服务端都在执行哪些命令并实时输出。例如在其他redis-cli中执行两个set命令,在monitor中监控结果如下:

    afeiMacBook-Pro:redis-3.2.11 afei$ src/redis-cli monitor
    OK
    1573915193.053188 [0 127.0.0.1:55357] "COMMAND"
    1573915197.087383 [0 127.0.0.1:55357] "set" "name" "afei"
    1573915217.938838 [0 127.0.0.1:55357] "set" "公众号" "阿飞的博客"

    之所以规范建议控制monitor命令的使用时间,是因为随着monitor命令执行时间越来越长,会导致越来越多的数据积压在输出缓冲区,从而导致输出缓冲区占用内存越来越大。而且,这种影响会由于Redis并发越高,而更加放大。关于这个问题,美团有一个很经典的案例,感兴趣的同学可以搜索关键词:“美团在REDIS上踩过的一些坑-3.REDIS内存占用飙升”。

  • 相关阅读:
    Hive—数据库级增、删、改、查
    Kafka—Bootstrap broker hadoop102:2181 (id: -1 rack: null) disconnected
    Kafka—命令行操作
    Kafka—Kafka安装部署
    Kafka—Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c0000000, 1073741824, 0) failed; error='Cannot allocate memory' (errno=12)
    mysql—Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details.
    Linux—安装MySQL数据库
    Linux—Yum源配置
    Hive-FAILED: SemanticException org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
    Linux—Crontab定时任务
  • 原文地址:https://www.cnblogs.com/-mrl/p/11935449.html
Copyright © 2011-2022 走看看