从误删生产数据到安全操作:Redis大Key扫描与删除避坑指南

数据库之Redis运维手册(私人整理) 1、redis配置文件 #cat 8000.conf daemonize no #[yes/no]默认值no,该参数用于定制redis服务是否以守护模式运行。 pidfile /var/run/redis.pid #默认值/var/run/redis.pid,指定redis服务的进程号文件路径,以守护模式运行时需要配置本参数; port 8000 #默认值6379,指定redis服务... 阅读详情

Redis大Key治理实战:从误删事故到安全删除方案

1. 生产环境中的大Key隐患

去年夏天,某电商平台在促销活动期间遭遇了一次严重的服务中断。技术团队在清理Redis缓存时,直接使用DEL命令删除了一个存储用户购物车数据的哈希大Key(包含120万字段),导致Redis主线程阻塞长达8秒。这期间所有请求超时,直接造成数百万损失。这个真实案例揭示了大Key操作的潜在风险——看似简单的删除操作可能成为系统崩溃的导火索。

大Key通常指以下两类数据:

  • 超大体积数据:String类型超过10KB,集合类型总大小超过1MB
  • 超多元素集合:Hash/List/Set/ZSet元素超过5000个
# 危险操作示例(生产环境禁止使用)
import redis
r = redis.Redis()
all_keys = r.keys('*')  # 阻塞式获取所有key
big_key = max(all_keys, key=lambda k: r.memory_usage(k))
r.delete(big_key)       # 同步删除导致阻塞

2. 安全扫描大Key的技术方案

2.1 SCAN命令的正确使用姿势

与阻塞式的KEYS命令不同,SCAN采用游标分批获取数据,保证不会长时间阻塞服务。关键参数说明:

参数作用推荐值
COUNT每批次返回key数量上限500-1000
MATCH模式匹配(如user:*)按需设置
TYPE过滤特定数据类型(string/hash等)建议指定
# 安全扫描示例(Redis-cli)
127.0.0.1:6379> SCAN 0 MATCH "cart:*" COUNT 500
1) "352"                  # 下次扫描的游标
2)  1) "cart:user:1001"   # 返回的key列表
    2) "cart:user:1002"

2.2 内存评估组合拳

Redis 4.0+ 提供了更精确的内存分析工具:

-- 评估Key内存的Lua脚本示例
local key = KEYS[1]
local mem = redis.call('MEMORY', 'USAGE', key)
local ttl = redis.call('TTL', key)
return {memory=mem, ttl=ttl}

执行方式:

redis-cli --eval analyze_key.lua "cart:user:1001" , 

2.3 自动化扫描工具链

对于企业级环境,推荐以下工具组合:

  1. Redis-RDB-Tools:离线分析RDB文件
  2. RedisInsight:可视化大Key分析
  3. 自定义巡检脚本:
def scan_big_keys(host, port, threshold_mb=1):
    import redis
    from tqdm import tqdm
    
    r = redis.Redis(host, port)
    cursor = 0
    results = []
    
    with tqdm(desc="Scanning keys") as pbar:
        while True:
            cursor, keys = r.scan(cursor, count=500)
            for key in keys:
                mem = r.memory_usage(key)
                if mem > threshold_mb * 1024 * 1024:
                    key_type = r.type(key).decode()
                    results.append((key, key_type, mem))
            pbar.update(len(keys))
            if cursor == 0: break
    return sorted(results, key=lambda x: -x[2])

3. 安全删除的工程实践

3.1 非阻塞删除方案对比

方案原理适用场景注意事项
UNLINK异步删除Redis 4.0+返回时可能未完成删除
SCAN+DEL分批手动控制删除节奏所有版本需自行控制批次大小和间隔
Lua脚本原子删除保证操作的原子性需要精确控制的场景仍可能短时阻塞
过期时间+惰性删除设置EXPIRE让Redis自动清理可接受延迟清理的场景内存不会立即释放

3.2 生产级Lua删除脚本

-- 安全删除大Hash脚本
redis.replicate_commands()  -- 确保命令可复制

local key = KEYS[1]
local batch_size = tonumber(ARGV[1]) or 100
local delay_ms = tonumber(ARGV[2]) or 50

local total = 0
local cursor = "0"

