阿里公司的 Redis 开发规范

Redis bigkeys命令会阻塞吗?怎么解决? Redis实战系列,打造精品专栏。 阅读详情

本文介绍了在使用阿里云 Redis 的开发规范,从键值设计、命令使用、客户端使用、相关工具等方面进行说明,通过本文的介绍可以减少使用 Redis 过程带来的问题。

一、键值设计

1. key 名设计

  • (1)【建议】: 可读性和可管理性

以业务名 (或数据库名) 为前缀 (防止 key 冲突),用冒号分隔,比如业务名: 表名:id

ugc:video:1
  • (2)【建议】:简洁性

保证语义的前提下,控制 key 的长度,当 key 较多时,内存占用也不容忽视,例如:

user:{uid}:friends:messages:{mid}简化为 u:{uid}:fr:m:{mid}。
  • (3)【强制】:不要包含特殊字符

反例:包含空格、换行、单双引号以及其他转义字符

详细解析

2. value 设计

  • (1)【强制】:拒绝 bigkey(防止网卡流量、慢查询)

string 类型控制在 10KB 以内,hash、list、set、zset 元素个数不要超过 5000。

反例:一个包含 200 万个元素的 list。

非字符串的 bigkey,不要使用 del 删除,使用 hscan、sscan、zscan 方式渐进式删除,同时要注意防止 bigkey 过期时间自动删除问题 (例如一个 200 万的 zset 设置 1 小时过期,会触发 del 操作,造成阻塞,而且该操作不会不出现在慢查询中 (latency 可查)),查找方法和删除方法

详细解析

  • (2)【推荐】:选择适合的数据类型。

例如:实体类型 (要合理控制和使用数据结构内存编码优化配置, 例如 ziplist,但也要注意节省内存和性能之间的平衡)

反例:

set user:1:name tom
set user:1:age 19
set user:1:favor football

正例:

hmset user:1 name tom age 19 favor football

3.【推荐】:控制 key 的生命周期,redis 不是垃圾桶。

建议使用 expire 设置过期时间 (条件允许可以打散过期时间,防止集中过期),不过期的数据重点关注 idletime。

二、命令使用

1.【推荐】 O(N) 命令关注 N 的数量

例如 hgetall、lrange、smembers、zrange、sinter 等并非不能使用,但是需要明确 N 的值。有遍历的需求可以使用 hscan、sscan、zscan 代替。

2.【推荐】:禁用命令

禁止线上使用 keys、flushall、flushdb 等,通过 redis 的 rename 机制禁掉命令,或者使用 scan 的方式渐进式处理。

3.【推荐】合理使用 select

redis 的多数据库较弱,使用数字进行区分,很多客户端支持较差,同时多业务用多数据库实际还是单线程处理,会有干扰。

4.【推荐】使用批量操作提高效率

原生命令:例如 mget、mset。
非原生命令:可以使用 pipeline 提高效率。

但要注意控制一次批量操作的元素个数(例如 500 以内,实际也和元素字节数有关)。

注意两者不同:

原生是原子操作,pipeline 是非原子操作。
pipeline 可以打包不同的命令,原生做不到
pipeline 需要客户端和服务端同时支持。

5.【建议】Redis 事务功能较弱,不建议过多使用

Redis 的事务功能较弱 (不支持回滚),而且集群版本 (自研和官方) 要求一次事务操作的 key 必须在一个 slot 上 (可以使用 hashtag 功能解决)

6.【建议】Redis 集群版本在使用 Lua 上有特殊要求:

  • 1. 所有 key 都应该由 KEYS 数组来传递,redis.call/pcall 里面调用的 redis 命令,key 的位置,必须是 KEYS array, 否则直接返回 error,"-ERR bad lua script for redis cluster, all the keys that the script uses should be passed using the KEYS array"
  • 2. 所有 key,必须在 1 个 slot 上,否则直接返回 error, “-ERR eval/evalsha command keys must in same slot”

7.【建议】必要情况下使用 monitor 命令时,要注意不要长时间使用。

三、客户端使用

1.【推荐】

避免多个应用使用一个 Redis 实例

正例:不相干的业务拆分,公共数据做服务化。

2.【推荐】

