0

0

Redis键值设计使用的方法是什么

PHPz

PHPz

发布时间:2023-05-28 16:44:46

|

801人浏览过

|

来源于亿速云

转载

    Redis使用中不规范的现象

    • redis 存储的key命名不规范,比较随意;

    • Redis 被当成存储库使用,存在数据丢失风险,且无重新加载方案;

    • Redis 缓存key,未设置过期时间, 缓存低频数据占用大量内存, 进而导致服务崩溃;

    • Redis 缓存大量big key, 应用获取时会占用大量网络带宽,删除也容易造成阻塞;

    • Redis 客户端使用不当,导致其它客户端连接timeout, 原因可能客户端密码错误,且没有使用连接池,大量连接重试导致系统端口资源耗光;

    • Redis 客户端命令使用不当,导致大量的慢查询,影响其它应用业务,比如在业务高峰期时使用 keys* 或flushall 这样的命令;

    Redis 使用业务场景推荐与建议

    • 高并发场景:热点数据缓存, 可提升系统整体响应速度,降低数据库IO压力 ;

    • 限时场景:利用Redis expire命令设置session过期和续期、手机验证码等;

    • 使用Redis的列表和有序集合数据结构可以实现多种复杂的排行榜应用

    • 数据集合操作:利用Redis list、set、sorted set, 方便进行数据计算, 如交集、并集、差集等;

    • 连续签到:可以利用redis的bitmap数据结构实现签到相关的业务;

    • 计数器:利用Redis incr、incrby命令实现api调用次数统计, api限流等场景;

    • 分布式锁:利用 Redis 的 setnx 功能来编写分布式的锁, 典型开源组件比如redisson;

    如何设计出优雅的key

    可以这么说,线上关于redis的性能优化这个问题上,不合理的key的设计经常是引发问题的根因,究其本质,就个人看到的情况来说,大多数同学在对redis使用过程中,对于key的设计几乎是没有什么概念的,因为大多数同学使用的场景就是 key/val ,对应的数据结构就是 字符串key/字符串val;

    稍微对redis有更深入的了解的同学,在进行存储时,可能会知道 key的设计尽量短一点,中间最好有层次感,最好以 : 进行分割 ......

    那么如何才能设计出比较优雅的key呢?下面结合小编实际使用中的经验以及踩过的坑,来具体谈谈;

    一、遵循如下几个最佳实践约定

    1. 遵循基本格式:[业务名称]:[数据名]:[id];

    2. key的长度不超过44字节;

    3. 不要包含特殊字符;

    关于上面几条建议,这样做有如下几点好处:

    • 可读性强,比如当我们设计这样的key结构, order:user:10,一眼看过去就知道这是关于用户订单相关的key;

    • 方便维护管理,不同的应用,或者不同的业务采用不同的前缀,在可视化客户端工具或者命令行中很方便进行key的查找定位;

    • 避免key冲突,避免在使用过程中多个人都用userId这样的值作为key引发的缓存key冲突;

    • 使用string类型作为key,底层编码包含int、embstr和raw三种,可以有效降低内存占用。使用embstr可在内存占用更小的情况下,处理小于44字节的字符串,因为它采用了连续内存空间

    推荐值:

    • 单个key的value小于10KB;

    • 对于集合类型的key,建议元素数量小于1000;

    二、尽量避免bigkey

    1、什么是bigkey呢

    BigKey通常以Key的大小和Key中成员的数量来综合判定,例如:

    • Key本身的数据量过大:一个String类型的Key,它的值为5 MB;

    • Key中的成员数过多:一个ZSET类型的Key,它的成员数量为10,000个;

    • Key中成员的数据量过大:一个Hash类型的Key,它的成员数量虽然只有1,000个但这些成员的Value(值)总大小为100 MB;

    2、BigKey的危害

    网络阻塞

    • 对BigKey执行读请求时,少量的QPS就可能导致带宽使用率被占满,导致Redis实例,乃至所在物理机变慢;

    数据倾斜

    • BigKey所在的Redis实例内存使用率远超其他实例,无法使数据分片的内存资源达到均衡;

    Redis阻塞

    • 对元素较多的hash、list、zset等做运算会耗时较旧,使主线程被阻塞;

    CPU压力

    Programming Helper
    Programming Helper

    AI代码自动生成器,在AI的帮助下更快地编程

    下载
    • 对BigKey的数据序列化和反序列化会导致CPU的使用率飙升,影响Redis实例和本机其它应用;

    3、如何发现BigKey

    在安装的机器上执行 redis-cli --bigkeys命令

    • 利用redis-cli提供的--bigkeys参数,可以遍历分析所有key,并返回Key的整体统计信息与每个数据的Top1的big key;

    通过scan扫描

    • 编写程序,利用scan扫描Redis中的所有key,利用strlen、hlen等命令判断key的长度(此处不建议使用MEMORY USAGE);

    使用第三方工具

    • 利用第三方工具,如 Redis-Rdb-Tools 分析RDB快照文件,全面分析内存使用情况;

    使用网络监控

    • 自定义工具,监控进出Redis的网络数据,超出预警值时主动告警;

    三、使用恰当的数据类型

    正如上面所说,很多初次使用redis的同学,对于很多业务场景,都是一个key/val的简单的结构搞定,而不会深入思考这样做是否合理,或者说这样做以后会不会引发相关的性能方面的问题;

    对于这个问题,从根本上来说,需要深入了解并掌握redis的常用的数据类型,在这个基础上,才能针对不同的业务场景,设计出高效的存储存储结构数据;

    让我们思考一下,如何缓存用户对象列表这样的数据呢?

    • 方案1:key为usrId,value为对象的序列化字符串,数据结构类似下面这样; 

    Redis键值设计使用的方法是什么

    优点:存取方便,简单粗暴,存取时只需要做下json和对象的互转即可;

    缺点:数据耦合,不够灵活,一旦对象新增了字段或删减了字段,缓存重建的成本非常大;

    • 方案2:使用一个list结构,缓存用户ID列表,数据结构如下;

    Redis键值设计使用的方法是什么

    优点:对内存的占用小,操作高效;

    缺点:获取到val之后,需要进一步查库才能得到完整的对象;

    方案3:使用hash结构,缓存对象,数据如下所示;

    Redis键值设计使用的方法是什么

    优点:底层使用ziplist,空间占用小,可以灵活访问对象的任意字段;

    缺点:编码上相对复杂;

    Redis 缓存在实际应用中的使用建议

    • 【推荐】对缓存进行预热。在访问数据前,应先对缓存进行预热,避免大量请求直接进入数据存储层;应根据业务情况划分合适的冷热数据,对热点数据进行预热。如许可授权信息, apikey等;

    • 【推荐】配合使用本地缓存。在分布式架构中,虽然本地缓存可以提高数据访问的稳定性和速度,但需要谨慎使用以避免引入带状态的服务器节点。避免本地缓存过度占用应用服务器资源,导致应用节点崩溃

    • 【推荐】缓存变更策略,应先更新数据库,再更新缓存;

    • 【推荐】一次业务调用需要访问多次redis服务端,可采用pipleline或其它批量操作方式;

    • 【推荐】大List,Set,Hash,存储的数量巨大。当获取大量元素时会产生较大的延迟,从而阻塞其他命令的执行。建议将其拆分成多个小的列表、集合或哈希表

    使用业务规范

    不管是redis,还是其他开发中使用到的中间件,具体到开发使用时,最好都应该提前制定出一套合理的规范,这个规范应该是大多数开发人员认可并在实践中得到检验,且能有效规避一些问题的,一旦指定为规范,应该成为指导内部开发人员日常的规则,这里提如下几点:

    • Redis 应该定位为缓存数据, 不可用于存储大规模数据(不可替代数据库);

    • Redis 适合读多写少场景,如存在高频写入,低频查询场景,则不推荐使用;

    • 在不确定key的存活时间时,最好设置过期时间,控制 key 的生命周期;

    • 应该考虑冷热数据分离,对于查询, 高频次业务查询走Redis,低频查询考虑走数据库;

    • 程序处理数据时,应该考虑Redis存在数据丢失的风险,因此需要实现从数据库自动加载并缓存丢失的数据到Redis

    • 谨慎使用O(N)命令, 如list, set, hash 数据结构操作时, hgetall、lrange、smembers、zrange等并非不能使用,优先考虑使用 hscan、sscan、zscan 代替。

    热门AI工具

    更多
    DeepSeek
    DeepSeek

    幻方量化公司旗下的开源大模型平台

    豆包大模型
    豆包大模型

    字节跳动自主研发的一系列大型语言模型

    WorkBuddy
    WorkBuddy

    腾讯云推出的AI原生桌面智能体工作台

    腾讯元宝
    腾讯元宝

    腾讯混元平台推出的AI助手

    文心一言
    文心一言

    文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

    讯飞写作
    讯飞写作

    基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

    即梦AI
    即梦AI

    一站式AI创作平台,免费AI图片和视频生成。

    ChatGPT
    ChatGPT

    最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

    相关专题

    更多
    C# ASP.NET Core微服务架构与API网关实践
    C# ASP.NET Core微服务架构与API网关实践

    本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

    76

    2026.03.11

    Go高并发任务调度与Goroutine池化实践
    Go高并发任务调度与Goroutine池化实践

    本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

    38

    2026.03.10

    Kotlin Android模块化架构与组件化开发实践
    Kotlin Android模块化架构与组件化开发实践

    本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

    83

    2026.03.09

    JavaScript浏览器渲染机制与前端性能优化实践
    JavaScript浏览器渲染机制与前端性能优化实践

    本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

    97

    2026.03.06

    Rust内存安全机制与所有权模型深度实践
    Rust内存安全机制与所有权模型深度实践

    本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

    223

    2026.03.05

    PHP高性能API设计与Laravel服务架构实践
    PHP高性能API设计与Laravel服务架构实践

    本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

    458

    2026.03.04

    AI安装教程大全
    AI安装教程大全

    2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

    169

    2026.03.04

    Swift iOS架构设计与MVVM模式实战
    Swift iOS架构设计与MVVM模式实战

    本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

    246

    2026.03.03

    C++高性能网络编程与Reactor模型实践
    C++高性能网络编程与Reactor模型实践

    本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

    34

    2026.03.03

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    进程与SOCKET
    进程与SOCKET

    共6课时 | 0.4万人学习

    Redis+MySQL数据库面试教程
    Redis+MySQL数据库面试教程

    共72课时 | 7.1万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号