百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

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

mhr18 2024-11-03 13:36 25 浏览 0 评论

提示:阅读本文大概需要5分钟,践行本文大概需要整个职业生涯, 因此墙裂建议各位读者关注号主,收藏本文,以备不时之需

前言

目前互联网大厂大量使用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数据库的分库分表方案

相关推荐

一个开源免费高颜值的轻量级商业智能BI平台Superset 介绍

传统的企业信息化,一般分为三个发展阶段:手工-》系统化(电子化),系统化-》跨系统集成整合(消除信息孤岛,形成一个整体),集成整合-》决策支持(面向中高层领导进行数据分析),即可称商务智能或商业智能领...

Oracle-rac 修改scanip(oracle修改schema名)

Oracle_rac在实时恢复后--实际应用中往往需要修改sacnip对外提供之前的连接ip。一、修改IP前后对照前:public192.168.0.141192.168.0.142vip192.1...

开源 轻量级 工作流框架(带工作流的开源框架)

大家好,我是946,欢迎进入我的技术分享时刻预览背景相对流行工作流框架如下:Activiti基于BPMN2.0标准,轻量级Java框架,支持任务分配、流程监控。分支:Activiti5/6/7(最...

数据库工程师必学的 100 个数据库命令(全栈实操版)

覆盖系统:MySQL/PostgreSQL/Oracle/SQLServer适合人群:DBA、后端工程师、数据分析工程师涉及技能:数据定义、数据操作、安全权限、性能调优、备份恢复、监...

Ceph分布式存储底层实现原理(分布式存储底层协议)

ServerSAN(分布式存储)概念由多个独立的服务器自带的存储组成一个存储资源池同时融合的存储和计算资源SDS(软件定义存储)将硬盘资源整合起来并通过软件编程来定义这些资源软件定义的存储可...

基于Spring+SpringMVC+Mybatis分布式敏捷开发系统架构(附源码)

前言zheng项目不仅仅是一个开发架构,而是努力打造一套从前端模板-基础框架-分布式架构-开源项目-持续集成-自动化部署-系统监测-无缝升级的全方位J2EE企业级开发解...

从金山游侠到千千静听,曾经风靡一时的经典软件,如今还剩几个?

如果你在2000年后用过电脑,那你一定记得那些曾经红极一时的软件。然而时代变了,很多经典软件的命运,不是被大厂收购后逐渐消失,就是干脆停更、倒闭。但奇妙的是,即使在如今,仍有人在用这些“老软件”。今天...

Chat2DB + DeepSeek-V3 和 DeepSeek-R1,让每个人都能轻松处理数据

Chat2DB网上推出的一款集成了AI功能的免费的多数据库客户端工具——Chat2DB。快来试试吧。这是专为个人打造的数据库管理、数据开发及数据分析工具。作为一款AI产品,Chat2DB将人工智能...

MyBatis如何实现分页查询?(mybatisplus分页查询到的总数据量)

一句话总结MyBatis实现分页主要有三种方式:1.使用RowBounds对象进行内存分页(适用于小数据量);2.在SQL中直接编写LIMIT/OFFSET语句(如MySQL);3.通过分页插件...

mysql一 基本操作(mysql基础操作命令)

先讲数据库--mysql、redis、MongoDB爬虫今天的内容:mysql一基本操作注意事项:1.安装:自己安装,有问题可以问老师、可以自己找办法解决2.上课:先讲知识点再回答问题3....

香港DM德馬景泰藍文科集團20250702期《生命的收獲》LIN JING DE

香港DM德馬景泰藍文科集團20250702期《生命的收獲》DMSIXSEVEN/LINJINGDE/1973主編供圖:香港DM德馬數字甲骨文集團Hongkong-basedDMDelm...

01.Java发展历史(java发展简史)

1.Java发展历史Java由SunMicrosystems公司(现为Oracle公司)的JamesGosling及其团队在1991年开发,最初命名为"Oak",后改名为"...

月薪最高12000!看看这些宝山岗位有没有你心仪的~

招聘目录信息1猎上网络科技(上海)有限公司职位分析师职位分析师助理2上海祥腾金属材料有限公司商务车驾驶员3上海赋拓物联网技术有限公司软件测试工程师4上海集优标五高强度紧固件有限公司...

69岁的Java之父终于退休了,他竟然也经历过职场PUA

有些程序员不到35岁就要担心被优化,但有的程序员干到了69岁的高龄,才准备退休。就前几天,Java之父詹姆斯·高斯林,自个儿在领英上宣布以后要美美享受退休生活了。这一下子,就炸出了不少...

ocm认证年薪多少?(ocm认证好考吗)

从业数据库方面的工程师待遇都很好,年薪30万都是比较平常的事。OCM认证的价值可以归纳成以下几点:1、可以全面掌握Oracle知识,专业知识完善;2、证书对于公司招投标有巨大作用,甚至可以不上班就拿钱...

取消回复欢迎 发表评论: