目录
Redis使用中不规范的现象
Redis 使用业务场景推荐与建议
如何设计出优雅的key
一、遵循如下几个最佳实践约定
二、尽量避免bigkey
三、使用恰当的数据类型
Redis 缓存在实际应用中的使用建议
使用业务规范
首页 数据库 Redis Redis键值设计使用的方法是什么

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

May 28, 2023 pm 04:44 PM
redis

    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压力

    • 对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 代替。

    以上是Redis键值设计使用的方法是什么的详细内容。更多信息请关注PHP中文网其他相关文章!

    本站声明
    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

    热AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智能驱动的应用程序,用于创建逼真的裸体照片

    AI Clothes Remover

    AI Clothes Remover

    用于从照片中去除衣服的在线人工智能工具。

    Undress AI Tool

    Undress AI Tool

    免费脱衣服图片

    Clothoff.io

    Clothoff.io

    AI脱衣机

    Video Face Swap

    Video Face Swap

    使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

    热工具

    记事本++7.3.1

    记事本++7.3.1

    好用且免费的代码编辑器

    SublimeText3汉化版

    SublimeText3汉化版

    中文版,非常好用

    禅工作室 13.0.1

    禅工作室 13.0.1

    功能强大的PHP集成开发环境

    Dreamweaver CS6

    Dreamweaver CS6

    视觉化网页开发工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神级代码编辑软件(SublimeText3)

    redis集群模式怎么搭建 redis集群模式怎么搭建 Apr 10, 2025 pm 10:15 PM

    Redis集群模式通过分片将Redis实例部署到多个服务器,提高可扩展性和可用性。搭建步骤如下:创建奇数个Redis实例,端口不同;创建3个sentinel实例,监控Redis实例并进行故障转移;配置sentinel配置文件,添加监控Redis实例信息和故障转移设置;配置Redis实例配置文件,启用集群模式并指定集群信息文件路径;创建nodes.conf文件,包含各Redis实例的信息;启动集群,执行create命令创建集群并指定副本数量;登录集群执行CLUSTER INFO命令验证集群状态;使

    redis数据怎么清空 redis数据怎么清空 Apr 10, 2025 pm 10:06 PM

    如何清空 Redis 数据:使用 FLUSHALL 命令清除所有键值。使用 FLUSHDB 命令清除当前选定数据库的键值。使用 SELECT 切换数据库,再使用 FLUSHDB 清除多个数据库。使用 DEL 命令删除特定键。使用 redis-cli 工具清空数据。

    redis怎么读取队列 redis怎么读取队列 Apr 10, 2025 pm 10:12 PM

    要从 Redis 读取队列,需要获取队列名称、使用 LPOP 命令读取元素,并处理空队列。具体步骤如下:获取队列名称:以 "queue:" 前缀命名,如 "queue:my-queue"。使用 LPOP 命令:从队列头部弹出元素并返回其值,如 LPOP queue:my-queue。处理空队列:如果队列为空,LPOP 返回 nil,可先检查队列是否存在再读取元素。

    redis指令怎么用 redis指令怎么用 Apr 10, 2025 pm 08:45 PM

    使用 Redis 指令需要以下步骤:打开 Redis 客户端。输入指令(动词 键 值)。提供所需参数(因指令而异)。按 Enter 执行指令。Redis 返回响应,指示操作结果(通常为 OK 或 -ERR)。

    redis怎么使用锁 redis怎么使用锁 Apr 10, 2025 pm 08:39 PM

    使用Redis进行锁操作需要通过SETNX命令获取锁,然后使用EXPIRE命令设置过期时间。具体步骤为:(1) 使用SETNX命令尝试设置一个键值对;(2) 使用EXPIRE命令为锁设置过期时间;(3) 当不再需要锁时,使用DEL命令删除该锁。

    redis怎么读源码 redis怎么读源码 Apr 10, 2025 pm 08:27 PM

    理解 Redis 源码的最佳方法是逐步进行:熟悉 Redis 基础知识。选择一个特定的模块或功能作为起点。从模块或功能的入口点开始,逐行查看代码。通过函数调用链查看代码。熟悉 Redis 使用的底层数据结构。识别 Redis 使用的算法。

    redis命令行怎么用 redis命令行怎么用 Apr 10, 2025 pm 10:18 PM

    使用 Redis 命令行工具 (redis-cli) 可通过以下步骤管理和操作 Redis:连接到服务器,指定地址和端口。使用命令名称和参数向服务器发送命令。使用 HELP 命令查看特定命令的帮助信息。使用 QUIT 命令退出命令行工具。

    centos redis如何配置Lua脚本执行时间 centos redis如何配置Lua脚本执行时间 Apr 14, 2025 pm 02:12 PM

    在CentOS系统上,您可以通过修改Redis配置文件或使用Redis命令来限制Lua脚本的执行时间,从而防止恶意脚本占用过多资源。方法一:修改Redis配置文件定位Redis配置文件:Redis配置文件通常位于/etc/redis/redis.conf。编辑配置文件:使用文本编辑器(例如vi或nano)打开配置文件:sudovi/etc/redis/redis.conf设置Lua脚本执行时间限制:在配置文件中添加或修改以下行,设置Lua脚本的最大执行时间(单位:毫秒)

    See all articles