repeat
    -- 分批获取字段
    local reply = redis.call("HSCAN", key, cursor, "COUNT", batch_size)
    cursor = reply[1]
    local fields = reply[2]
    
    -- 删除本批字段
    if #fields > 0 then
        redis.call("HDEL", key, unpack(fields))
        total = total + #fields/2
    end
    
    -- 控制处理节奏
    if cursor ~= "0" then
        redis.call("PEXPIRE", key, 60000)  -- 每次续期TTL
        redis.call("DEBUG", "SLEEP", delay_ms/1000)
    end
until cursor == "0"

return total

执行示例:

redis-cli --eval del_big_hash.lua "user:cart:10086" , 200 100

3.3 删除时的保护措施

  1. TTL续期机制:在长时间删除过程中,定期更新Key的TTL防止意外丢失
  2. 内存阈值检查:删除前检查实例内存使用率,避免OOM
  3. 从节点优先操作:建议在从节点执行扫描和删除,降低主节点压力
  4. 慢日志监控:配置slowlog-log-slower-than监控长时间操作
# redis.conf 关键配置
slowlog-log-slower-than 10000  # 记录超过10ms的操作
slowlog-max-len 1024          # 保留最多1024条记录

4. 防患于未然的治理策略

4.1 大Key预防方案

数据结构优化案例:

  • 原始方案:将10万条商品评论存储在comments:product123的List中
  • 优化方案:
    # 按时间分片存储
    comment_key = f"comments:product123:{datetime.now().strftime('%Y%m%d')}"
    r.lpush(comment_key, new_comment)
    

写入时控制:

def safe_set(key, value, max_size=10240):
    if isinstance(value, str) and len(value) > max_size:
        raise ValueError(f"Value exceeds {max_size} bytes limit")
    # 其他类型检查...
    r.set(key, value)

4.2 实时监控体系

Prometheus + Grafana监控配置示例:

# prometheus.yml
scrape_configs:
  - job_name: 'redis_bigkey'
    metrics_path: '/metrics'
    static_configs:
      - targets: ['redis-exporter:9121']
    params:
      check-keys: ['user:*', 'cart:*']

关键监控指标:

  • redis_memory_usage_bytes{key="user:*"}
  • redis_key_count{type="hash"}
  • redis_operation_duration_seconds{operation="DEL"}

4.3 应急处理预案

当发现突发性大Key时:

  1. 流量隔离:通过读写分离将请求导向从节点
  2. 渐进清理:使用SCAN+UNLINK分批删除
  3. 客户端降级:实现本地缓存fallback机制
  4. 限流保护:
from redis.exceptions import ResponseError

try:
    pipe = r.pipeline(transaction=False)
    while True:
        try:
            pipe.scan(cursor, count=100)
            cursor, keys = pipe.execute()[0]
            # 处理keys...
        except ResponseError as e:
            if "LOADING" in str(e):
                time.sleep(1)  # 等待加载完成
                continue
            raise
finally:
    pipe.reset()

在分布式系统中,Redis大Key就像定时炸弹,最好的处理方式是不让它出现。但现实往往事与愿违,当真正遇到时,记住三个黄金法则:扫描要非阻塞、删除要渐进式、预防要常态化。

Python Redis 实操手记:连接池、数据结构与分布式锁避坑指南 Redis作为最主流的内存数据结构存储系统,其核心价值在于低延迟、高并发与丰富数据结构支持。理解其底层原理(如连接复用机制、各数据结构时间复杂度差异、Lua原子性保障)是构建稳定缓存与分布式协调能力的基础。技术价值体现在显著降低接口P99延迟、避免缓存雪崩与并发更新冲突等典型线上故障。典型应用场景包括用户会话管理、实时排行榜、消息队列及分布式任务协调。本文聚焦Python生态下redis-py客户端的工程化落地,深入解析连接池配置、String/Hash/Sorted Set选型逻辑、Redis分布式锁安全 阅读详情

相关推荐

Redis五大核心数据类型深度解析:从原理到实战应用

在内存数据库和缓存技术领域,数据结构的选择直接决定了系统的性能和扩展性。Redis作为高性能的键值存储,其核心优势在于提供了五种内置数据结构:字符串、哈希、列表、集合和有序集合。每种数据结构都对应着特定的原子操作和底层实现原理,旨在高效解决不同场景下的数据建模问题。例如,字符串类型通过原子操作支持计数器与分布式锁,哈希类型则优化了结构化对象的存储与部分更新。理解这些数据结构的原理及其技术价值,对于构建高并发、低延迟的应用至关重要。在实际工程实践中,它们被广泛应用于缓存、会话存储、消息队列、排行榜和社交关系计

