腾讯云分布式缓存数据库 功能与使用

支持。标准架构和集群架构均默认开通 Lua 功能。集群架构下使用 Lua 脚本时,需确保脚本中操作的 Key 在同一 Slot 内,否则可能执行失败。

相关产品
腾讯云分布式缓存数据库(兼容 Redis) 产品页,含版本规格、价格与购买入口。

一、问题索引

·是否支持 Lua 脚本功能?

·是否支持缓存失效订阅事件?

·什么是大 Key 和热 Key?如何发现和处理?

·如何设置缓存淘汰策略?

·实例内存满了写入失败怎么办?

·为什么设置了过期时间的 Key 没有被及时删除?

·高危命令为什么要禁用?如何配置?

·账号误删或忘记密码怎么办?

·集群架构的 Hash 算法是怎样的?

·标准架构中 select 0-15 需要申请不同实例吗?

·Pipeline 是什么?如何使用?

三、是否支持缓存失效订阅事件?

支持。分布式缓存数据库支持 Key 过期事件的订阅通知,可通过 PSUBSCRIBE 命令订阅 __keyevent@*__:expired 频道来监听缓存失效事件。

五、大 Key

大 Key 是指数据量较大的 Key。不同数据结构的判断标准如下:

数据结构 大 Key 阈值
String Value 大小超过10KB
Hash、List、Set、ZSet 元素个数超过5,000个

大 Key 的主要影响:

·内存不均:集群架构下,大 Key 所在节点的内存使用率明显偏高,导致数据倾斜。

·请求阻塞:对大 Key 执行 DEL、GETALL 等操作会阻塞 Redis 单线程,导致其他请求超时。

·同步中断:主从同步时若有大 Key 写入,可能触发同步缓冲区溢出,导致全量同步。

六、热 Key

热 Key 是指被频繁访问的 Key。判断标准:单个 Key 的 QPS 超过实例总 QPS 的10%,或访问频率远超其他 Key。热 Key 的主要影响:

·集群架构下,热 Key 所在的分片 CPU 使用率偏高。

·热 Key 出队或过期时可能引发请求阻塞。

七、如何发现大 Key 和热 Key?

·控制台大 Key 分析:在实例详情页的诊断分析中,可一键扫描全量 Key,识别大 Key。

·DBbrain 智能诊断:自动发现大 Key 和热 Key,并展示内存占用、访问频率等详细信息。

·命令方式:通过 redis-cli –bigkeys 扫描大 Key(注意:此命令会遍历所有 Key,建议在从节点或低峰期执行)。

处理方法:

·拆分大 Key:将大 String 按业务维度拆分为多个小 Key;将大 Hash 拆分到多个小 Hash。

·热 Key 分散:为热 Key 添加业务前缀(如 key_1、key_2、key_3),分散到不同 Slot;在业务层增加本地缓存。

·及时清理:对已无用的大 Key 及时删除,释放内存。

八、如何设置缓存淘汰策略?

登录 分布式缓存数据库控制台,在实例详情页的参数配置中,通过 maxmemory-policy 参数设置缓存淘汰策略。默认值为 noeviction(不淘汰),建议根据业务场景选择合适策略:

策略 说明
volatile-lru 从设置了过期时间的 Key 中淘汰最近最少使用的
allkeys-lru 从所有 Key 中淘汰最近最少使用的
volatile-ttl 从设置了过期时间的 Key 中淘汰即将过期的
noeviction 不淘汰,内存满时写入失败(默认)

九、实例内存满了写入失败怎么办?

当实例内存使用达到上限且淘汰策略为 noeviction(默认)时,所有写入请求将返回 OOM(Out of Memory)错误。处理步骤如下:

十、第一步:确认当前淘汰策略

在控制台查看 maxmemory-policy 参数。若为默认的 noeviction,说明内存满后系统不会主动淘汰 Key,需手动介入。

十一、第二步:短期应急:清理无用数据

·使用 SCAN 命令遍历并清理已知无用的 Key。

·若业务允许丢失部分冷数据,可临时将淘汰策略改为 allkeys-lru 或 volatile-lru,让系统自动淘汰最近最少使用的 Key。

十二、第三步:长期解决:分析内存占用

·通过控制台的大 Key 分析功能,找出内存占用最大的 Key 并优化。

·检查是否有大量 Key 未设置过期时间(TTL),对临时性数据补设 TTL。

·若数据量确实超出当前规格容量,执行在线扩容操作提升内存上限。

淘汰策略选择建议:

业务场景 推荐策略
纯缓存场景(数据可丢失) allkeys-lru
缓存与持久化混合 volatile-lru
数据不可丢失 noeviction(配合容量告警和扩容)

十三、为什么设置了过期时间的 Key 没有被及时删除?

Redis 的 Key 过期清理采用"惰性删除 + 定期扫描"双重机制,因此 Key 过期后并不会立即从内存中删除:

·惰性删除:Key 过期后只有在下次被访问时才会检查并删除。如果一个 Key 过期后再也没人访问,它会继续占用内存。

·定期扫描:Redis 每100ms随机抽取一批设置了过期时间的 Key 进行检查,删除其中已过期的。这意味着过期 Key 的清理存在随机性和延迟。