使用带有连接池的数据库,可以有效控制连接,同时提高效率,标准使用方式:

执行命令如下:
Jedis jedis = null;
try {
 jedis = jedisPool.getResource();
 // 具体的命令
 jedis.executeCommand()
} catch (Exception e) {
 logger.error("op key {} error: " + e.getMessage(), key, e);
} finally {
 // 注意这里不是关闭连接,在 JedisPool 模式下,Jedis 会被归还给资源池。
 if (jedis != null) 
 jedis.close();
}

下面是 JedisPool 优化方法的文章:

  • Jedis 常见异常汇总
  • JedisPool 资源池优化

3.【建议】

高并发下建议客户端添加熔断功能 (例如 netflix hystrix)

4.【推荐】

设置合理的密码,如有必要可以使用 SSL 加密访问(阿里云 Redis 支持)

5.【建议】

根据自身业务类型,选好 maxmemory-policy(最大内存淘汰策略),设置好过期时间。

默认策略是 volatile-lru,即超过最大内存后,在过期键中使用 lru 算法进行 key 的剔除,保证不过期数据不被删除,但是可能会出现 OOM 问题。

其他策略如下:

  • allkeys-lru:根据 LRU 算法删除键,不管数据有没有设置超时属性,直到腾出足够空间为止。
  • allkeys-random:随机删除所有键,直到腾出足够空间为止。
  • volatile-random: 随机删除过期键,直到腾出足够空间为止。
  • volatile-ttl:根据键值对象的 ttl 属性,删除最近将要过期数据。如果没有,回退到 noeviction 策略。
  • noeviction:不会剔除任何数据,拒绝所有写入操作并返回客户端错误信息 "(error) OOM command not allowed when used memory",此时 Redis 只响应读操作。

四、相关工具

1.【推荐】:数据同步

redis 间数据同步可以使用:redis-port

2.【推荐】:big key 搜索

redis 大 key 搜索工具

3.【推荐】:热点 key 寻找 (内部实现使用 monitor,所以建议短时间使用)

facebook 的 redis-faina

阿里云 Redis 已经在内核层面解决热点 key 问题,欢迎使用。

五 附录:删除 bigkey

1. 下面操作可以使用 pipeline 加速。
2. redis 4.0 已经支持 key 的异步删除,欢迎使用。

1. Hash 删除: hscan + hdel

public void delBigHash(String host, int port, String password, String bigHashKey) {
 Jedis jedis = new Jedis(host, port);
 if (password != null && !"".equals(password)) {
 jedis.auth(password);
 }
 ScanParams scanParams = new ScanParams().count(100);
 String cursor = "0";
 do {
 ScanResult<Entry<String, String>> scanResult = jedis.hscan(bigHashKey, cursor, scanParams);
 List<Entry<String, String>> entryList = scanResult.getResult();
 if (entryList != null && !entryList.isEmpty()) {
 for (Entry<String, String> entry : entryList) {
 jedis.hdel(bigHashKey, entry.getKey());
 }
 }
 cursor = scanResult.getStringCursor();
 } while (!"0".equals(cursor));
 
 // 删除 bigkey
 jedis.del(bigHashKey);
}

2. List 删除: ltrim

public void delBigList(String host, int port, String password, String bigListKey) {
 Jedis jedis = new Jedis(host, port);
 if (password != null && !"".equals(password)) {
 jedis.auth(password);
 }
 long llen = jedis.llen(bigListKey);
 int counter = 0;
 int left = 100;
 while (counter < llen) {
 // 每次从左侧截掉 100 个
 jedis.ltrim(bigListKey, left, llen);
 counter += left;
 }
 // 最终删除 key
 jedis.del(bigListKey);
}

3. Set 删除: sscan + srem

public void delBigSet(String host, int port, String password, String bigSetKey) {
 Jedis jedis = new Jedis(host, port);
 if (password != null && !"".equals(password)) {
 jedis.auth(password);
 }
 ScanParams scanParams = new ScanParams().count(100);
 String cursor = "0";
 do {
 ScanResult<String> scanResult = jedis.sscan(bigSetKey, cursor, scanParams);
 List<String> memberList = scanResult.getResult();
 if (memberList != null && !memberList.isEmpty()) {
 for (String member : memberList) {
 jedis.srem(bigSetKey, member);
 }
 }
 cursor = scanResult.getStringCursor();
 } while (!"0".equals(cursor));
 
 // 删除 bigkey
 jedis.del(bigSetKey);
}

