Redis缓存组件开发规范

Spring Boot 核心机制与实战:从自动装配到 MySQL、Redis、Security 集成 在 Java Web 开发领域,Spring Boot 通过其核心机制——自动装配(Auto-Configuration)和 Starter 依赖,极大地简化了企业级应用的构建与部署流程。自动装配的原理在于,框架根据项目引入的依赖和现有配置,智能地装配所需的 Spring Bean,实现了“约定大于配置”的理念。这一机制的技术价值在于,它将开发者从繁琐的 XML 配置和依赖管理中解放出来,显著提升了开发效率,并确保了应用的生产就绪性。其应用场景广泛覆盖了 Web 服务、数据访问、缓存和安全认证等现代应用的核 阅读详情

文章系转载,便于整理和归纳,源文地址:http://www.hyhblog.cn/2019/05/16/cache-redis-guidelines/

1. 简介

Redis是业界流行的缓存组件,为了规范Redis缓存的使用,避免落入各种问题陷阱,特此编写了此开发规范。本规范结合实际情况,描述了需要遵守的Redis最佳使用规约,及其供参考的最佳实践,供研发团队在项目开发中使用。

本文将出现如下规约术语,其中根据约束力强弱,规约分别有如下三级,
【强制】必须遵守的规约
【推荐】推荐遵守的规约,若无特殊情况,需要遵守该规约
【参考】参考遵守的规约,团队根据实际情况,可以选择性的遵守

每一个规约,根据情况,将有如下附加说明,

  • 说明:对规约进一步的引申和解释
  • 正例:提供一个正面遵守规约的样例
  • 反例:提供一个规约的反面样例,以及真实的错误案例,提醒误区

2. 规约

2.1 键值设计

  1. 【强制】键的命名使用英文小写和冒号、下划线、数字,其中冒号和下划线不能作为键名的开始和结束,而冒号为命名空间分隔符。不要使用中文和特殊字符作为健名。

    • 正例:“pphh:account:user1”
    • 反例1:“pphh.账号-USER1”,该反例使用了点、中文、中划线、英文大写。
    • 反例2:":pphh:account:user1_", 该反例使用了冒号和下划线作为开始和结束
  2. 【推荐】键的命名尽量简单、清晰、易懂,长度尽量控制在32个字符以内,不要超过64个字符。

    • 说明:长的键名不仅消耗内存空间,而且会影响键的搜索查询速度。为了保证键的可读性,也不推荐太短的键名,比如"u1000flw",可以使用"user:1000:followers"来表达。
    • 反例1:“pphh:account:loooooooooooooooooooooooooooooooooooooooooog:name”
  3. 【推荐】键的命名空间分为三级,格式为 {系统简称}:{应用名}:{业务健名},命名空间通过冒号区分,公共键值以common表示。

    • 正例1:“web:home_page:click”
    • 正例2:“common:user_login:verification_code”
    • 反例3:“web_home_page_click”
  4. 【推荐】键的值存储空间大小尽量在10KB以内,不推荐存储大于1MB的值。

  5. 【推荐】对于列表键(Hash、List、Set、Zset),尽量控制元素个数不超过千万数量级,若大于这个数量级,建议通过键值切分列表。有的说是5000以下

  6. 【推荐】建议List当做队列来使用。

2.2 应用规约

  1. 【推荐】业务应用尽量不在Redis存储持久状态,并且需要考虑和实现键值随时失效时的数据更新方法。

  2. 【推荐】对于键值,建议设置随机失效时间,避免同一时间大量键值失效,从而导致的缓存雪崩问题。

    • 说明:设置合适的随机失效时间,以避免在同一时间大量key失效。
  3. 【推荐】在使用缓存时,关注访问不存在键时导致的缓存穿透问题,关注热key导致的缓存击穿问题。

    • 说明:可以通过监控机制获取当前热key的访问情况,以便改进键值分布,详情见下文的监控告警。
  4. 【强制】禁止使用全表搜索命令,比如keys等命令。

    • 说明:请使用scan实现游标式的遍历,建议通过rename-command将keys命令禁用。
  5. 【推荐】使用scan实现游标式的遍历,实现全表搜索。

  6. 【推荐】对于O(N)时间复杂度的Redis命令,在使用时要预估N的大小,建议N不大于1000。

    • 说明:对于O(N)的Redis命令,当N的数量级不可预知时,则应避免使用。对一个Hash数据执行HGETALL/HKEYS/HVALS命令,通常来说这些命令执行的很快,但如果这个Hash中的元素数量级增大后,耗时就会成倍增长。
  7. 【推荐】键的排序、并集、交集等操作时间复杂度都在O(N),建议这些排序、并集、交集操作放在应用代码里执行。

    • 说明:使用SUNION对两个Set执行并集操作,或使用SORT对List/Set执行排序操作等时,当列表元素很多时,容易导致Redis操作时间很长,形成阻塞。
  8. 【强制】禁止如下命令的使用:flushall,flushdb

    • 说明:键值的删除建议通过scan和del命令相配合的方式删除,建议通过rename-command将flushall和flushdb命令禁用。
  9. 【推荐】推荐使用Redis的批量操作命令,比如MSET/MGET/HMSET/HMGET等等,以取代多次单键操作。

    • 说明:一个MSET批量操作命令可以替代多次SET操作,这可以大大减少维护网络连接和传输数据所消耗的资源和时间。

