代码规范 —— Redis 开发规范

news2024/11/17 13:57:43

优质博文:IT-BLOG-CN
在这里插入图片描述

一、开发规范

【1】弱依赖检查与线下确认:Redis必须是弱依赖,即Redis宕机不影响业务。包括超时检查。
【2】是否当存储使用检查:Redis不能作为存储设备来使用,只能作为缓存或状态等场景来使用。存储优先使用本地缓存。
【3】超时时间检查与线下确认:Redis使用需要设置超时时间。如果超时,对应的策略和方案是什么。
【4】无状态检查:Redis同一个Key不能被不同的应用,不同的场景使用。谁生产,谁消费的原则。
【5】同步锁检查:优先使用集团框架提供的分布式锁。
【6】Key检查:Key的唯一性是否存在明显问题,与其他场景和应用的重名的可能。Key的长度,尽可能的小于128字节,禁止超过1024简洁性
保证语义的前提下,控制key的长度,当key较多时,内存占用也不容忽视可读性和可管理性 以业务名(或数据库名)为前缀(防止key冲突),用冒号分隔,比如业务名:表名:id不要包含特殊字符,反例:包含空格、换行、单双引号以及其他转义字符需要规范(car+应用名+业务名+具体id
【7】审批记录检查:是否已经在审批记录conf完整记录,包括审批人。

二、场景使用

合理使用数据结构: Redis支持的数据库结构类型较多:字符串String,哈希Hash,列表List,集合Set,有序集合Sorted Set, Bitmap, HyperLogLog和地理空间索引geospatial redis命令

需要根据业务场景选择合适的类型,常见的如:
【1】String可以用作普通的K-V、计数类;
【2】Hash可以用作对象如商品、经纪人等,包含较多属性的信息;
【3】List可以用作消息队列(不推荐)、粉丝/关注列表等;
【4】Set可以用于推荐;
【5】Sorted Set可以用于排行榜等;

三、键值设计

key设计:
【1】可读性和可管理性【建议】
   ☑️ 以业务名(或数据库名)为前缀(防止key冲突),用冒号分隔。
   ☑️ 应用名:表名:id
【2】简洁性,key长度适中【建议】
   ☑️ 保证语义的前提下,控制key的长度,当key较多时,内存占用也不容忽视。
    eg:user:{uid}:friends:messages:{mid}简化为u:{uid}:fr:m:{mid}
【3】不要包含特殊字符【强制】
   ☑️ 禁止包含特殊字符如空格,换行,单双引号,其他转义字符。
【4】Key个数限制【强制】
   ☑️ 由于Redis Rehash机制,实例Key数量达到一定值rehash操作时,需要有一定量空闲内存资源,如key达到134217728rehash需要有2gb空闲内存资源,达到268435456时,rehash需要有4gb空闲内存资源。如果没有组够的内存资源rehash时会发生Key剔除(数据丢失/程序超时/甚至引起切换)。
    单实例key个数达到134217728已经很大了,实例元素过大对于后续分析rdb遍历大key时会非常耗时。

四、value设计

【1】拒绝bigkey(防止网卡流量、慢查询)
   ☑️ 防止网卡流量、慢查询,string类型控制在10KB以内,hashlistsetzset元素个数不要超过5000
   ☑️ 非字符串的bigkey,不要使用del删除,使用hscansscanzscan方式渐进式删除,同时要注意防止bigkey过期时间自动删除问题(例如一个200万的zset设置1小时过期,会触发del操作,造成阻塞,而且该操作不会出现在慢查询中(latency可查))
   ☑️ credis页面,群集所有者可以通过unlink异步清理或小批量迭代清理(或提事件给DBA来处理)

【2】一定要设置过期时间,当实例写满,根据volatile-lru淘汰老的数据
   ☑️ redis只是缓存,不能当成数据库来用。不设置过期时间,redis实例大小会一直无限增长,会出现机器内存耗尽、故障恢复耗时特别长等问题。
   ☑️ 建议使用expire设置过期时间(条件允许可以打散过期时间,防止集中过期),不过期的数据重点关注idletime(该命令返回的是当前键从上一次访问到现在经过的时间(单位,秒))
   ☑️ DBA会定期对redis集群中过期时间超过1年的数据做告警处理。

五、命令使用

【1】禁用KEYS正则匹配,可用SCAN代替
   ☑️ 禁止线上使用keysflushallflushdb等,通过redisrename机制禁掉命令,或者使用scan的方式渐进式处理。
【2】O(N)命令关注N,控制集合元素尽可能小
   ☑️ hgetall/lrange/smembers/zrange等在集合包含元素个数较少的情况下使用。
   ☑️ 若规模较大,有遍历需求,可用HSCAN/SSCAN/ZSCAN渐进式遍历。
【3】合理使用select
   ☑️ redis的多数据库较弱,使用数字进行区分,很多客户端支持较差,同时多业务用多数据库实际还是单线程处理,会有干扰。
【4】Redis事务支持较弱,不建议过多使用
   ☑️ redis的事务功能较弱(不支持回滚),而且集群版本(自研和官方)要求一次事务操作的key必须在一个slot上(可以使用hashtag功能解决)
【5】线上禁止使用monitor命令
   ☑️ 禁止生产环境使用monitor命令,monitor命令在高并发条件下,会存在内存暴增和影响Redis性能的隐患。
【6】使用批量操作提高效率
   ☑️ 原生命令:例如mgetmset
   ☑️ 非原生命令:可以使用pipeline提高效率。
   ☑️ 但要注意控制一次批量操作的元素个数(例如500以内,实际也和元素字节数有关)。
注意两者不同:
     1、原生是原子操作,pipeline是非原子操作。
     2、pipeline可以打包不同的命令,原生做不到。
     3、pipeline需要客户端和服务端同时支持。

六、数据保存

【1】容量合理评估
   ☑️ 在系统设计阶段,需要考虑当前redis集群的容量是否足够,设置合理的大小和过期时间
     1、内存使用率保持在[50%~85%]之间。
     2、使用率<50%需要考虑缩容。
     3、使用率>85%需要考虑扩容。

【2】冷热数据分离
   ☑️ 虽然Redis支持持久化,但是Redis的数据存储全部都是在内存中的,成本昂贵。
   ☑️ 建议根据业务只将高频热数据存储到Redis中【QPS大于5000】,对于低频冷数据可以使用MySQL/ElasticSearch/MongoDB等基于磁盘的存储方式,不仅节省内存成本,而且数据量小在操作时速度更快、效率更高。

【3】不同的业务数据要分开存储
   ☑️ 不要将不相关的业务数据都放到一个Redis实例中,建议新业务申请新的单独实例。
   ☑️ 因为Redis为单线程处理,独立存储会减少不同业务相互操作的影响,提高请求响应速度;同时也避免单个实例内存数据量膨胀过大,在出现异常情况时可以更快恢复服务。

【4】必须要存储的大文本数据一定要压缩后存储
   ☑️ 对于大文本【一般超过500字节】写入到Redis时,建议要压缩后存储。
   ☑️ 大文本数据存入Redis,除了带来极大的内存占用外,在访问量高时,很容易就会将网卡流量占满,进而造成整个服务器上的所有服务不可用,并引发雪崩效应,造成各个系统瘫痪

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2052711.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Mudo库】实战项目之简要介绍

文章目录 前言一、效果演示二、模块1. 介绍2. 服务器模块3. 应用层模块 尾序 前言 各位C友们&#xff0c;好久不见&#xff0c;最近一个月在搞项目&#xff0c;算是半摆半学的状态吧&#xff0c;博客断更了一段时间&#xff0c;现在项目搞完了&#xff0c;博客之后也会慢慢更新…

机器学习周报(8.12-8.18)

文章目录 摘要Abstract1.Transformer的结构1.1 序列到序列&#xff08;Seq2seq&#xff09;的模型1.2 Transformer 结构1.2.1 Transformer 编码器&#xff08;Encoder&#xff09;1.2.2 Transformer解码器&#xff08;Decoder&#xff09;1.2.3 编码器-解码器注意力&#xff08…

Java语言程序设计——篇十四(2)

&#x1f33f;&#x1f33f;&#x1f33f;跟随博主脚步&#xff0c;从这里开始→博主主页&#x1f33f;&#x1f33f;&#x1f33f; 欢迎大家&#xff1a;这里是我的学习笔记、总结知识的地方&#xff0c;喜欢的话请三连&#xff0c;有问题可以私信&#x1f333;&#x1f333;&…

c++11(二)

一、右值引用 1、区分左值和右值 语法定义&#xff0c;左值可以取地址&#xff0c;右值无法取地址&#xff08;右值肯定有地址&#xff0c;但是为了和左值区分&#xff0c;语法上不让取地址&#xff09; 左值&#xff1a;一个表示数据的表达式&#xff08;变量名或解引用指针…

如何配置ESXI主机的IP地址管理

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f427;Linux基础知识(初学)&#xff1a;点击&#xff01; &#x1f427;Linux高级管理防护和群集专栏&#xff1a;点击&#xff01; &#x1f510;Linux中firewalld防火墙&#xff1a;点击&#xff01; ⏰️创作…

通过python脚本查询自己阿里云账号里的某个域名的A记录解析情况,以及测拨,用于排查未使用的解析

安装sdk pip install aliyun-python-sdk-alidns代码全文 import json import requests from aliyunsdkcore.client import AcsClient from aliyunsdkalidns.request.v20150109 import DescribeDomainRecordsRequest# 替换为你的阿里云 AccessKey ID 和 AccessKey Secret acce…

栈与队列 - 逆波兰表达式求值

150. 逆波兰表达式求值 方法一&#xff1a;栈 /*** param {string[]} tokens* return {number}*/ var evalRPN function(tokens) {const stack [];for (const token of tokens) {if (isNaN(Number(token))) { // 非数字const n2 stack.pop(); // 出栈两个数字const n1 s…

假期作业--数据结构

1、顺序表实现学生管理系统&#xff08;参照顺序表技能&#xff09;写出菜单界面switch选择&#xff0c;功能1创建顺序表&#xff08;堆区&#xff09;&#xff0c;2录入学生信息&#xff0c;3插入一个学生信息&#xff0c;4删除一个学生信息&#xff0c;5按照位置修改一个学生…

javaEE中自定义注解以及注解的解析

注解&#xff1a; 就是java代码里的特殊标记&#xff0c;比如Override、Test,作用是&#xff1a;让其它程序根据注解信息来决定怎么执行程序。 自定义注解&#xff1a;自己定义注解 Public interface 注解名称{ Public 属性类型 属性名&#xff08;&#xff09; default 默认…

写字楼/办公室为什么要建设智慧公厕?有哪些价值?@卓振思众

智慧公厕是指利用先进技术和设备对公共厕所进行智能化管理的系统。这些技术包括物联网&#xff08;IoT&#xff09;、传感器技术、大数据分析和自动化系统等。【卓振思众】智慧公厕不仅提升了公厕的使用体验&#xff0c;还实现了更高效的管理和维护。 写字楼/办公室智慧公厕的定…

揭秘RAG与大模型对接:深入探讨9大隐藏挑战

前一段时间&#xff0c;各个大模型在争斗&#xff1a;谁能携带更长、更大的上下文 Prompt&#xff0c;比如 Kimi 说 200 万字&#xff0c;阿里通义千问又说自己能达 1000 万字&#xff1b;大家都知道 Prompt 很重要&#xff0c;但是 RAG 和 长的上下文文本携带 是两个不同的技术…

mac查看jdk安装目录

打开终端&#xff0c;直接输入命令&#xff1a; /usr/libexec/java_home终端即会输出jdk的安装目录&#xff1a;

8.17日学习打卡---Spring Cloud Alibaba(四)

8.17日学习打卡 目录&#xff1a; 8.17日学习打卡分布式流量防护什么是服务雪崩解决方案内部异常治理外部流量控制 SentinelSentinel 基本概念Sentinel 的主要特性Sentinel 是如何工作的Sentinel 与 Hystrix、resilience4j 的对比安装Sentinel控制台将应用接入Sentinel流量控制…

python使用flask实现自动根据url寻找对应目录/文件/方法,实现动态路由

例如访问:/user/index/index_config 则自动访问/user 目录里 index.py文件里的 index_config 方法 实现代码 from flask import Flask,jsonifyapp Flask(__name__)def reg_func(code, data, msg, debugNone, showFalse):return jsonify({code: code,data: data,msg: msg,time…

iPhone照片怎么导入电脑?一键导入毫不费力

随着智能手机的普及&#xff0c;我们越来越依赖手机来记录生活的点点滴滴。iPhone作为其中的佼佼者&#xff0c;其高质量的摄像头为用户捕捉了无数珍贵瞬间。然而&#xff0c;随着照片数量的增多&#xff0c;手机存储空间可能会变得捉襟见肘&#xff0c;此时将照片导入电脑既能…

UniAD_面向规划的自动驾驶

Planning-oriented Autonomous Driving 面向规划的自动驾驶 https://github.com/OpenDriveLab/UniAD Abstract Modern autonomous driving system is characterized as modular tasks in sequential order, i.e., perception, prediction, and planning. In order to perfor…

Python 如何创建和管理虚拟环境?

Python虚拟环境是一个独立的运行环境&#xff0c;能够与系统的全局Python环境相隔离。它允许你在不影响系统其他项目的前提下&#xff0c;为每个项目创建独立的Python环境&#xff0c;并在该环境中安装特定版本的包和依赖项。这在开发多个项目时非常有用&#xff0c;尤其是当这…

EmguCV学习笔记 VB.Net 4.1 颜色变换

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 教程VB.net版本请访问&#xff1a;EmguCV学习笔记 VB.Net 目录-CSDN博客 教程C#版本请访问&#xff1a;EmguCV学习笔记 C# 目录-CSD…

使用Python实现B站自动答题机器人

文章目录 1. 写在前面2. 接口分析3. 点选验证分析4. Python程序实现 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长…

解密Linux中的通用块层:加速存储系统,提升系统性能

通用块层 通用块层是Linux中的一个重要组件&#xff0c;用于管理不同块设备的统一接口&#xff0c;减少不同块设备的差异带来的影响。它位于文件系统和磁盘驱动之间&#xff0c;类似于Java中的适配器模式&#xff0c;让我们无需关注底层实现&#xff0c;只需提供固定接口即可。…