热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

阿里内部强制执行的redis使用规范,违者绩效直接3.25

前言目前互联网大厂大量使用



前言

目前互联网大厂大量使用redis、pika作为后端缓存、存储,但是存在存储选型不慎重、结构规划不合理、命令使用不规范的现象,继而造成系统性能达 到瓶颈、活动高峰系统可用性下降、dba可运维难度大大增加。所以就有了这份规范,从源头规范redis使用,避免系统运行过程中出现上述 问题。

黑色粗体代表需要关注,红色字体代表特别需要关注。

存储选型


  • Redis是一个单进程、基于内存、弱事务的NoSql存储系统,适用于高QPS、低延迟、弱持久化的场景,适宜用作缓存。
  • Pika是一个多线程、基于磁 盘的兼容redis协议的存储系统,适用于低QPS、高延迟、大容量持久化的场景,适宜用作存储。
  • 我们建议: 在qps>5000、容量<50G、存储高频数 据时考虑redis;在延迟容忍>10ms、容量大于50G、有持久化需求时考虑Pika;在qps<1000、存储大量低频数据、需要事务时考虑Mysql。

结构规划


1. key名设计规范


  • 可读性和可管理性:

    Redis有两层(key-value)或三层(key-field-value)结构,一个好的名字有助于排查线上问题、方便的进行批量处理,同时能够防止key冲突。

    建议组标识:系统标识:模块标识:…作为一个通用前缀,其中组标 识在明确namespace归属后可以不填

比如: 当前redis内存暴涨,通过高频key前缀可以轻易的区分出是那个系统的那个模块在频繁操作,快速定位问题。


  • 简洁性:

    保证语义的前提下,控制key的长度,当key较多时,内存占用也不容忽视,key的长度不超过100个字符。

例如: 不要包含特殊字符

反例: 包含空格、换行、单双引号以及其他转义字符


2. value设计规范


  • 拒绝 bigkey(防止网卡流量、慢查询):

    • string类型控制在10KB以内,hash、list、set、zset元素个数不要超过5000。

    • 非字符串的bigkey,不要使用del删除,使用hscan、sscan、zscan方式渐进式删除,同时要注意防止bigkey过期时间自动删除问题(例如一个200万的zset设置1小时过期,会触发del操作,造成阻塞,而且该操作不会不出现在慢查询中(latency可查)),查找方法和删除方法

  • 选择适合的数据类型:

    例如:实体类型(要合理控制和使用数据结构内存编码优化配置,例如ziplist,但也要注意节省内存和性能之间的平衡)

  • 控制key的生命周期:

    redis不是垃圾桶,建议使用expire设置过期时间(条件允许可以打散过期时间,防止集中过期),不过期的数据重点关注 idletime。

  • 结构选择

    • Strings类型: 单个kv存储、适用于如简单计数等,value长度建议小于1MB,存数字最佳,如果确实value比较大,建议压缩后存储。 Hash类型: 多个相关属性放到一个Hash中、适用于如存储对象,建议field数量小于10000,整体size小于1G。

    • Set类型: 集合类型、适用于如归类对象等,建议元素数量小于10000,整体size小于1G。

    • Sorted Set类型: 有序集合类型、适用于如榜单排行,建议元素数量小于10000,整体size小于1G。

    • Lists类型: 队列类型、适用于如队列、粉丝/关注列表等,建议长度小于10000,整体size小于1G,保证生产-消费平衡。 需要使用特殊的数据类型(如Hyperloglog、Geo、Scripting),需要提前跟DBA沟通。


2. 容量预估


  • 第一次申请redis是需要做好容量评估、qps评估、流量评估(根据qps、平均value),注意: 当需要当前redis支持某个活动、需求时,需要再 次进行上述评估,以便DBA进行资源调配。

  • 使用ker后没有db的概念,所以不需要进行db切换,也不支持通过db划分系统、模块等。


命令使用


