shell脚本批量导出redis key-value

news/2024/4/20 15:07:36/文章来源:https://blog.csdn.net/qq_14999375/article/details/129227165

目录

  • 1 背景
  • 2 详细步骤
    • 2.1 本地docker启动redis
    • 2.2 shell批量导出脚本
  • 3 附录

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: rediscontainer_name: redisrestart: alwayscommand: redis-server /etc/redis/redis.confports:- 46379:6379environment:TZ: Asia/ShanghaiLANG: en_US.UTF-8volumes:- ./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=1000KEY_NAME=vc_*
KEY_FILE=key_list.txt
VALUE_FILE=value_list.txt
RESULT_FILE=kv_result.txt
INTERVAL=0.01redis-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_FILEwhile [ $new_cursor -ne 0 ]
doredis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASSWORD scan $new_cursor match "$KEY_NAME" count $CNT 2>/dev/null> scan_tmp_resultnew_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`
doi=$(($i+1))if [[ ${i}%1000 -eq 0 || ${i} -eq $total ]]; thenecho "$i / $TOTAL"fiecho "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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_74516.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android安卓中jni封装代码打包为aar

前文【Android安卓中jni与Java之间传递复杂的自定义数据结构】已经介绍jni编译c++代码且已经成功封装成java,但是c++是以源代码形式继承在app中,本文介绍如何将前述jni c++代码以隐藏源代码封装成aar的形式。 1、aar打包 1.1、新建module 按照流程 File -> New Module …

windows服务器实用(4)——使用IIS部署网站

windows服务器实用——IIS部署网站 如果把windows服务器作为web服务器使用,那么在这个服务器上部署网站是必须要做的事。在windows服务器上,我们一般使用IIS部署。 假设此时前端给你一个已经完成的网站让你部署在服务器上,别人可以在浏览器…

Objective-C description 自定义对象的打印格式/输出的字符串 类似于Java 中的 toString 方法

总目录 iOS开发笔记目录 从一无所知到入门 文章目录IntroNSObject 源码测试类截图测试代码输出Intro 在 Java 中,对于自定义类一般会重写集成自Object类的toString方法,这样在打印该类的对象时,打印出的字符串就是我们在 toString() 方法中返…

Oracle Apex 21.2 安装过程

什么是 Oracle APEX? Oracle APEX 是广受欢迎的企业级低代码应用平台。借助该平台,您可以构建功能先进的可扩展安全企业应用,并在任何位置(云或内部部署)部署这些应用。 使用 APEX,开发人员可快速开发并部…

数据结构入门DAY1

力扣刷题合集:力扣刷题_Sunlightʊə的博客-CSDN博客217.存在重复元素相关题目链接:力扣 - 存在重复元素题目重现给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返…

大数据框架之Hadoop:MapReduce(三)MapReduce框架原理——ReduceTask工作机制

1、ReduceTask工作机制 ReduceTask工作机制,如下图所示。 (1)Copy阶段:ReduceTask从各个MapTask上远程拷贝一片数据,并针对某一片数据,如果其大小超过一定阈值,则写到磁盘上,否则直…

Active Directory 05 - 初识 AD CS 证书服务

写在最前 如果你是信息安全爱好者,如果你想考一些证书来提升自己的能力,那么欢迎大家来我的 Discord 频道 Northern Bay。邀请链接在这里: https://discord.gg/9XvvuFq9Wb我会提供备考过程中尽可能多的帮助,并分享学习和实践过程…

1029 旧键盘 C++中find函数的使用

题目链接: 一、自己的想法:(弱化版双指针) 思路为用两个“指针”i, j分别指向原来字符串和实际输入字符串的第一个字符,然后判断i,j所指字符是否一致,若是则i, j同时,若否则将i所指…

【5G RRC】5G系统消息SIB3介绍

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。 博客…

Windows下命令执行绕过技巧总结(渗透测试专用)

一、连接符1、双引号不要求双引号闭合举例:"who"a"mi" //闭合的 "who"a"mi //不闭合的2、圆括号必须在两边,不能包括中间的字符。举例:((whoami))3、^符号(转译符号)不可以在结尾&…

Go项目(商品微服务-1)

文章目录简介建表protohandler商品小结简介 商品微服务主要在于表的设计,建哪些表?表之间的关系是怎样的? 主要代码就是 CURD表和字段的设计是一个比较有挑战性的工作,比较难说清楚,也需要经验的积累,这里…

【机器学习笔记】Python基础笔记

目录基础语法加载数据:pd.read_csv查看数据大小:shape浏览数据行字段:columns浏览少量数据:head()浏览数据概要:describe()输出:to_csv基础功能语法缺省值去除缺失值:dropna按行删除&#xff1a…

Paddle配置

目录: 1.激活环境 2.版本选择 突发情况:ModuleNotFoundError: No module named paddle 检验是否安装成功 1.激活环境 Anaconda: conda remove -n paddle --all conda activate paddle 2.版本选择 打开链接:https://www.pa…

基于企业微信应用消息的每日早安推送

基于企业微信应用消息的每日早安推送 第一步:注册企业微信 企业微信注册地址:https://work.weixin.qq.com/wework_admin/register_wx 按照正常流程填写信息即可,个人也可以注册企业微信,不需要公司 注册完成后,登录…

Google Guice 4:Bindings(2)

4 Scopes (实例的作用域) 4.1 默认规则:unreuse instance 到目前为止,通过bind().to()和Provides定义的binding,每次需要注入实例对象时,Guice都会创建一个新的实例 // 修改DatabaseTransactionLog,使其打…

Ncvicat 打开sql文件方法

Nacicat打开sql文件时,有比较多的文章介绍可以直接打开,方法介绍的比较多,但是我遇到了一个坑,就是如何配置环境都无法打开。 本机环境: windows10 mysql 5.7.40 Navicat12.1 一、遇到问题情况 1.1、通过navicat…

【python量化】大幅提升预测性能,将NSTransformer用于股价预测

写在前面 NSTransformer模型来自NIPS 2022的一篇paper《Non-stationary Transformers: Exploring the Stationarity in Time Series Forecasting》。NSTransformer的目的主要是为了解决其他方法出现过平稳化处理的问题。其通过提出序列平稳化以及去平稳化注意力机制可以使得模型…

2023年三月份图形化二级打卡试题

活动时间 从2023年3月1日至3月21日,每天一道编程题。 本次打卡的规则如下: 小朋友每天利用10~15分钟做一道编程题,遇到问题就来群内讨论,我来给大家答疑。 小朋友做完题目后,截图到朋友圈打卡并把打卡的截图发到活动群…

【尚硅谷MySQL入门到高级-宋红康】数据库概述

1、为什么要使用数据库 数据的持久化 2、数据库与数据库管理系统 2.1 数据库的相关概念 2.2 数据库与数据库管理系统的关系 3、 MySQL介绍 MySQL从5.7版本直接跳跃发布了8.0版本 ,可见这是一个令人兴奋的里程碑版本。MySQL 8版本在功能上做了显著的改进与增强&a…

CXL技术分析

CXL,全称Compute Express Link,该技术由Intel牵头开发用于高性能计算、数据中心,主要解决处理器、加速器和内存之间的cache一致性问题,可消除CPU、专用加速器的计算密集型工作负载的传输瓶颈,显著提升系统性能。 一、…