欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

shell腳本批量導出redis key-value方式

 更新時間:2025年08月02日 08:53:27   作者:lc_1203  
為避免keys全量掃描導致Redis卡頓,可先通過dump.rdb備份文件在本地恢復,再使用scan命令漸進導出key-value,通過CNT和INTERVAL參數(shù)控制負載,且scan不指定游標可減少阻塞

1 背景

需求:工作中需要導出線上redis數(shù)據(jù),但需避免使用keys命令全量掃描,導致瞬間響應卡頓,從而引發(fā)超時等問題

方法:最安全的方式是通過dump.rdb備份文件,在本地redis實例上恢復,然后執(zhí)行shell腳本,使用scan漸進掃描批量導出key-value。

2 詳細步驟

2.1 本地docker啟動redis

本地通過docker-compose創(chuàng)建redis實例,并掛載配置文件和數(shù)據(jù)目錄

  • 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
  • 在宿主機創(chuàng)建配置文件

指定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數(shù)量
dbsize

2.2 shell批量導出腳本

  • 進入容器
docker exec -it redis bash
  • 為便于后續(xù)操作,在容器安裝vim(也可在宿主機掛載目錄創(chuàng)建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
  • 創(chuàng)建shell腳本

使用的scan命令漸進遍歷,相對于keys命令全量遍歷速度慢些,但勝在安全,對redis的負載低。其中:

  • 可通過CNT參數(shù)設定迭代元素的數(shù)量來以控制redis負載
  • 獲取value值時,通過INTERVAL調整redis-cli的執(zhí)行間隔,來控制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調整執(zhí)行間隔控制負載)
redis-cli  -a GSef7NOoIH5R --scan --pattern "vc_*">/tmp/redis.log
  • keys全量掃描(慎用)
echo "KEYS vc_*" | redis-cli -a GSef7NOoIH5R >/tmp/redis.log

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • 淺析對redis?hashtable?的sizemask理解

    淺析對redis?hashtable?的sizemask理解

    在?Redis?的哈希表實現(xiàn)中,index?=?hash?&?dict->ht[0].sizemask?是計算鍵值對應存儲位置的核心操作,本文給大家介紹redis?hashtable?的sizemask理解,感興趣的朋友一起看看吧
    2025-03-03
  • Redis集群模式和常用數(shù)據(jù)結構詳解

    Redis集群模式和常用數(shù)據(jù)結構詳解

    Redis集群模式下的運維指令主要用于集群的搭建、管理、監(jiān)控和維護,講解了一些常用的Redis集群運維指令,本文重點介紹了Redis集群模式和常用數(shù)據(jù)結構,需要的朋友可以參考下
    2024-03-03
  • Redis中5種BitMap應用場景及實現(xiàn)介紹

    Redis中5種BitMap應用場景及實現(xiàn)介紹

    Redis BitMap是一種高效的位操作數(shù)據(jù)結構,這種結構在處理海量數(shù)據(jù)的布爾型狀態(tài)時尤其高效,下面小編就來和大家簡單介紹一下5種它的應用場景及實現(xiàn)方法吧
    2025-04-04
  • Redis并發(fā)訪問問題詳細講解

    Redis并發(fā)訪問問題詳細講解

    本文主要介紹了Redis如何應對并發(fā)訪問,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-12-12
  • redis哈希類型_動力節(jié)點Java學院整理

    redis哈希類型_動力節(jié)點Java學院整理

    這篇文章主要介紹了redis哈希類型的常用方法及原理淺析,感興趣的朋友一起看看吧
    2017-08-08
  • Govern Service 基于 Redis 的服務治理平臺安裝過程詳解

    Govern Service 基于 Redis 的服務治理平臺安裝過程詳解

    Govern Service 是一個輕量級、低成本的服務注冊、服務發(fā)現(xiàn)、 配置服務 SDK,通過使用現(xiàn)有基礎設施中的 Redis 不用給運維部署帶來額外的成本與負擔,接下來通過本文給大家分享Govern Service 基于 Redis 的服務治理平臺的相關知識,感興趣的朋友一起看看吧
    2021-05-05
  • Redis String 類型和 Hash 類型學習筆記與總結

    Redis String 類型和 Hash 類型學習筆記與總結

    這篇文章主要介紹了Redis String 類型和 Hash 類型學習筆記與總結,本文分別對String 類型的一些方法和Hash 類型做了詳細介紹,需要的朋友可以參考下
    2015-06-06
  • Redis超詳細分析分布式鎖

    Redis超詳細分析分布式鎖

    在單體應用中,如果我們對共享數(shù)據(jù)不進行加鎖操作,會出現(xiàn)數(shù)據(jù)一致性問題,我們的解決辦法通常是加鎖。下面我們一起聊聊使用redis來實現(xiàn)分布式鎖
    2022-07-07
  • redis 解決key的亂碼問題,并清理詳解

    redis 解決key的亂碼問題,并清理詳解

    這篇文章主要介紹了redis 解決key的亂碼問題,并清理詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Redis+threading實現(xiàn)多線程消息隊列的使用示例

    Redis+threading實現(xiàn)多線程消息隊列的使用示例

    Redis多線程消息隊列是一種使用Redis作為存儲后端的消息隊列實現(xiàn),它利用Redis的線程并發(fā)處理能力來提高消息隊列的處理效率,本文主要介紹了Redis+threading實現(xiàn)多線程消息隊列的使用示例,感興趣的可以了解一下
    2023-12-12

最新評論