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

相关文章

批量导入txt数据到的redis过程

《批量导入txt数据到的redis过程》用户通过将Redis命令逐行写入txt文件,利用管道模式运行客户端,成功执行批量删除以Product*匹配的Key操作,提高了数据清理效率... 目录批量导入txt数据到Redisjs把redis命令按一条 一行写到txt中管道命令运行redis客户端成功了批量删除k

Oracle查询表结构建表语句索引等方式

《Oracle查询表结构建表语句索引等方式》使用USER_TAB_COLUMNS查询表结构可避免系统隐藏字段(如LISTUSER的CLOB与VARCHAR2同名字段),这些字段可能为dbms_lob.... 目录oracle查询表结构建表语句索引1.用“USER_TAB_COLUMNS”查询表结构2.用“a

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Oracle数据库定时备份脚本方式(Linux)

《Oracle数据库定时备份脚本方式(Linux)》文章介绍Oracle数据库自动备份方案,包含主机备份传输与备机解压导入流程,强调需提前全量删除原库数据避免报错,并需配置无密传输、定时任务及验证脚本... 目录说明主机脚本备机上自动导库脚本整个自动备份oracle数据库的过程(建议全程用root用户)总结

Debian系和Redhat系防火墙配置方式

《Debian系和Redhat系防火墙配置方式》文章对比了Debian系UFW和Redhat系Firewalld防火墙的安装、启用禁用、端口管理、规则查看及注意事项,强调SSH端口需开放、规则持久化,... 目录Debian系UFW防火墙1. 安装2. 启用与禁用3. 基本命令4. 注意事项5. 示例配置R

最新Spring Security的基于内存用户认证方式

《最新SpringSecurity的基于内存用户认证方式》本文讲解SpringSecurity内存认证配置,适用于开发、测试等场景,通过代码创建用户及权限管理,支持密码加密,虽简单但不持久化,生产环... 目录1. 前言2. 因何选择内存认证?3. 基础配置实战❶ 创建Spring Security配置文件

Python获取浏览器Cookies的四种方式小结

《Python获取浏览器Cookies的四种方式小结》在进行Web应用程序测试和开发时,获取浏览器Cookies是一项重要任务,本文我们介绍四种用Python获取浏览器Cookies的方式,具有一定的... 目录什么是 Cookie?1.使用Selenium库获取浏览器Cookies2.使用浏览器开发者工具

Redis MCP 安装与配置指南

《RedisMCP安装与配置指南》本文将详细介绍如何安装和配置RedisMCP,包括快速启动、源码安装、Docker安装、以及相关的配置参数和环境变量设置,感兴趣的朋友一起看看吧... 目录一、Redis MCP 简介二、安www.chinasem.cn装 Redis MCP 服务2.1 快速启动(推荐)2.

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取