2.3 服务端配置

  1. 【推荐】搭建Redis集群,保障高可用服务,对热键可以考虑读写分离的架构实现。

  2. 【推荐】选择RDB的数据持久化方式。

    • 说明:Redis支持RDB和AOF两种持久化方式,相比AOF,RDB方式性能影响最小,其保存快照时是通过fork的子线程进行,几乎不影响Redis处理客户端请求,生成的快照文件大小也比AOF方式小,从快照中恢复数据的速度也要更快。RDB的缺点是其快照生成是定期的,在Redis出现问题时会出现数据丢失,这需要业务代码能够进行一定的容错处理(即:Redis缓存不保证数据的一致性)。
    save 900 1     # 每900秒检查一次数据变更情况,如果发生了1次或以上的数据变更,则进行RDB快照保存
    save 300 10    # 每300秒检查一次数据变更情况,如果发生了10次或以上的数据变更,则进行RDB快照保存
    save 60 10000  # 每60秒检查一次数据变更情况,如果发生了100次或以上的数据变更,则进行RDB快照保存
    
  3. 【建议】合理使用Redis database功能

    • 说明:Redis database主要是实现命名空间的功能,实际工作中通过冒号区分命名空间已经足够。Redis的多数据库功能比较简单,不同的数据库支持空间查询、键值清空等操作,并且多个数据库还是单线程处理,相互之间有影响,不同数据库是通过数字区分。
  4. 【推荐】关注网络带宽和延时

    • 说明:相比CPU和内存,网络带宽和延时对Redis服务带来的性能影响更加明显、更加直接。一个4KB的字符串,在10000 q/s的高并发请求量下需要的带宽达312.5 Mbit/s,这个需要千兆带宽的网卡。
  5. 【推荐】设置最大内存,不超过物理内存空间的大小,避免使用swap空间。

    • 说明:默认情况下,在32位OS中,Redis最大使用3GB的内存,在64位OS中则没有限制。当应用使用的虚拟内存空间暂满了物理内存空间,则会开始使用swap空间,可以通过maxmemory来设置Redis的可用最大内存。注意设置时预留一定的主机物理可用内存,以便其它应用运行。
    maxmemory 4000mb
    
  6. 【推荐】设置数据淘汰策略,当Redis的内存空间达到最大可用内存后,则可以根据有效的淘汰策略尝试淘汰数据,释放空间。

    • 说明:默认情况下,Redis不进行数据淘汰。如果当Redis的内存空间达到设置的maxmemory后,若没有配置数据淘汰策略,或者没有数据可以淘汰,那么Redis会对所有写请求返回错误。推荐使用volatile-lru,使用LRU算法进行数据淘汰(淘汰上次使用时间最早的,且使用次数最少的key),其只淘汰设定了有效期的key。
    maxmemory-policy volatile-lru   # 默认是noeviction,即不进行数据淘汰
    
  7. 【强制】开启慢查询记录。

    slowlog-log-slower-than 10000  # 执行时间慢于10毫秒的命令计入慢查询日志
    slowlog-max-len 1024  # 慢查询日志记录长度
    

2.4 客户端配置

  1. 【强制】使用连接池
    • 说明:Redis连接的创建非常耗时,Redis服务的键值查询一般在微妙级别,但是网络连接和传输的耗时在毫秒级别,因此通过连接池来保持连接,可以有效地保证Redis缓存的请求速度,避免频繁连接带来的性能损耗。
  2. 【强制】合理配置连接池
    • 说明:Redis服务端可支持的连接数是有限的,合理配置连接池,可以有效地支持高并发需求场景,也可以在空闲时节约连接数。这些配置包括:最小和最大空闲连接数、空闲连接淘汰策略等。

2.5 安全

  1. 【强制】Redis在设计时要求运行在一个安全的内网,因此禁止暴露Redis服务到外网空间。

    • Redis在设计之初是为了最大的性能考虑,在安全上考虑比较弱,因此不应该暴露Redis服务到外网空间,也就是不应该有外网的客户端访问Redis TCP端口服务。
  2. 【强制】设置用户登录密码

2.6 监控告警

  1. 【强制】定时监控慢查询,对于慢查询操作进行分析并解决,避免再次发生。
  2. 【推荐】定时分析Redis big keys,避免占用空间大的Redis健值,合理拆分。
    • 说明:可以通过redis-cli --bigkeys -i 0.1命令查询大的Redis健值。
  3. 【推荐】定时分析Redis热键,设置合理的过期失效时间和更新时间,设计合理的键值分布。
    • 说明:在Redis 4.0版本以上,可以通过redis-cli --hotkeys命令查询大的Redis热键。
  4. 【推荐】定时分析Redis内存空间使用情况,通过RDB快照获取内存空间,查出占用空间大的键值,并进行拆分修复。

3. 参考资料

  1. Redis官方文档
  2. Redis官网:数据类型简介
  3. Redis官网:性能简介
  4. Redis官网:安全简介
  5. 阿里云Redis开发规范
  6. Redis基础、高级特性与性能调优
  7. 阿里云Redis最佳实践:内存分析方法
  8. 阿里云Redis最佳实践:Redis 4.0 热点Key查询方法
Dify开源LLM平台:工作流自动化与AI应用开发实践 工作流自动化是现代AI工程化中的关键技术,通过可视化编排将大语言模型(LLM)能力转化为实际生产力。Dify作为开源LLM应用平台,采用松耦合架构设计,包含DSL解释引擎、沙箱执行环境和插件总线系统三大核心组件,支持Python、Node.js等多语言运行时。其技术价值在于降低AI应用开发门槛,非技术人员也能通过200+现成模板快速构建知识管理、多模态生成等场景解决方案。典型实现如文件处理工作流,结合动态变量注入和Docker挂载机制,实现从CSV读取到JSON转换的自动化流水线。在性能优化方面,通过批处理 阅读详情

相关推荐

Redis【 Redis企业级解决方案(Redis脑裂、缓存预热、缓存穿透、缓存击穿、缓存雪崩、Redis开发规范、数据一致性 )】(七)-全面详解(学习总结---从入门到深化)

Redis【 Redis企业级解决方案(Redis脑裂、缓存预热、缓存穿透、缓存击穿、缓存雪崩、Redis开发规范、数据一致性 )】(七)-全面详解(学习总结---从入门到深化)

763

实践_Redis开发规范

Redis 开发规范总结

初学者乐园的博客 640

redis 开发和使用规范 (最详细)

最全redis开发和使用规范,以及各种使用场景介绍,redis各种数据类型分析等等

代码规范 —— Redis 开发规范

除了带来极大的内存占用外,在访问量高时,很容易就会将网卡流量占满,进而造成整个服务器上的所有服务不可用,并引发雪崩效应,造成各个系统瘫痪。的多数据库较弱,使用数字进行区分,很多客户端支持较差,同时多业务用多数据库实际还是单线程处理,会有干扰。等基于磁盘的存储方式,不仅节省内存成本,而且数据量小在操作时速度更快、效率更高。设置过期时间(条件允许可以打散过期时间,防止集中过期),不过期的数据重点关注。☑️ 禁止包含特殊字符如空格,换行,单双引号,其他转义字符。不能被不同的应用,不同的场景使用。

程序猿进阶 2783

恭喜,恭喜,iMouse爱鼠XP版全面发布测试,苹果手机自动化测试必须

电脑控制苹果手机,免越狱,免签名,自动化测试

qq_41057894的博客 1064

JS+H5打字练习器

