当前位置: 首页 > news >正文

【redis】缓存设计规范

本文是 Redis 键值设计的 14 个核心规范与最佳实践,按重要程度分层说明:


一、通用数据类型选择

这里我们先给出常规的选择路径图。
redis常规选择路径
以下是对每个步骤的分析:

  1. 是否需要排序?
    • zset(有序集合)用于排序的唯一值,而list用于排序的重复值。
  2. 数据是否唯一?
    • set用于存储唯一的值。
  3. 是否需要存储对象?
    • Hash适合存储对象或具有多个字段的结构。
  4. 考虑操作频率?
    • StringHash`都是Redis中最常用的数据类型,适用于高频读写操作。
  5. 数据大小和内存占用大?
    • Bitmap适合存储大量数据,同时占用较少的内存。
  6. 消息队列?
    • stream是Redis用于实现消息队列的数据类型。
  7. 原子操作和数据过期?
    • lua脚本可以用于实现原子操作,而Redis的过期机制可以用于数据过期。

二、键设计规范(Key Design)

  1. 命名规范

    • 格式:业务模块:数据维度:唯一标识(例:user:profile:10001
    • 强制要求:禁止包含空格、换行符、不可见字符
    • 建议:长度控制在 100 字节以内(内存敏感场景)
  2. 大Key规避

    • 单Key值大小限制:
      • String 类型 ≤ 10KB
      • Hash/List/Set/Zset 元素数 ≤ 5000
    • 超标处理方案:
      • 数据分片(例:user:10001:cart_page1)
      • 启用压缩(客户端压缩 + LZF Redis压缩)
  3. 过期策略

    • 必须设置过期时间(包括持久化数据,建议 30 天兜底)
    • 不同过期时间策略:
      -- 使用随机过期时间避免批量过期导致的毛刺
      local expire_time = 86400 + math.random(0, 3600)
      redis.call('EXPIRE', KEYS[1], expire_time)
      

三、值设计规范(Value Design)

  1. 数据结构选择原则

    • 按使用频率选择:
      高频读写 → String/Hash
      范围查询 → ZSET
      去重计算 → Set/HLL
      关系查询 → RedisGraph(需 4.0+)
      
    • 禁止将 Redis 当关系型数据库使用(避免复杂关联查询)
  2. JSON序列化陷阱

    • 推荐方案:
      • 高频字段拆解为 Hash 字段
      • 保留完整 JSON 作为 fallback 方案
    • 优化案例:
      HMSET user:10001 name "John" age 30 
      SET user:10001:full '{...}' EX 3600
      
  3. 计数器设计

    • 必须使用 INCR/DECR 代替 GET+SET
    • 集群环境推荐使用 INCRBY float 代替整数运算

三、高级优化策略

  1. 内存优化技巧

    • Hash 使用 ziplist 编码:
      redis.conf 配置:
      hash-max-ziplist-entries 512
      hash-max-ziplist-value 64
      
    • 使用 SSCAN/ZSCAN 替代 SMEMBERS/ZRANGE
  2. 热点Key治理

    • 检测方法:redis-cli --hotkeys
    • 解决方案:
      • 本地缓存 + 异步刷新
      • Key 分片(例:hotkey_v1 → hotkey:{shard_id}:v1)
  3. 事务与管道

    • 管道(pipeline)批量操作控制在 100 命令/批次
    • Watch 事务中避免包含耗时操作

四、集群与持久化

  1. 集群规范

    • 单个分片内存 ≤ 10GB(AWS 内存优化型实例)
    • 跨槽操作使用 Hash Tag 需满足:
      • 相关Key必须使用相同{}内容
      • 示例:{user10001}.orders, {user10001}.profile
  2. 持久化策略

    • AOF 配置:
      appendfsync everysec
      auto-aof-rewrite-percentage 100
      auto-aof-rewrite-min-size 64mb
      
    • RDB 快照周期 ≥ 15 分钟

五、避坑指南

  1. 危险命令禁用

    rename-command FLUSHALL ""
    rename-command KEYS "internal_KEYS"
    
  2. 慢查询防御

    • 设置超时阈值:
      slowlog-log-slower-than 5000 # 5ms
      
    • 定期分析:SLOWLOG GET 50
  3. 连接池配置

    // Jedis 最佳配置示例
    JedisPoolConfig config = new JedisPoolConfig();
    config.setMaxTotal(500);         // 最大连接数
    config.setMaxIdle(100);          // 最大空闲连接
    config.setMinIdle(20);           // 最小空闲连接
    config.setMaxWaitMillis(2000);   // 最大等待时间
    

六、案例

以下通过 6个高频场景的对比案例 说明 Redis 键值设计的核心规范,帮助直观理解:


案例1:用户信息存储设计

❌ 错误做法

# 大JSON直接存储String类型,无过期时间
SET user_10001 '{name:"John",age:30,address:"...20个字段...",lastLogin:...}'

问题

  • Key无业务含义,易冲突
  • Value超10KB违反大Key规范
  • 高频读取时需全量解析JSON

✅ 正确方案

# 模块化Key命名 + Hash分字段存储 + 过期时间
HMSET user:profile:10001 name "John" age 30 address "..." lastLogin 1717040000
EXPIRE user:profile:10001 2592000  # 30天过期

优化点

  • 键结构清晰:业务模块:数据维度:ID
  • 高频字段独立存取,减少网络传输
  • 兜底过期避免数据堆积

案例2:电商购物车设计

❌ 错误做法

# 用List存储所有商品ID(可能产生大Key)
LPUSH cart:10001 "sku_123:5" "sku_456:3" ...(5000+商品)

问题

  • 超出5000元素的大Key阈值
  • 分页查询困难

✅ 正确方案

# Hash分片存储 + 计数器
HMSET cart:10001:page1 sku_123 5 sku_456 3
HMSET cart:10001:page2 sku_789 2 ...
# 获取商品数量(原子操作)
HINCRBY cart:10001:page1 sku_123 1 

优化点

  • 分片控制单个Key元素数量
  • 利用Hash字段的原子计数特性

案例3:秒杀库存热点Key

❌ 错误做法

# 集中式库存计数器(产生热点Key)
SET stock:sku_8888 1000
DECR stock:sku_8888  # 所有请求集中访问此Key

问题

  • 单Key承受极高QPS
  • 集群模式下无法分散压力

✅ 正确方案

# 库存分片设计
SET stock:sku_8888:shard1 200
SET stock:sku_8888:shard2 200
...
SET stock:sku_8888:shard5 200# 客户端随机选择分片扣减
DECR stock:sku_8888:shard{random(1-5)}

优化点

  • 通过分片分散热点
  • 结合本地缓存减少Redis访问

案例4:页面访问计数器

❌ 错误做法

# 非原子操作导致计数不准
count = redis.GET('page_view:home')
redis.SET('page_view:home', count+1)

问题

  • 并发场景下数据不一致
  • 频繁GET/SET产生大量请求

✅ 正确方案

# 使用INCR原子操作
INCR page_view:home# 按小时滚动存储(避免单Key过大)
INCR page_view:home:2024052715

优化点

  • 原子操作保证准确性
  • 时间分片控制Key规模

案例5:用户消息通知列表

❌ 错误做法

# 用String存储JSON数组(频繁全量读写)
SET msg:10001 '[{id:1,content:"..."}, {...1000条数据}]'

问题

  • 大Value导致网络阻塞
  • 修改任意消息需全量更新

✅ 正确方案

# 使用ZSET按时间排序存储
ZADD msg:10001 1717040000 '{"id":1,"content":"..."}'
ZADD msg:10001 1717040001 '{"id":2,"content":"..."}'# 分页查询最新消息
ZREVRANGE msg:10001 0 9 WITHSCORES

优化点

  • 天然支持按时间排序和分页
  • 单个消息的增删不影响整体

案例6:社交关系存储

❌ 错误做法

# 用String存储用户粉丝列表(大JSON数组)
SET followers:10001 "[20001,20002,...50000个用户ID]"

问题

  • 50000个ID超过大Key限制
  • 判断是否关注需全量扫描

✅ 正确方案

# 使用Set存储关系 + 分页控制
SADD following:10001 20001 20002 ...  # 最多5000元素/Key
SADD following:10001:page2 20003 ...  # 分片存储# 检查关注关系
SISMEMBER following:10001 20001

优化点

  • 分片规避大Key
  • 使用原生集合操作提升效率

总结技巧

  1. Key设计三要素:业务线明确(user)、数据类型清晰(profile)、标识唯一(10001
  2. Value选择原则
    • 优先使用 Hash 替代 String 存储对象
    • 需要排序用 ZSET去重用 Set队列用 List
  3. 性能压测公式
    # 模拟高并发场景
    redis-benchmark -h 127.0.0.1 -p 6379 -n 100000 -c 100 -t set,get
    

相关文章:

【redis】缓存设计规范

本文是 Redis 键值设计的 14 个核心规范与最佳实践,按重要程度分层说明: 一、通用数据类型选择 这里我们先给出常规的选择路径图。 以下是对每个步骤的分析: 是否需要排序?: zset(有序集合)用…...

归一化与伪彩:LabVIEW图像处理的区别

在LabVIEW的图像处理领域,归一化(Normalization)和伪彩(Pseudo-coloring)是两个不同的概念,虽然它们都涉及图像像素值的调整,但目的和实现方式截然不同。归一化用于调整像素值的范围&#xff0c…...

DeepSeek大模型本地部署实战

1. 下载并安装Ollama 打开浏览器:使用你常用的浏览器(如Chrome、Firefox等)访问Ollama的官方网站。无需特殊网络环境,直接搜索“Ollama”即可找到。 登录与下载:进入Ollama官网后,点击右上角的“Download…...

deepseek+kimi自动生成ppt

打开deepseek官网,输入详细的需求,让他生成个ppt 接着deepseek开始思考生成了 接着复制生成了的内容 打开kimi粘贴刚才deepseek生成的内容 可以一键生成啦,下载编辑使用吧...

集成SwanLab与HuggingFace TRL:跟踪与优化强化学习实验

文章目录 1. 引入SwanLabCallback2. 传入Trainer3. 完整案例代码4. GUI效果展示 TRL (Transformers Reinforcement Learning,用强化学习训练Transformers模型) 是一个领先的Python库,旨在通过监督微调(SFT)、近端策略优化&#xf…...

cefsharp131升级132测试(WinForms.NETCore)

一、升级(Nuget) 版本说明(readme):最低.NET Core3.1 (NET5.0) Visual C 2019 Redist 二、试运行、兼容性测试 三、后记说明 支持H264版本推荐版本63,79,84,88,100,111,125(支持h264和pdf预览) 其他H264版…...

Gitee AI上线:开启免费DeepSeek模型新时代

Gitee Al上线,并宣布开启免费DeepSeek模型的时代,这是一个非常值得关注的消息,因 为它标志着国内在AI领域的一个重要发展。DeepSeek模型是由阿里巴巴达摩院开发的,旨 在提供强大的自然语言处理(NLP)能力。下面是一些关于这一事件…...

nginx常用命令及补充

在Linux环境下nginx常用命令如下: 1、查看nginx版本号命令 nginx -v 2、查找nginx配置文件路径已经检查配置文件是否正确 nginx -t 3、查找nginx安装目录 which nginx 4、查看nginx进程 ps -ef|grep nginx 5、进入到nginx的sbin目录后,执行一下…...

自动驾驶---聊聊传统规控和端到端

1 背景 在自动驾驶领域中,端到端模型的兴起确实对传统的规划控制方法(笔者并不同意网上以Rule-Base称呼传统规控,传统的规控其实也使用了很多优化算法和博弈算法)产生了挑战,但这就意味着传统规控方法就完全没有应用了…...

node.js + html + Sealos容器云 搭建简易多人实时聊天室demo 带源码

node.js html Sealos容器云 搭建简易多人实时聊天室demo 带源码 前言功能介绍(demo演示)sealos官网配置node.js 编写服务端代码前端ui 调用接口整体项目目录部署到服务器 前言 hello哦盆友们,这次我们来十几行代码做一个超简单的多人聊天…...

OpenFeign远程调用返回的是List<T>类型的数据

在使用 OpenFeign 进行远程调用时,如果接口返回的是 List 类型的数据,可以通过以下方式处理: 直接定义返回类型为List Feign 默认支持 JSON 序列化/反序列化,如果服务端返回的是 List的JSON格式数据,可以直接在 Feig…...

PCL 计算多边形的面积【2025最新版】

目录 一、算法原理1、概述2、主要函数3、函数源码二、代码实现三、结果展示博客长期更新,本文最近更新时间为:2025年1月17日。 一、算法原理 1、概述 根据给定的多边形的点云计算多边形的面积 A r e a = 1 2 ∑...

著名大模型评测榜单(不同评测方式)

在评估大语言模型的性能时,一种主流的途径就是选择不同的能力维度并且构建对应的评测任务,进而使用这些能力维度的评测任务对模型的性能进行测试与对比。由大型机构或者研究院所排出榜单。 评测指标 不同评测任务有不同的评指标,衡量模型的…...

国内知名Deepseek培训师培训讲师唐兴通老师讲授AI人工智能大模型实践应用

课程名称 《Deepseek人工智能大模型实践应用》 课程目标 全面了解Deepseek人工智能大模型的技术原理、功能特点及应用场景。 熟练掌握Deepseek大模型的提示词工程技巧,能够编写高质量的提示词。 掌握Deepseek大模型在办公、营销等领域的应用方法,提升…...

【AIGC】冷启动数据与多阶段训练在 DeepSeek 中的作用

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯冷启动数据的作用冷启动数据设计 💯多阶段训练的作用阶段 1:冷启动微调阶段 2:推理导向强化学习(RL&#xff0…...

如何打造一个更友好的网站结构?

在SEO优化中,网站的结构往往被忽略,但它其实是决定谷歌爬虫抓取效率的关键因素之一。一个清晰、逻辑合理的网站结构,不仅能让用户更方便地找到他们需要的信息,还能提升搜索引擎的抓取效率 理想的网站结构应该像一棵树,…...

【ROS2】RViz2自定义面板插件(rviz_common::Panel)的详细步骤

【ROS】郭老二博文之:ROS目录 1、简述 RViz2 的插件基于 ROS2 的插件库(pluginlib)机制,通过动态加载共享库实现功能扩展。 注意:RViz2 使用 QT 作为 UI 框架,虽然 QT 也有插件机制,但是 RViz2 并没有使用QT的插件机制,而是通过 pluginlib 加载功能模块来实现。 2、…...

漏洞分析 Spring Framework路径遍历漏洞(CVE-2024-38816)

漏洞概述 VMware Spring Framework是美国威睿(VMware)公司的一套开源的Java、JavaEE应用程序框架。该框架可帮助开发人员构建高质量的应用。 近期,监测到Spring Framework在特定条件下,存在目录遍历漏洞(网宿评分&am…...

《手札·避坑篇》2025年传统制造业企业数字化转型指南

一、引言 在数字化浪潮的推动下,传统制造业企业正加速向智能化、数字化转型。开源软件技术与制造MES(制造执行系统)产品的结合,为企业提供了高效、灵活且低成本的转型路径。本指南旨在为传统制造业企业的信息化负责人提供一套完整的数字化转型方案,助力企业实现高效、智能…...

MySQL中DDL操作是否支持事务

MySQL中DDL不支持事务。 传统MySQL(5.7及以前版本): DDL操作不支持事务执行DDL操作时会隐式提交当前会话的事务无法回滚DDL操作 MySQL 8.0版本: 引入了原子DDL特性(Atomic DDL)DDL操作变为原子性的&…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...