4. SortedSet 删除: zscan + zrem

public void delBigZset(String host, int port, String password, String bigZsetKey) {
 Jedis jedis = new Jedis(host, port);
 if (password != null && !"".equals(password)) {
 jedis.auth(password);
 }
 ScanParams scanParams = new ScanParams().count(100);
 String cursor = "0";
 do {
 ScanResult<Tuple> scanResult = jedis.zscan(bigZsetKey, cursor, scanParams);
 List<Tuple> tupleList = scanResult.getResult();
 if (tupleList != null && !tupleList.isEmpty()) {
 for (Tuple tuple : tupleList) {
 jedis.zrem(bigZsetKey, tuple.getElement());
 }
 }
 cursor = scanResult.getStringCursor();
 } while (!"0".equals(cursor));
 
 // 删除 bigkey
 jedis.del(bigZsetKey);
}
redis 开发和使用规范 (最详细) 最全redis开发和使用规范,以及各种使用场景介绍,redis各种数据类型分析等等 立即下载

相关推荐

Ansys Lumerical 启动时出现 Error: Could not connect to Ansys license server specified at 1055@ 的另一种解决办法

昨天在关闭了中之后 就能正常打开 FDTD 了,结果今天想开启出现了同样的报错:我猜测昨天能启动的原因在于关闭之后要重启电脑,并且在重启之后我第一时间打开 lumerical 测试因此端口没有被占用,今天是在电脑启动之后一段时间才打开所以又遇到了端口占用的问题。

qq_51404184的博客 9549

redis 介绍

一、历史与发展 2008年 意大利的一家创业公司Merzia[1] 推出了一款基于MySQL的网站实时统计系统 LLOOGG[2] ,然而没过多久该公司的创始人Salvatore Sanfilippo 便开始对MySQL的性能感 到失望,于是他决定亲自为LLOOGG量身定做一个数据库,并于2009年开发完成,这个数据 库就是Redis。不过Salvatore Sanfilippo 并不满足只将Redis 用于LLOOGG 这一款产品,而是 希望让更多的人使用它,于是在同一年Salvatore Sanfili

weixin_48052677的博客 1860

嵌入式开发中SAR与ΔΣ ADC选型指南:从原理到实战应用

模数转换器是嵌入式系统连接模拟世界与数字世界的核心接口,其选型直接决定了数据采集的精度与可靠性。SAR ADC采用逐次逼近原理,如同天平称重,通过二进制搜索快速完成转换,具备高速、多通道轮询的优势,适合电机控制、通信等动态场景。ΔΣ ADC则基于过采样与噪声整形技术,以速度换取精度,通过数字滤波输出高分辨率结果,在传感器测量、音频采集等静态高精度领域表现卓越。理解这两种架构的工作原理差异,是进行嵌入式ADC选型的基础。在实际工程中,需结合信号带宽、多通道切换需求、功耗约束及PCB布局能力进行综合权衡。例如,

weixin_30140399的博客 244

Redis简介

Redis是由意大利的一家创业公司Merzia的创始人Salvatore Sanfilippo在2008年根据公司需求所开发的一个开源的高性能键值对数据库。  http://www.redis.io/。通过提供不同的键值数据类型来适应不同场景下的存储需求,并借助高层级的接口使其可以胜任如存储、 队列系统以及缓存系统等不同角色。 Redis是(Remote Dictionary Server(

艰难困苦如同欢乐,终将成为人生最后的财富 5425

Grey Hack v0.7.3618 保姆级教程:手把手教你用metaxploit.so写一个自动提权脚本

本文详细介绍了如何在Grey Hack v0.7.3618中使用metaxploit.so库编写自动化提权脚本。从环境准备到核心功能解析,再到漏洞利用链构建和权限提升的智能处理,手把手教你掌握游戏中的高级黑客技巧。通过多库联合利用和错误处理优化,提升脚本的效率和成功率。

weixin_42537919的博客 395