实现功能 1.导入.TXT文件到打字练习内容(部分浏览器可能出于安全问题限制了这一步操作) 2.输入文本到打字练习内(弹出输入框,将要练习的内容输入至输入框) 3. 开始练习,并根据正误在打字练习内容文本上修改颜色(某个字正确显示绿色,某个字错误,显示红色,某个字没有打显示灰色) 4.开始练习、结束练习,全部输入完成后自动结束练习,也可提前手动结束练习,结束练习后弹窗用显示时和正确率。(区别在于一个全部输入完成且全部正确,一个提前结束无其他条件) 效果图 分析 HTML 结构解析 根元素:<!DO

w11111xxxl的博客 1414

Redis开发规范

为了让开发人员更合理的使用Redis,提升Redis服务的应用的可用性、可靠性和稳定性,缩短故障后服务恢复时间。

xiaolyuh的专栏 558

快手商业化风控内容审核场景下的大模型早期探索与应用

在处理大量的自动语音识别(ASR)输出时,面临的主要挑战之一是文本的冗长和格式混乱,这严重影响了审核人员的阅读效率。为了解决这一问题,我们利用大模型的理解能力对文本进行智能总结,可以显著优化文本内容,使其更加清晰并且具有可读性。该方式极大地提高了审核过程的效率,审核人员可以更快地处理信息,减少了处理时间和劳动强度。

kuaishoutech的博客 2740

死磕 NoSQL 数据库系列(二十三):Redis 开发规范

点关注公众号,回复“1024”获取2TB学习资源!前面介绍了:Redis 缓存问题(一致性、击穿、穿透、雪崩、污染)、内存消耗、Key过期时间、性能问题、监控等相关的知识点。今天我将详细的为大家介绍 Redis 开发规范相关知识,希望大家能够从中收获多多!如有帮助,请点在看、转发支持一波!!!本文介绍了在使用阿里云Redis的开发规范,从键值设计、命令使用、客户端使用、相关工具等方面进行说明,通过...

民工哥的博客 472

网络摄像机Sensor低光性能实测:海思平台搭配索尼IMX335 vs 豪威OV4689

本文通过海思Hi3516DV300平台,对索尼IMX335与豪威OV4689两款网络摄像机Sensor进行低光性能实测。在信噪比、动态范围及实景成像对比中,IMX335凭借更优的噪声控制与稳定性表现领先,尤其在极低光环境下优势明显。文章为安防监控项目的Sensor选型与海思平台优化提供了数据参考与实战建议。

silver的专栏 830

【迁移学习】域对抗迁移网络 DANN

Domain-Adversarial Training of Neural Networks

这个博客太懒了什么都没说 8417

MinerU智能开发框架核心组件与应用实践

检索增强生成(RAG)作为连接传统检索系统与大语言模型的关键技术,通过混合检索(Hybrid Retrieval)和假设性文档嵌入(HyDE)显著提升问答准确率。其核心原理是将外部知识库的精确检索与LLM的生成能力结合,在金融、客服等场景中实现43%的性能提升。多通道协议(MCP)则采用异步消息路由机制,配合异或校验等设计保障数据传输安全。本文以MinerU框架为例,详解其Skills模块开发规范、RAG参数调优经验及企业级部署方案,特别适用于需要处理复杂交互逻辑的知识库构建场景。

weixin_33968104的博客 508

PTC Creo软件二次开发:使用C++进行Creo二次开发实战

C++是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。由Bjarne Stroustrup在贝尔实验室开发,最初作为C语言的增强版出现,后来发展成为一种独立的语言。C++不仅保留了C语言的高效性和灵活性,还引入了类、模板、命名空间等高级特性,使其成为开发复杂系统和软件的理想选择。

kkchenjj的博客 4045

SpringBoot+Vue 网上点餐系统管理平台源码【适合毕设/课设/学习】Java+MySQL

SpringBoot+Vue 网上点餐系统管理平台源码【适合毕设/课设/学习】Java+MySQL,拿走直接用(附源码,数据库,视频,可提供说明文档(通过*AIGC*)*技术包括:MySQL、VueJS、ElementUI、(Python或者Java或者.NET)等等*功能如图所示。可以滴我获取详细的视频介绍

qq_41985346的博客 311

Android Framework SurfaceFlinger面试题及参考答案

请简述 SurfaceFlinger 在 Android 系统中的作用。 SurfaceFlinger 是 Android 系统中一个非常关键的服务。它主要负责将多个应用程序的 Surface 合成到一个屏幕显示内容中。 从应用程序的角度来看,每个应用都有自己的 UI 界面,这些 UI 界面实际上是由一系列的图层(Surface)构成。例如,一个应用可能有背景图层、按钮图层、文本图层等。应用通过向 SurfaceFlinger 提供这些 Surface 来请求显示。 SurfaceFl

大模型大数据攻城狮的专栏 1186

130、NPU的仿真测试:使用Gem5进行全系统仿真

这篇文章摘要(149字): 本文分享了使用Gem5全系统仿真器验证NPU设计的实践经验。作者通过搭建自定义NPU模型并集成到Gem5系统中,实现了CPU-NPU-内存协同仿真。关键点包括:1) 使用SimObject机制构建可配置的NPU模型;2) 合理配置IO和内存总线避免访问冲突;3) 开发Linux驱动实现CPU与NPU通信;4) 利用Gem5调试功能监控内部状态。相比RTL仿真和FPGA验证,该方法能快速验证微架构设计并定位系统级问题,有效减少了流片风险。文章特别强调了时钟域配置、总线仲裁、对齐访问

