返回顶部
分享到

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

Redis 来源:互联网 作者:佚名 发布时间:2025-08-03 10:16:11 人浏览
摘要

1 背景 需求:工作中需要导出线上redis数据,但需避免使用keys命令全量扫描,导致瞬间响应卡顿,从而引发超时等问题 方法:最安全的方式是通过dump.rdb备份文件,在本地redis实例上恢复,然后

1 背景

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

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

2 详细步骤

2.1 本地docker启动redis

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

  • docker-compose.yml

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

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实例密码

1

2

mkdir -p ./mnt/conf

vim ./mnt/conf/redis.conf

1

2

3

requirepass GSef7NOoIH5R

dbfilename dump.rdb

dir /data

  • 将dump.rdb备份文件放在宿主机./mnt/conf/data下,启动redis

1

docker-compose up -d

  • 通过日志查看备份恢复进度

1

docker logs -f redis

  • 验证恢复情况

1

2

3

4

5

6

7

8

# 进入容器

docker exec -it redis bash

 

# 认证

auth GSef7NOoIH5R

 

# 查询key数量

dbsize

2.2 shell批量导出脚本

  • 进入容器

1

docker exec -it redis bash

  • 为便于后续操作,在容器安装vim(也可在宿主机挂载目录创建shell脚本)

1

2

3

4

5

6

7

# 换源并安装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负载

1

vim redis_export.sh

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

#!/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

  • 运行脚本

1

bash ./redis_export.sh

3 附录

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

  • scan扫描不指定游标,相比keys pattern模式不会长时间阻塞redis。(可通过-i调整执行间隔控制负载)

1

redis-cli  -a GSef7NOoIH5R --scan --pattern "vc_*">/tmp/redis.log

  • keys全量扫描(慎用)

1

echo "KEYS vc_*" | redis-cli -a GSef7NOoIH5R >/tmp/redis.log


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。

您可能感兴趣的文章 :

原文链接 :
相关文章
  • shell脚本批量导出redis key-value方式
    1 背景 需求:工作中需要导出线上redis数据,但需避免使用keys命令全量扫描,导致瞬间响应卡顿,从而引发超时等问题 方法:最安全的方式
  • redis通用配置类的使用

    redis通用配置类的使用
    redis通用配置类 作用 处理Springboot使用 RedisTemplate过程中的编码问题 现象如下,看数据的时候不方便 所以添加一下的配置类之后,就可以了
  • linux部署redis集群遇到的问题及解决
    版本信息: redis:5.0.8 linux服务器:CentOS 7 不同版本问题处理方式可能有所不同 1、在java程序中,连接不上redisCluster 报错信息: no reachable
  • Redis中对大Key进行处理方式

    Redis中对大Key进行处理方式
    什么是大key 很多铁子可能会认为大key,是这个key的值很大其实不是,而是key的value值很大一般对于下面这些我们可以称为大key. String 类型值
  • 一文浅析如何在Redis中实现缓存功能
    Redis 是一种高性能的键值存储系统,广泛用于实现缓存功能。它通过将数据存储在内存中,能够快速读写数据,从而显著提高应用程序的性
  • Redis Cluster模式配置
    分片 一、分片的本质与核心价值 问题根源 单机 Redis 存在内存容量和吞吐量瓶颈,分片通过将数据分散到多个节点解决此问题。 核心价值
  • Redis中的Lettuce使用介绍
    Lettuce 是一个高级的、线程安全的 Redis 客户端,用于与 Redis 数据库交互。它提供了许多方法来配置连接池的参数,例如最大连接数、最小空
  • redis过期key的删除策略
    在使用redis的过程中,不免会产生过期的key,而这些key过期后并不会实时地马上被删除,当这些key数量累积越来越多,就会占用很多内存,因
  • React实现组件之间通信的几种常用方法
    React 中如何实现组件之间的通信? 1. Props 传递 最直接的通信方式是通过 props 将数据从父组件传递给子组件。父组件通过属性将数据传递给
  • redis-cli常用命令使用介绍
    1 redis-cli连接redis服务 1.1 无密码本地登录 1 2 3 4 5 redis-cli redis 127.0.0.1:6379 redis 127.0.0.1:6379 PING PONG 1.2 指定ip、端口、密码 1 redis-cli -h [ip] -p
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计