【强化学习的数学原理-赵世钰】课程笔记(一)基本概念

在B站上学习强化学习的课程笔记,笔记非常详细清晰,会持续更新

qq_64671439的博客 1万+

Redis是一个主要由Salvatore Sanfilippo(Antirez)开发的开源内存数据结构存储器

Redis还提供了丰富的操作,例如设置和获取值、列表的添加和删除元素、集合的交集和并集操作等。总之,Redis是一个功能强大、性能卓越的内存数据存储系统,被广泛应用于各种应用中,成为了一种不可或缺的开源技术。除了基本的数据存储和操作功能,Redis还提供了许多高级功能,如发布/订阅、Lua脚本执行和事务控制等。为了进一步增强Redis的功能和可用性,社区已经开发出了许多Redis的扩展和实现。通过MULTI和EXEC命令,开发者可以创建一个事务块,该块中的命令将按照顺序执行,并作为一个原子操作完成。

[Blog][Domain] programb.blog.youkuaiyun.com 1972

华为OD机试真题 新系统 2026-06-10 C++ 实现【设备重排SN】

通信设备SN一般是包含:字母、数字,用'-'(破折号)进行分组分割,例如:8F-3T-1G-2n是一个有效的SN地址。 现在要对已经存在的SN 按照新的规则进行重排:

MISAYAONE的博客 129

Redis宣布商用后,Redis国产化替代方案有那些?

Redis作为使用最为广泛的开源缓存中间件,现已成为IT开发中必不可少的核心组件。官方修改协议印证了“开源”不意味着“无偿使用”,相关限制或将对基于开源Redis提供中间件产品的厂商,及提供Redis服务的云厂商产生一定影响。Redis国产化替代方案有那些?

独断万码 2万+

Arcgis建筑面shp由DSM和DEM获取高度拉伸并可视化

Arcgis建筑面shp由DSM和DEM获取高度拉伸并可视化

yilvyangguang520的博客 3991

文献综述三大痛点用AI轻松解决!借助Gemini 3 Pro搞定检索难、阅读慢、框架乱问题(附 AI 提示词)

4)“漏斗式”结构:先介绍宏观领域的研究现状,再缩小范围,聚焦于与你课题直接先关的子领域,深入探讨与你研究变量直接相关的文献, 指出前人没做过、没做全或结论有矛盾的地方,再顺势提出你的研究课题,这种结构逻辑最清晰,能直接引导读者发现你研究的必要性。想要有针对性的搜到相关文献,必须先把模糊的研究题目拆解成精准的检索语言,这个时候就需要建立一个关键词矩阵,如核心词、同义词、学术术语、上下位词,以及对应的英文表达。请围绕【我的研究主题/关键词】,检索近5年发表的高被引的中英文文献,优先选择顶刊综述/论文。

智能AI让学术科研更容易 277

redis入门

1.redis是美国Vmware公司开源的NoSQL数据库产品,基于Key-Value存储格式,可将数据保存在内存或者硬盘中2.Redis是单线程模型的NoSQL数据库,由C语言编写,官方提供的数据可以达到100000+的QPS(每秒内查询的次数)

sumatray的博客 1135

YOLOv11改进:引入SSA序列打乱注意力模块与MSCSA二次创新模块,适配目标检测、图像分类与实例分割

YOLOv11改进:引入SSA与MSCSA模块提升CV任务性能 摘要: 本文提出在YOLOv11中集成SSA(序列打乱注意力)和MSCSA(多尺度上下文序列打乱注意力)模块,以解决计算机视觉任务中的关键挑战。SSA通过序列打乱和局部窗口注意力机制,在降低计算复杂度的同时增强长距离依赖建模能力;MSCSA进一步引入多尺度上下文融合和动态序列打乱策略,优化了多尺度目标检测和实例分割的边界特征处理。这些改进有效解决了传统注意力机制在全局上下文建模、局部细节保持和序列顺序敏感性方面的不足。实验表明,该方法在目标检测

走向CTO的路上... 858

阿里公司的 Redis 开发规范,建议大家都遵守