weixin_30889885的博客 325

AnotherRedisDesktopManager 批量删除组件:安全删除多个键

在 Redis 日常管理中,开发者和运维人员经常面临需要删除多个键的场景:测试环境的临时数据清理、生产环境的过期缓存删除、集群迁移前的冗余数据清理等。传统命令行方式存在三大风险:`DEL` 命令无确认机制易误删、`KEYS` 命令在大数据量下阻塞服务器、手动输入多个键名效率低下且易出错。 AnotherRedisDesktopManager(以下简称 ARDM)的批量删除组件(`DeleteBa...

gitblog_00408的博客 521

2.2.1.9 大数据方法论与实践指南-Redis 使用规范

redis-cli INFO | grep mem_fragmentation_ratio # 理想值 1.0-1.5。redis-cli --raw MEMORY PURGE # 手动触发碎片整理(Redis 4.0+)maxmemory-policy allkeys-lru # 优先淘汰最久未使用的 key。redis-cli --bigkeys -i 0.1 # 每 100ms 执行一次,避免阻塞。环境_业务线_应用名_redis。# Hash 存储用户信息。# List 存储消息队列。

wuhuaiyu的专栏 560

第11章:Redis Key 设计与过期策略:从能用到好维护

文章摘要 电商系统在接入Redis后暴露出严重的key管理问题:命名混乱(三种商品key格式)、TTL缺失(验证码永驻内存)、环境混用(测试误清预发缓存)、危险命令(KEYS阻塞主线程)。解决方案包括: 五段式key命名规范(业务域:场景:对象类型:对象ID:字段) 分层TTL策略(验证码300秒、商品缓存600秒+随机抖动) 使用SCAN替代KEYS进行安全巡检 通过独立实例而非SELECT实现环境隔离 理解Redis惰性删除+定期删除的过期机制 这些措施解决了缓存雪崩、内存泄漏、性能阻塞等核心问题。

davidwang456的专栏 1373

简述redis批量删除key值的问题怎么解决 ?

评估:通过和--bigkeys分析Key规模[citation:6]。选择<10万Key →分批次删除。原子性要求 → Lua脚本分批次执行。执行:配合管道或xargs -L控制批次大小。验证:用DBSIZE和确认内存释放。黄金法则:生产环境永远优先选择 SCAN增量遍历 +UNLINK异步删除,辅以分批次控制(如每批1000~5000个Key),可兼顾安全性与效率[citation:1][citation:3][citation:6]。高危操作务必在低峰期执行并备份!

weixin_39291964的博客 237

简述解析Redis内存满了怎么去优化 ?

当 Redis 内存达到上限时,优化需从。

weixin_39291964的博客 83

【Redis 初阶】通用命令与过期机制深度拆解:从基础用法到底层原理

上一篇我们完成了 Redis 环境的搭建,从这篇开始正式进入 Redis 命令与核心机制的学习。很多人学 Redis 上来就死记硬背几十条命令,最后只会敲 set/get,一到面试问原理、问生产环境注意事项就卡壳。本文顺着官方文档的学习思路,先从最基础的 get/set 讲起,再逐一拆解 6 个核心全局通用命令的用法、时间复杂度与线上风险,最后深入经典面试题 ——Redis 的 key 过期策略,以及定时器的两种底层实现原理。全文兼顾实战操作与底层原理,帮你把基础打扎实。

会当凌绝顶,一览众山小 2万+

深入分析RAG知识库多模态数据预处理

多模态企业数据预处理是构建高质量RAG知识库的关键环节。本文详解了处理流程:1)文档格式识别与路由;2)多模态内容提取(文本、图像、音视频);3)结构解析与语义重建;4)数据清洗与增强;5)智能分块(强调语义完整性);6)元数据注入。推荐使用开源工具如PaddleOCR、Whisper、BLIP-2等,或商业API处理复杂场景,最终生成带丰富元数据的结构化内容,为后续向量化检索奠定基础。

qq_35354529的博客 1380

Redis高级篇之bigKey理论介绍以及优化

python学习 numTensorFlow框架学习,pytorch学习,基本语法的学习 numpy scipy 科学运算 matplotlib 图片 scikit-learn 机器学习 tensorflow(Keras)/pytorch/Teano 深入学习 语言识别 2.2安装 pip命令 集成开发环境 Anaconda 集成开发环境 ...

qq_39126115的博客 1611

反激系列-详细到每个容阻的原理之RCD吸收(1)

1、漏感尖峰电压会被RCD吸收,漏感能量一定,电容越大,电容充电的电压就越低,吸收能力就越强,MOS漏极的电压就越低。2、在漏感能力释放完之后(这个过程一般只有一个周期的3%时间),是要通过R1释放掉电容吸收的能量的,把电容的电压降下来方便下一次漏感尖峰来之前再进行吸收。3、电容容量和电阻需要合理搭配,容量足够即可,足够能吸收漏感尖峰电压,不至于超过MOS耐压。电阻需要足够小,小到在放电阶段把电容电压下降到MOS的电压平台。

Cuxiaoweiba的博客 3万+

手把手教你完成YOLOv10 PySide6目标检测界面搭建,使用Qt6设计YOLOv10检测系统,前台系统+后台管理系统开发实战,可用于大论文凑工作量或毕设必备,全网最详细教程

手把手教你完成YOLOv10 PySide6目标检测界面搭建,使用Qt6设计YOLOv10检测系统,前台系统+后台管理系统开发实战,可用于大论文凑工作量或毕设必备,全网最详细教程

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1734

Big Key

大 key 核心是(非 key 字符串本身长),在 Redis 等内存数据库中是高频性能隐患,常因设计不当或数据持续累积产生。

Gucci_ma的博客 699

Codex入门01-环境安装(小白入门:手把手教你安装配置,国内网络也能搞定)

本文手把手教你从零搭建 Codex CLI 开发环境。内容涵盖 Node.js 安装(macOS/Windows/Linux)、Codex CLI 全局安装、ChatGPT 账号登录认证,以及国内网络代理配置。还包括常见问题排查和一键启动脚本编写。跟着截图一步步操作,10分钟搞定全部环境,开始用AI写代码!

yueyeguzhuo的专栏 348

Redis中BigKey与MoreKey优化笔记

Redis中的BigKey指的是那些值(value)特别大的键(key),这可能包括大的字符串或者包含大量元素的集合类型(如list、set、hash、zset等)。BigKey的存在可能会导致Redis的性能问题,因为Redis是单线程操作的,处理BigKey时可能会阻塞其他操作,影响整体性能。在Redis中,MoreKey问题通常指的是当数据库中的key数量非常多时,使用如KEYS *这样的命令去检索所有的key,这会导致Redis服务阻塞,影响正常业务。因为Redis是单线程操作的,执行这类命令时会占

1267

Allegro技巧----相同模块复用实现快速布局

使用Allegro软件进行PCB Layout设计时,当电路图中有很多路相同的模块,使用模块复用的的操作方法,可以显著提高工作效率,同时也可以使PCB布局在整体上显得美观。 如图,有8个相同的ADC采样电路模块,它们在原理图中的电路也是一样的,对于这多个相同的电路模块,如果一个个元器件布局很明显做了很多重复机械的劳动,效率低下;但是强大的Allegro软件早就考虑到了这点,只需要在PCB中做好其中的一个,则其余相同的模块通过复用的方式,可以快速完成,方便省事还美观。 具体步骤: 1.首先完成一个模块的PC

sinat_15677011的博客 5655

深度强化Q学习-基于微软AirSim仿真环境的自动驾驶案例(原理代码详解简易可行)

最近在学习《强化学习原理与Python实现》,肖智清著。参考第十二章的自动驾驶案例,写一篇总结,尽量做到简单可行,让有志于自动驾驶的小伙伴可以通过此篇博客可以管中窥豹,初步了解自动驾驶的强化学习训练过程。 本篇将自动驾驶问题转化为回合制的强化学习任务,设计以车辆观察图像和运行状态为输入的自动驾驶算法,并在AirSim仿真环境中进行训练和测试。本篇使用带经验回放和目标网络的基于深度Q网络算法设计并实现智能体,对经验回放、目标网络和深度Q学习算法进行简单介绍,并用代码实现。

shao918516的博客 8601

Redis篇-第13章 BigKey问题

第一节 MoreKey案例。

正版踏雪无痕的博客 1458

《YOLO11改进有效涨点》 专栏目录 | 目前已有100+篇内容,内含各种Head检测头、损失函数Loss、Backbone、Neck等创新点改进【持续更新】

YOLO11改进专栏目录,YOLO11改进目录

kay_545 1万+

Ubuntu 18.04 Redis生产级安装与安全加固指南

Redis作为高性能内存数据结构服务器,其默认配置面向开发调试而非生产环境。理解bind绑定、protected-mode保护模式、ACL访问控制列表、命令重命名、连接超时管理及systemd服务沙箱等核心机制,是构建安全可靠缓存/会话/实时计数系统的基础。尤其在Ubuntu 18.04等LTS系统中,需规避APT包陈旧版本(如4.0.9)的安全缺陷,通过源码编译Redis 6.2.6并精细化配置,实现网络层收口、密码哈希化、最小权限运行与审计日志聚焦。本文详解如何将Redis从‘开箱即用’升级为符合金融、

567

13、基因相似性度量的相关性及特征选择研究

本文研究了基因相似性度量和特征选择在生物学中的应用,详细介绍了GO术语相似性度量的多种方法,包括语义度量和路径长度度量,并分析了不同方法在酵母和人类数据集上的表现。研究发现,Avg-sum方法和基于路径长度的度量在多数情况下效果较好。此外,通过晚期辐射毒性预测的案例研究,探讨了特征选择的重要性及可能面临的过拟合和噪声干扰问题,并提出了相应的解决策略。

js777的博客 127

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Ubuntu 20.04 生产级 Redis 安装与 systemd 安全加固指南

Redis 是高性能内存键值数据库,其核心价值在于低延迟读写、原子操作与丰富数据结构,广泛应用于缓存加速、会话存储和实时消息队列。在 Linux 生产环境中,Redis 的可靠性与安全性高度依赖底层系统协同——尤其 Ubuntu 20.04 作为主流 LTS 发行版,深度集成 systemd、AppArmor 和内核调优机制。单纯 apt install 会导致版本滞后、默认配置宽松、权限模型脆弱等隐患,而源码编译结合 systemd 单元定制可实现进程隔离、内存限制、文件系统保护与启动可控性。本文聚焦 r

weixin_33912453的博客 341

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

《Java 100 天进阶之路》第91篇:Redis核心数据结构(2026版)

摘要:Redis 面试必考!一文搞懂 String、Hash、List、Set、ZSet、HyperLogLog、Bitmap 7 种核心结构。Redis 像一个超级快递站,数据从硬盘搬到快递站后,取货无需再跑仓库。从底层实现(ZipList → ListPack)到生产避坑,再到场景决策表,助你拿下缓存面试题。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 1596

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Redis7_11 高阶篇 第二章 Redis的BigKey

阿里广告平台,海量数据里查询某一固定前缀的key? 小红书,你如何生产上限制keys */flushdb/flushall等危险命令以防止误删误用? 美团,MEMORY USAGE 命令你用过吗? BigKey问题,多大算big? 你如何发现? 如何删除? 如何处理? BigKey你做过调优吗? 惰性释放lazyfree了解过吗? Morekey问题,生产上redis数据库有1000W记录,你如何遍历? key *可以吗?

qq_33168558的博客 1666

【Redis】BigKey问题

本文主要介绍了Redis中的BigKey问题,关于它产生的原因、产生的危害、解决方法等进行了一系列说明

al6nlee的博客 663

Redis

可以存储3种类型的值SETMSETSETEXGETMGETTTLSET key value:新建或覆盖,返回OKGET key:获取key对应valueMSET key1 value1 key2 value2 ...:批量新建或覆盖,返回OKMSET key1 key2 ...:批量获取key对应value,不存在返回nilSETEX key seconds value:设置自动失效的键值对,新建或覆盖,返回OK。

yio_yin的专栏 459

Ubuntu 20.04 安装并加固 Redis 生产级安全配置指南

Redis 是一种基于内存的高性能键值数据库,广泛用于缓存、会话存储与消息队列等场景;其核心原理依赖单线程事件循环与非阻塞I/O,兼顾低延迟与高吞吐。在 Linux 发行版中,Ubuntu 20.04 因其长期支持(LTS)特性与稳定内核,成为企业部署 Redis 的主流操作系统平台。然而,默认安装的 Redis 存在无密码、全网监听、无TLS、无资源限制等严重安全隐患,极易遭受未授权访问、数据泄露或拒绝服务攻击。本文聚焦 Ubuntu 20.04 环境下,通过 apt 原生包安装 Redis 后,系统性实

weixin_30684743的博客 409
上一篇: 从Ubuntu Base到完整桌面:ARM开发板移植LXDE的完整避坑手册(2024版)
下一篇: 深入解析BT.656、PAL与NTSC标准中的并行数据结构及其视频流传输机制
vim8coder
博客等级 码龄1天 0粉丝 1693原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值