阿里内部强制执行的redis使用规范,违者绩效直接3.25
mhr18 2024-11-03 13:36 19 浏览 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数据一致性规范
必须采用延时双删策略,具体操作如下:
- 写数据库
- 删除缓存
- 同步延时或者订阅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数据库的分库分表方案
相关推荐
- 使用 Docker 部署 Java 项目(通俗易懂)
-
前言:搜索镜像的网站(推荐):DockerDocs1、下载与配置Docker1.1docker下载(这里使用的是Ubuntu,Centos命令可能有不同)以下命令,默认不是root用户操作,...
- Spring Boot 3.3.5 + CRaC:从冷启动到秒级响应的架构实践与踩坑实录
-
去年,我们团队负责的电商订单系统因扩容需求需在10分钟内启动200个Pod实例。当运维组按下扩容按钮时,传统SpringBoot应用的冷启动耗时(平均8.7秒)直接导致流量洪峰期出现30%的请求超时...
- 《github精选系列》——SpringBoot 全家桶
-
1简单总结1SpringBoot全家桶简介2项目简介3子项目列表4环境5运行6后续计划7问题反馈gitee地址:https://gitee.com/yidao620/springbo...
- Nacos简介—1.Nacos使用简介
-
大纲1.Nacos的在服务注册中心+配置中心中的应用2.Nacos2.x最新版本下载与目录结构3.Nacos2.x的数据库存储与日志存储4.Nacos2.x服务端的startup.sh启动脚...
- spring-ai ollama小试牛刀
-
序本文主要展示下spring-aiollama的使用示例pom.xml<dependency><groupId>org.springframework.ai<...
- SpringCloud系列——10Spring Cloud Gateway网关
-
学习目标Gateway是什么?它有什么作用?Gateway中的断言使用Gateway中的过滤器使用Gateway中的路由使用第1章网关1.1网关的概念简单来说,网关就是一个网络连接到另外一个网络的...
- Spring Boot 自动装配原理剖析
-
前言在这瞬息万变的技术领域,比了解技术的使用方法更重要的是了解其原理及应用背景。以往我们使用SpringMVC来构建一个项目需要很多基础操作:添加很多jar,配置web.xml,配置Spr...
- 疯了!Spring 再官宣惊天大漏洞
-
Spring官宣高危漏洞大家好,我是栈长。前几天爆出来的Spring漏洞,刚修复完又来?今天愚人节来了,这是和大家开玩笑吗?不是的,我也是猝不及防!这个玩笑也开的太大了!!你之前看到的这个漏洞已...
- 「架构师必备」基于SpringCloud的SaaS型微服务脚手架
-
简介基于SpringCloud(Hoxton.SR1)+SpringBoot(2.2.4.RELEASE)的SaaS型微服务脚手架,具备用户管理、资源权限管理、网关统一鉴权、Xss防跨站攻击、...
- SpringCloud分布式框架&分布式事务&分布式锁
-
总结本文承接上一篇SpringCloud分布式框架实践之后,进一步实践分布式事务与分布式锁,其中分布式事务主要是基于Seata的AT模式进行强一致性,基于RocketMQ事务消息进行最终一致性,分布式...
- SpringBoot全家桶:23篇博客加23个可运行项目让你对它了如指掌
-
SpringBoot现在已经成为Java开发领域的一颗璀璨明珠,它本身是包容万象的,可以跟各种技术集成。本项目对目前Web开发中常用的各个技术,通过和SpringBoot的集成,并且对各种技术通...
- 开发好物推荐12之分布式锁redisson-sb
-
前言springboot开发现在基本都是分布式环境,分布式环境下分布式锁的使用必不可少,主流分布式锁主要包括数据库锁,redis锁,还有zookepper实现的分布式锁,其中最实用的还是Redis分...
- 拥抱Kubernetes,再见了Spring Cloud
-
相信很多开发者在熟悉微服务工作后,才发现:以为用SpringCloud已经成功打造了微服务架构帝国,殊不知引入了k8s后,却和CloudNative的生态发展脱轨。从2013年的...
- Zabbix/J监控框架和Spring框架的整合方法
-
Zabbix/J是一个Java版本的系统监控框架,它可以完美地兼容于Zabbix监控系统,使得开发、运维等技术人员能够对整个业务系统的基础设施、应用软件/中间件和业务逻辑进行全方位的分层监控。Spri...
- SpringBoot+JWT+Shiro+Mybatis实现Restful快速开发后端脚手架
-
作者:lywJee来源:cnblogs.com/lywJ/p/11252064.html一、背景前后端分离已经成为互联网项目开发标准,它会为以后的大型分布式架构打下基础。SpringBoot使编码配置...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)