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. afei$ src/redis-cli monitor
OK
1573915193.053188 [ 127.0.0.1:] "COMMAND"
1573915197.087383 [ 127.0.0.1:] "set" "name" "afei"
1573915217.938838 [ 127.0.0.1:] "set" "公众号" "阿飞的博客"

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

深入解读阿里云Redis开发规范的更多相关文章

  1. 完整阿里云Redis开发规范

    完整阿里云Redis开发规范 原文地址 本文主要介绍在使用阿里云Redis的开发规范,从下面几个方面进行说明. 键值设计 命令使用 客户端使用 相关工具 删除bigkey 通过本文的介绍可以减少使用R ...

  2. 阿里云 Redis 开发规范

    阿里云Redis开发规范-阿里云开发者社区 https://developer.aliyun.com/article/531067 https://mp.weixin.qq.com/s/UWE1Kx6 ...

  3. 一份完整的阿里云 Redis 开发规范,值得收藏!

    来源:yq.aliyun.com/articles/531067 作者:付磊-起扬 本文主要介绍在使用阿里云Redis的开发规范,从下面几个方面进行说明. 键值设计 命令使用 客户端使用 相关工具 通 ...

  4. 阿里云Redis开发规范

    转自: https://yq.aliyun.com/articles/531067 摘要: 本文介绍了在使用阿里云Redis的开发规范,从键值设计.命令使用.客户端使用.相关工具等方面进行说明,通过本 ...

  5. 阿里云Redis开发规范[转]

    一.键值设计 1. key名设计 (1)[建议]: 可读性和可管理性 以业务名(或数据库名)为前缀(防止key冲突),用冒号分隔,比如业务名:表名:id ugc:video:1 (2)[建议]:简洁性 ...

  6. 阿里云Redis开发规范(转)

    一.键值设计 1. key名设计 (1)[建议]: 可读性和可管理性 以业务名(或数据库名)为前缀(防止key冲突),用冒号分隔,比如业务名:表名:id ugc:video: (2)[建议]:简洁性 ...

  7. 阿里云Redis使用规范

    一.键值设计 1.key名设计 (1)[建议]: 可读性和可管理性 以业务名(或数据库名)为前缀(防止key冲突),用冒号分隔,比如业务名:表名:id ugc:video:1 (2)[建议]: 简洁性 ...

  8. 阿里云Redis的开发规范

    作者:付磊-起扬 来源:https://yq.aliyun.com/articles/531067 本文主要介绍在使用阿里云Redis的开发规范,从下面几个方面进行说明. 键值设计 命令使用 客户端使 ...

  9. Redis 开发规范

    本文主要介绍在使用阿里云Redis的开发规范,从下面几个方面进行说明. 键值设计 命令使用 客户端使用 相关工具 通过本文的介绍可以减少使用Redis过程带来的问题. 一.键值设计 1.key名设计 ...

随机推荐

  1. XXX接口自动化测试方案

    XXX接口自动化测试方案 1.引言 1.1 文档版本 版本 作者 审批 备注 V1.0 XXXX 创建测试方案文档 1.2 项目情况 项目名称 XXX 项目版本 V1.0 项目经理 XX 测试人员 X ...

  2. JAVA之Socket通讯

    Server.java: Client.java Server console:(先启动服务器,再启动客户端)  服务器读取了客户端发来的hello server: Client console:客户 ...

  3. python 应用开发之-用base64 对图片文件的编码和解码处理

    用base64 对图片文件的编码和解码处理 import base64 def convert(image): f = open(image) img_raw_data = f.read() f.cl ...

  4. 限制textarea 文本框的长度(收集了几个办法)

    文章参考地址:http://blog.csdn.net/nhconch/article/details/4223076 需求背景: 前几天,因为客户有一个需求说,需要对一个评论(一个textarea文 ...

  5. c语言位域的使用注意事项——数据溢出

    c语言可以使用位域来节省变量的空间,例如开关只有通电和断电两种状态,用 0 和 1 表示足以,也就是用一个二进位.位域的取值范围非常有限,数据稍微大些就会发生溢出,这个字使用keil的使用,keil提 ...

  6. CustomHTTPProtocol

    http://blog.csdn.net/jingcheng345413/article/details/54967739 一.概念 NSURLProtocol也是苹果众多黑魔法中的一种,使用它可以轻 ...

  7. 异步链式编程—promise沉思录

    一.promise的组成 1.task:promise要完成的任务: 2.result:处理完的数据: 3.status:状态: 4.fulfill.reject(对应catch) 5.Resolve ...

  8. jquery ajax在ie9下跨域不执行 crossDomain: true == !(document.all)

    <!DOCTYPE html> <html> <head> <title>jQuery CORS in IE7 - IE10</title> ...

  9. 一些开源的dashboard 解决方案

    简单收集了以下开源dashboard 的项目,记录下 plotly-dash 基于python 的dash 开发工具,很不错 项目地址 https://github.com/plotly/dash k ...

  10. 2.学习SpringMVC注解入门篇

    一.SpringMVC执行流程 . 二.创建项目学习SpringMVC注解 按照我之前的SpringMVC创建项目,首先创建一个项目springmvc01,配置好pom.xml,web.xml,spr ...