m0_50546716的博客 122

OpenClawSparkle框架:轻量级企业系统集成与多模型动态路由实践

模块化网关架构是现代企业系统集成的关键技术,通过解耦服务组件实现灵活扩展。OpenClawSparkle作为轻量级集成框架,采用Gateway路由网关和Model Adapter设计,支持Qwen、DeepSeek等大模型无缝接入。在金融分析等实时业务场景中,该框架能显著降低部署复杂度,提升模型切换效率。技术实现上涉及环境配置、依赖管理、技能开发规范等工程实践,特别适合需要快速试错的业务场景。企业级部署方案推荐结合Prometheus监控和Redis集群,确保高可用性。

weixin_33816946的博客 288

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

速通SpringBoot+Vue项目 数据访问层/业务逻辑层/控制器层

阶段小目标:学习 表单处理、文件上传、会话管理等常见的 Web 开发功能maven/springboot/mysqlnode.js/vue/element-ui安装navicat数据库可视化/postman发送http请求 自顶向下开发(需求先行,分工明确) controller->service->serviceIml->mapper->mapper.xml 基本curd操作

alex88ander的博客 926

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

6、Redis高并发缓存方案和性能优化

可以拆分key为product_1001_bike_1、product_1001_bike_2…product_1001_bike_10,每个key的库存是100,每个key就是一把锁,那么这个时候高并发下,可以最多10个请求同时操作库存。比如商品a的id为product_1001_bike,库存有1000个,普通思路是对这个key加锁,key是product_1001_bike,每次请求只能有一个请求同时操作库存。SET lock_key clientB_id EX 30 (加锁成功)

随记 1233

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

阿里云Redis开发规范

阿里云Redis开发规范 https://developer.aliyun.com/article/531067#slide-12 Redis开发规范解析(一)–键名设计 https://mp.weixin.qq.com/s?spm=a2c6h.12873639.0.0.69991feewaC06W&__biz=Mzg2NTEyNzE0OA==&mid=2247483663&idx=1&sn=7c4ad441eaec6f0ff38d1c6a097b1fa4&chksm

Eistert 1219

Redis缓存【开发规范】

1、设计目标 简洁,高效,可维护 2、键值设计规范 2.1、KEY命名风格 规则1【强制】以英文字母开头,命名只能包含英文大、小写字母、数字、英文点号(.)、英文半角冒号(:) 和英文@ 规则2【强制】KEY长度不超过1024字节 规则3【推荐】KEY命名需具有可读性以及可管理性,不该使用含义不清以及特别长的名称 2.2、KEY命名规范 规则4【强制】命名规范:业务模块名:业务逻辑含义:缓存类型 2.2.1、业务模块名 规则5【强制】具体功能模块名称,英文字母开头,仅包含字母和数字 2

myroncham的博客 832

Redis缓存架构设计与性能优化

缓存穿透是指查询一个根本不存在的数据, 缓存层和存储层都不会命中, 通常出于容错的考虑, 如果从存储层查不到数据则不写入缓存层。 缓存穿透将导致不存在的数据每次请求都要到存储层去查询, 失去了缓存保护后端存储的意义。 造成缓存穿透的基本原因有两个: 第一, 自身业务代码或者数据出现问题。 第二, 一些恶意攻击、 爬虫等造成大量空命中。

qq_45061342的博客 2130

Redis缓存设计与性能优化

Redis缓存设计与性能优化

野心与梦 1万+
上一篇: linux Operation not permitted
下一篇: Redis开发常用规范
不与天斗8866
博客等级 码龄18年 651粉丝 196原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值