1. 命令使用基本原则


  • 冷热数据分离,不要将所有数据全部都放到Redis中

  • 不同的业务数据要分开存储

  • M类操作命令,建议个数在100个以下,整体size控制在10KB以内,如MGET、MSET、HMGET等。

  • 避免使用HGETALL、HKEYS、HVALS,除非可以保证HASH内field数量在100以内、size在10KB以下。如果不可避免,可以拆分一个大 HASH为多个小的HASH。

  • 单个redis实例key的数量控制在100万以内(因为我们不是所有的key都设置过期,暂时不考虑该条规则)。

  • 如果将redis定位为缓存,每个key尽量设置过期时间(最长14天,更长时间需要跟DBA沟通) 。

  • Redis支持过期机制,如果某些业务场景用到了过期时间这一特性就不能使用读写分离特性,否则需要在业务去自行管理、及时过期。

  • 对于特别重要的数据、连接相关的操作需要保证捕获异常,防止错误被淹没、数据操作状态不确定。


2. 关注O(N)命令中N的数量

例如: hgetall、lrange、smembers、zrange、sinter等并非不能使用,但是需要明确N的值。有遍历的需求可以使用hscan、sscan、zscan代替。

3. 禁用命令

禁止线上使用keys、flushall、flushdb、monitor、save、bgsave等,通过redis的rename机制禁掉命令,或者使用scan的方式渐进式处理。

缓存db数据一致性规范

必须采用延时双删策略,具体操作如下:

  1. 写数据库
  2. 删除缓存
  3. 同步延时或者订阅db的binlog异步延时再次删除缓存

    伪代码示例:

public void write(String key,Object data){
//写db
db.updateData(data);
//同步删除缓存
redis.delKey(key);
//延时500ms
Thread.sleep(500);
//再次删除缓存
redis.delKey(key);
}

正文end



往期精彩回顾

阿里内网一位p7大佬关于“限流”的分享(仅限小范围传播)
刷完这些题目,成功收割了阿里,美团,字节等大厂offer
后端服务实战之性能优化
聊聊亿级数据下Mysql数据库的分库分表方案



粉丝福利

福利一:

长按扫码关注下方二维码,回复「后端爱码士」四个字,即可领取后端技术资料包(由号主(阿里p7)和另外四位BAT等互联网大厂技术专家级朋友倾力总结,包括java并发,mysql,redis,kafka,zookeeper原理以及面试套路等)
阿里内部强制执行的redis使用规范,违者绩效直接3.25 - 文章图片

福利二:

长按扫描下方二维码,加号主微信,然后将本文转发朋友圈,攒够30个赞,截图反馈给号主,就能获得如下福利:

  • 获邀进入号主创建的互联网大厂面试讨论群。

  • 以6折优惠价(原价1499元/个)获得笔者一对一收徒第三期的名额(前提是需要有一定的基础,需要通过考核),先到先得,每期5个名额,前两期10名学徒全部收获大厂offer,平均月薪28k以上。

  • 阿里,腾讯,美团,滴滴,字节,百度等大厂内推机会。
    阿里内部强制执行的redis使用规范,违者绩效直接3.25 - 文章图片



推荐阅读
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了OkHttp3的基本使用和特性,包括支持HTTP/2、连接池、GZIP压缩、缓存等功能。同时还提到了OkHttp3的适用平台和源码阅读计划。文章还介绍了OkHttp3的请求/响应API的设计和使用方式,包括阻塞式的同步请求和带回调的异步请求。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • k8s+springboot+Eureka如何平滑上下线服务
    k8s+springboot+Eureka如何平滑上下线服务目录服务平滑上下线-k8s版本目录“上篇介绍了springboot+Euraka服务平滑上下线的方式,有部分小伙伴反馈k ... [详细]
  • 导读:在编程的世界里,语言纷繁多样,而大部分真正广泛流行的语言并不是那些学术界的产物,而是在通过自由发挥设计出来的。和那些 ... [详细]
  • php课程Json格式规范需要注意的小细节
    JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgramming ... [详细]
author-avatar
刘志樺伟宇佳君
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有