shell脚本批量导出redis key-value方式

2025-08-02 20:50

本文主要是介绍shell脚本批量导出redis key-value方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《shell脚本批量导出rediskey-value方式》为避免keys全量扫描导致Redis卡顿,可先通过dump.rdb备份文件在本地恢复,再使用scan命令渐进导出key-value,通过CN...

1 背景

需求:工作中需要导出线上redis数据,但需避免使用keys命令全量扫描,导致瞬间响应卡顿,从而引发超时等问题

方法:最安全的方式是通过dump.rdb备份文件,在本地redis实例上android恢复,然后执行shell脚本,使用scan渐进扫描批量导出key-value。

2 详细步骤

2.1 本地docker启动redis

本地通过docker-compose创建redis实例,并挂载配置文件和数据目录

  • docker-compose.yml
version: '3'
services:
  redis:
    image: redis
    container_name: redis
    restart: always
    command: redis-server /etc/redis/redis.conf
    ports:
      - 46379:6379
    environment:
      TZ: Asia/Shanghai
      LANG: en_US.UTF-8
    volumes:
      - ./mnt/conf/redis.conf:/etc/redis/redis.conf:rw
      - ./mnt/data:/data:rw
  • 在宿主机创建配置文件

指定dump恢复目录及文件,和redis实例密码

mkdir -p ./mnt/conf
vim ./mnt/conf/redis.conf
requirepass GSef7NOoIH5R
dbfilename dump.rdb
dir /data
  • 将dump.rdb备份文件放在宿主机./mnt/conf/data下,启动redis
docker-compose up -d
  • 通过日志查看备份恢复进度
docker logs -f redis
  • 验证恢复情况
# 进入容器
docker exec -it redis bash

# 认证
auth GSef7NOoIH5R

# 查询key数量
dbsize

2.2 shell批量导出脚本

  • 进入容器
docker exec -it redis bash
  • 为便于后续操作,在容器安装vim(也可在宿主机挂载目录创建shell脚本)
# 换源并安装vim
sed -i 's/deb.Debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list  \
    && apt update -y \
    && apt-get install -y vim

# 解决vim中文乱码
echo -e "syntax on \nset termencoding=utf-8 \nset encoding=utf8 \nset fileencodings=utf8,ucs-bom,gbkwww.chinasem.cn,cp936,gb2312,gb18030" >> ~/.vimrc
  • 创建shell脚本

使用的scan命令渐进遍历,相对于keys命令全量遍历速度慢些,但胜在安全,对redis的负载低。其中:

  • 可通过CNT参数设定迭代元素的数量来以控制redis负载
  • 获取value值时,通过INTERVAL调整redis-cli的执行间隔,来控制redis负载
vim redis_export.sh
#!/bin/bash
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_PASSWORD=GSef7NOoIH5R
CNT=1000

KEY_NAME=vc_*
KEY_FILE=key_list.txt
VALUE_FILE=value_list.txt
RESULT_FILE=kv_result.txt
INTERVAL=0.01

redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASSWORD scan 0 match "$KEY_NAME"  count $CNT 2>/dev/null> scan_tmp_result
new_cursor=`sed -n '1p' scan_tmp_result`
sed -n fSOiqukTd'2,$p' scan_tmp_result > $KEY_FILE

while [ $new_cursor -ne 0 ]
do
  redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASSWORD scan $new_cursor match "$KEY_NAME" count $CNT 2>/dev/null> scan_tmp_result
  new_cursor=`sed -n '1p' scan_tmp_result`
  echo `cat $KEY_FILE |wc -l`
  sed -n '2,$p' scan_tmp_result >> $KEY_FILE
done
TOTAL=`cat $KEY_FILE |wc -l`
echo $TOTAL

> $VALUE_FILE
i=0
for key in `cat $KEY_FILE`
do
    i=$(($i+1))
    if [[ ${i}%1000 -eq 0 || ${i} -eq $total ]]; fSOiqukTdthen
	    echo "$i / $TOTAL"
    fi
 js   echo "GET $key" | redis-cli $INTERVAL -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASSWORD 2>/dev/null >> $VALUE_FILE
done
paste $KEY_FILE $VALUE_FILE > $RESULT_FILE
rm -f scan_tmp_result $VALUE_FILE $KEY_FILE
  • 运行脚本
bash ./redis_export.sh

3 附录

记录下实践时的其它方法/功能:

  • scan扫描不指定游标,相比keys pattern模式不会长时间阻塞redis。(可通过-i调整执行间隔控制负载)
redis-cli  -a GSef7NOoIH5R --scan --pattern "vc_*">/tmp/redis.log
  • keys全量扫描(慎用)
echo "KEYS vc_*" | redis-cli -a GSef7NOoIH5R >/tmp/redis.log

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持China编程(www.chinasem.cn)。

这篇关于shell脚本批量导出redis key-value方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155565

相关文章

springboot集成easypoi导出word换行处理过程

《springboot集成easypoi导出word换行处理过程》SpringBoot集成Easypoi导出Word时,换行符n失效显示为空格,解决方法包括生成段落或替换模板中n为回车,同时需确... 目录项目场景问题描述解决方案第一种:生成段落的方式第二种:替换模板的情况,换行符替换成回车总结项目场景s

SpringBoot中@Value注入静态变量方式

《SpringBoot中@Value注入静态变量方式》SpringBoot中静态变量无法直接用@Value注入,需通过setter方法,@Value(${})从属性文件获取值,@Value(#{})用... 目录项目场景解决方案注解说明1、@Value("${}")使用示例2、@Value("#{}"php

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

Redis 的 SUBSCRIBE命令详解

《Redis的SUBSCRIBE命令详解》Redis的SUBSCRIBE命令用于订阅一个或多个频道,以便接收发送到这些频道的消息,本文给大家介绍Redis的SUBSCRIBE命令,感兴趣的朋友跟随... 目录基本语法工作原理示例消息格式相关命令python 示例Redis 的 SUBSCRIBE 命令用于订

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

oracle 11g导入\导出(expdp impdp)之导入过程

《oracle11g导入导出(expdpimpdp)之导入过程》导出需使用SEC.DMP格式,无分号;建立expdir目录(E:/exp)并确保存在;导入在cmd下执行,需sys用户权限;若需修... 目录准备文件导入(impdp)1、建立directory2、导入语句 3、更改密码总结上一个环节,我们讲了

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法