常见疑问:

Q: 为什么执行 DBSIZE 看到的 Key 数量比预期多?

已过期但尚未被惰性删除或定期扫描命中的 Key 仍会被 DBSIZE 统计。这些 Key 会在后续被访问时删除,或在下一轮定期扫描中被清理,不影响业务逻辑(GET 已过期 Key 会返回 nil)。

Q: 大量 Key 同时过期(集中过期)会有什么影响?

若大量 Key 设置了相同的过期时间,到期时定期扫描线程需要集中处理大批过期 Key,可能导致 CPU 使用率短时升高,甚至引起请求延迟抖动。建议为过期时间添加随机偏移量:

# 示例:基础 TTL 为 3600 秒,加上 0-300 秒的随机偏移EXPIRE key (3600 + random(0, 300))

Q: 从节点上为什么能看到已过期的 Key?

从节点不会主动删除过期 Key,必须等主节点发送 DEL 指令后才执行删除。因此在从节点执行 DBSIZE 或 SCAN 时可能看到已过期但未被删除的 Key。这是 Redis 主从复制的设计行为,不影响业务读取(Redis 4.0及以上版本的从节点在读取时会检查 TTL 并返回 nil)。

十四、高危命令为什么要禁用?如何配置?

高危命令是指可能导致数据丢失或严重影响性能的 Redis 命令。分布式缓存数据库支持在控制台禁用或重命名高危命令,避免因误操作造成线上事故。

十五、常见高危命令及风险

命令 风险说明
KEYS * 遍历所有 Key,实例 Key 数量大时会阻塞 Redis 数秒甚至更久
FLUSHALL 清空所有数据库的全部数据,不可恢复
FLUSHDB 清空当前数据库的全部数据,不可恢复
CONFIG SET 动态修改运行配置,可能导致服务异常

十六、禁用方法

登录控制台,进入实例详情页的参数配置,找到 disabled-commands 参数,添加需要禁用的命令名称(多个命令用逗号分隔)。配置后,客户端执行被禁用的命令时会收到错误提示。具体操作,请参见 通过 disable-command-list 配置禁用命令。

十七、替代方案

·用 SCAN 替代 KEYS *,支持游标分批遍历,不会阻塞主线程。

·需清理数据时,通过备份恢复到新实例后验证,而非直接执行 FLUSHALL。

·配置变更统一通过控制台的参数配置功能进行,而非 CONFIG SET。

十八、账号误删或忘记密码怎么办?

·误删账号:登录控制台,进入目标实例的账号管理页面,重新创建账号即可。

·忘记密码:在账号管理页面找到对应账号,执行重置密码操作。

注意:重置密码会导致使用旧密码的连接中断,请在业务低峰期操作并提前通知相关人员。

十九、集群架构的 Hash 算法是怎样的?

集群架构的 Hash 算法与社区 Redis Cluster 一致,采用 CRC16 哈希算法:

HASH_SLOT = CRC16(key) mod 16384

所有 Key 通过此算法均匀分配到16384个哈希槽中,再由各分片负责管理对应的槽位。

20、标准架构中 select 0 – 15 需要申请不同实例吗?

不需要。标准架构默认支持16个数据库(DB 0 – DB 15),一个实例即可满足多数据库需求。集群架构通过 Proxy 支持最多256个数据库。

21、Pipeline 是什么?如何使用?

Pipeline(管道)是 Redis 提供的批量执行命令的机制。通过将多个命令打包一次性发送给服务端,减少网络往返次数(RTT),从而提升批量操作的吞吐量。

22、性能对比

执行方式 发送1000条命令耗时(内网1ms RTT)
逐条执行 ≈ 1000ms(1000次网络往返)
Pipeline(每批100条) ≈ 10ms(10次网络往返)

23、使用示例

# Python redis-py 示例import redisr = redis.Redis(host='<实例地址>', port=6379, password='<密码>')# 创建 Pipelinepipe = r.pipeline(transaction=False)# 批量写入for i in range(1000): pipe.set(f'key:{i}', f'value:{i}')# 一次性执行results = pipe.execute()

24、使用注意事项

1. 控制单次批量大小:建议每个 Pipeline 包含100 – 500条命令。过多命令会导致服务端一次性返回大量数据,可能占用过多内存或触发带宽限制。

2. 非原子性:Pipeline 仅是批量发送,不保证原子性(中间某条命令失败不会回滚其他命令)。如需原子操作请使用事务(MULTI/EXEC)。

3. 集群架构限制:集群架构下,Pipeline 中的命令可由 Proxy 自动路由到不同分片,无需业务侧感知 Slot 分布。但若需要保证命令顺序性,建议同一 Pipeline 中的命令访问同一个 Key。

4. 超时设置:批量命令的整体执行时间可能较长,建议适当调大客户端的读取超时时间。

5. 带宽风险提示:Pipeline 批量返回可能导致出流量瞬时飙高。若实例出现出流量过高告警,建议减小单次 Pipeline 的命令数量,或将批量操作分散到多个时间段执行。

赞 (0)
上一篇 4天前
下一篇 4天前