有井有田2019-04-07 15:12:16 本文介绍了在使用阿里云 Redis 的开发规范,从键值设计、命令使用、客户端使用、相关工具等方面进行说明,通过本文的介绍可以减少使用 Redis 过程带来的问题。 一、键值设计 1. key 名设计 (1)【建议】: 可读性和可管理性 以业务名 (或数据库名) 为前缀 (防止 key 冲突),用冒号分隔,比如业务名: 表名:id ugc...

u011277123的博客 191

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

一次线上事故,导致公司损失400万

由于 PHP 工程师直接操作上线 redis,执行 keys wxdb(此处省略)cf8 这样的命令,导致redis锁住,导致 CPU 飙升,引起所有支付链路卡住,等十几秒结束后,所有的请求流量全部挤压到了 rds 数据库中,使数据库产生了雪崩效应,发生了数据库宕机事件。SCAN 命令是一个基于游标的迭代器,每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数, 以此来延续之前的迭代过程。什么样的 Redis 命令会有如此威力,造成如此大的损失?

BASK2311的博客 142

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

阿里云 Redis 开发规范

本文主要介绍在使用阿里云Redis的开发规范,从下面几个方面进行说明。 键值设计 命令使用 客户端使用 相关工具 通过本文的介绍可以减少使用Redis过程带来的问题。 一、键值设计 1、key名设计 可读性和可管理性 以业务名(或数据库名)为前缀(防止key冲突),用冒号分隔,比如业务名:表名:id ugc:video:1 简洁性...

KHOST的博客 197

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

一份完整的阿里云 Redis 开发规范,值得收藏!

来源:yq.aliyun.com/articles/531067作者:付磊-起扬本文主要介绍在使用阿里云Redis的开发规范,从下面几个方面进行说明。键值设计命令使用客...

纯洁的微笑 897

阿里Redis开发规范

本文主要介绍在使用阿里云Redis的开发规范,从下面几个方面进行说明。 键值设计 命令使用 客户端使用 相关工具 通过本文的介绍可以减少使用Redis过程带来的问题。 一、键值设计 1、key名设计 可读性和可管理性 以业务名(或数据库名)为前缀(防止key冲突),用冒号分隔,比如业务名:表名:id ugc:video:1 简洁性...

weixin_39650971的博客 158

阿里云 Redis 开发规范深入解读,别只会 set、get!

Redis开发规范摘要:本文系统总结了Redis使用的最佳实践,涵盖键值设计、命令使用、持久化配置等核心内容。键名设计需遵循三原则:统一命名规范、控制键长度、避免特殊字符;值设计应控制大小(单Value不超过10KB)并选择合适数据类型。规范禁止使用KEYS、FLUSHALL等危险命令,推荐使用SCAN替代。在集群环境下需注意数据分布,使用hashtag保证相关数据在同一slot。文章还提供了内存优化技巧、安全规范、监控方案及电商系统实战案例,强调规范使用可避免性能问题,使Redis真正成为系统性能加速器。

油墨香^-^的博客 591

Redis 开发规范

本文主要介绍在使用阿里云Redis的开发规范,从下面几个方面进行说明。 键值设计 命令使用 客户端使用 相关工具 通过本文的介绍可以减少使用Redis过程带来的问题。 一、键值设计 1、key名设计 可读性和可管理性 以业务名(或数据库名)为前缀(防止key冲突),用冒号分隔,比如业务名:表名:id ugc:video:1 简洁性...

u014033218的专栏 137

aliyun redis 链接超时_一份完整的阿里云 Redis 开发规范,值得收藏!

来源:yq.aliyun.com/articles/531067本文主要介绍在使用阿里云Redis的开发规范,从下面几个方面进行说明。键值设计命令使用客户端使用相关工具通过本文的介绍可以减少使用Redis过程带来的问题。一、键值设计1、key名设计可读性和可管理性以业务名(或数据库名)为前缀(防止key冲突),用冒号分隔,比如业务名:表名:idugc:video:1简洁性保证语义的前提下...

weixin_29147347的博客 99

开发规范详解

开发规范详解

weixin_41005188的博客 6230
上一篇: Linux服务器上监控网络带宽的18个常用命令和linux带宽流量监控查看工具
下一篇: linux下php调用unoconv命令将doc,ppt转pdf,pdf在转图片
csdn265
博客等级 码龄11年 109粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值