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

 更新时间:2025年08月02日 08:53:27   作者:lc_1203  
为避免keys全量扫描导致Redis卡顿,可先通过dump.rdb备份文件在本地恢复,再使用scan命令渐进导出key-value,通过CNT和INTERVAL参数控制负载,且scan不指定游标可减少阻塞

1 背景

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

方法:最安全的方式是通过dump.rdb备份文件,在本地redis实例上恢复,然后执行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,gbk,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 '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 ]]; then
	    echo "$i / $TOTAL"
    fi
    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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Redis中pipeline(管道)的实现示例

    Redis中pipeline(管道)的实现示例

    Redis管道(Pipeline)技术是一种提高数据处理效率的机制,允许客户端通过一次网络往返(RTT)发送多个命令到服务端,并一次性接收所有响应,本文就来实现管道,感兴趣的可以了解一下
    2024-10-10
  • 关于分布式锁的三种实现方式

    关于分布式锁的三种实现方式

    这篇文章主要介绍了关于分布式锁的三种实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • Redis缓存数据库表(列单独缓存)的示例代码

    Redis缓存数据库表(列单独缓存)的示例代码

    在Redis中缓存数据库表数据,而不使用JSON结构来表示value,通常意味着我们会将数据库表的每一行数据映射为Redis中的一个或多个键值对,这篇文章主要介绍了Redis缓存数据库表(列单独缓存),需要的朋友可以参考下
    2024-03-03
  • Redis中Scan命令的踩坑实录

    Redis中Scan命令的踩坑实录

    这篇文章主要给大家介绍了关于Redis中Scan命令踩坑的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-07-07
  • 在CenOS系统下安装和配置Redis数据库的教程

    在CenOS系统下安装和配置Redis数据库的教程

    这篇文章主要介绍了在CenOS系统下安装和配置Redis数据库的教程,Redis是一个可基于内存的高性能NoSQL数据库,需要的朋友可以参考下
    2015-11-11
  • Redis 哨兵搭建的实现示例

    Redis 哨兵搭建的实现示例

    本文详细介绍了Redis 7.2.5单节点和多节点哨兵的搭建流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-09-09
  • Windows下搭建Redis哨兵集群模式的方法步骤

    Windows下搭建Redis哨兵集群模式的方法步骤

    哨兵模式,是基于主从复制模式,主从复制的优点全都拥有,并且主从可以实现自动切换,故障转移等功能,本文主要介绍了Windows下搭建Redis哨兵集群模式的方法步骤,文中通过图文介绍的非常详细,感兴趣的小伙伴们可以参考一下,需要的朋友可以参考下
    2023-09-09
  • 浅谈Redis 缓存的三大问题及其解决方案

    浅谈Redis 缓存的三大问题及其解决方案

    Redis 经常用于系统中的缓存,这样可以解决目前 IO 设备无法满足互联网应用海量的读写请求的问题。本文主要介绍了浅谈Redis 缓存的三大问题及其解决方案,感兴趣的可以了解一下
    2021-07-07
  • k8s部署redis集群实现过程实例详解

    k8s部署redis集群实现过程实例详解

    这篇文章主要为大家介绍了k8s部署redis集群实现过程实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • 详解redis缓存与数据库一致性问题解决

    详解redis缓存与数据库一致性问题解决

    这篇文章主要介绍了详解redis缓存与数据库一致性问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03

最新评论