如何用脚本批量设置Redis键值?

wen 实用脚本 4

本文目录导读:

如何用脚本批量设置Redis键值?

  1. 方法一:使用 Redis CLI 管道模式
  2. 方法二:Python 脚本
  3. 方法三:Shell 脚本
  4. 方法四:使用 Redis MSET 命令
  5. 方法五:高级脚本示例
  6. 性能优化建议
  7. 注意事项

我来介绍几种批量设置Redis键值对的方法:

使用 Redis CLI 管道模式

生成并执行命令文件

# 创建包含多个 SET 命令的文件
cat > redis_commands.txt << EOF
SET key1 value1
SET key2 value2
SET key3 value3
EOF
# 使用管道批量执行
cat redis_commands.txt | redis-cli --pipe

动态生成命令

#!/bin/bash
# 批量设置10个键值对
for i in $(seq 1 10); do
    echo "SET user:$i user_name_$i"
done | redis-cli --pipe

Python 脚本

使用 redis-py 库

import redis
# 连接 Redis
r = redis.Redis(host='localhost', port=6379, db=0)
# 批量设置键值对
data = {
    'key1': 'value1',
    'key2': 'value2',
    'key3': 'value3'
}
# 使用 pipeline 批量设置
pipe = r.pipeline()
for key, value in data.items():
    pipe.set(key, value)
pipe.execute()  # 一次性执行

从文件读取批量设置

import redis
import json
r = redis.Redis(host='localhost', port=6379, db=0)
# 从 JSON 文件读取数据
with open('data.json', 'r') as f:
    data = json.load(f)
# 批量设置
pipe = r.pipeline()
for item in data:
    pipe.set(item['key'], item['value'])
pipe.execute()

Shell 脚本

基础批量设置

#!/bin/bash
REDIS_CLI="redis-cli -h localhost -p 6379"
# 方式1:逐个设置
$REDIS_CLI SET key1 value1
$REDIS_CLI SET key2 value2
# 方式2:使用循环
for i in {1..100}; do
    $REDIS_CLI SET "user:$i" "value_$i"
done
# 方式3:批量 MSET
$REDIS_CLI MSET key1 value1 key2 value2 key3 value3

从 CSV 文件读取

#!/bin/bash
# data.csv 格式: key,value
while IFS=',' read -r key value; do
    redis-cli SET "$key" "$value"
done < data.csv

使用 Redis MSET 命令

单次设置多个键值

# MSET 可以在一次操作中设置多个键值
redis-cli MSET key1 value1 key2 value2 key3 value3

生成 MSET 命令

#!/bin/bash
# 生成 MSET 命令
keys_values=""
for i in {1..100}; do
    keys_values+=" key:$i value:$i"
done
redis-cli MSET $keys_values

高级脚本示例

Python 高级批量处理

import redis
import json
from multiprocessing import Pool
class RedisBatchSetter:
    def __init__(self, host='localhost', port=6379, db=0):
        self.redis = redis.Redis(host=host, port=port, db=db)
    def batch_set_with_pipeline(self, data, batch_size=1000):
        """使用 pipeline 分批设置"""
        pipe = self.redis.pipeline()
        count = 0
        for key, value in data.items():
            pipe.set(key, value)
            count += 1
            # 每 batch_size 条执行一次
            if count % batch_size == 0:
                pipe.execute()
                pipe = self.redis.pipeline()
                print(f"已设置 {count} 条数据")
        # 执行剩余的
        if count % batch_size != 0:
            pipe.execute()
        print(f"总共设置 {count} 条数据")
    def batch_set_from_file(self, filename, delimiter=':'):
        """从文件批量设置"""
        data = {}
        with open(filename, 'r') as f:
            for line in f:
                if delimiter in line:
                    key, value = line.strip().split(delimiter, 1)
                    data[key.strip()] = value.strip()
        self.batch_set_with_pipeline(data)
# 使用示例
setter = RedisBatchSetter()
data = {f"key_{i}": f"value_{i}" for i in range(10000)}
setter.batch_set_with_pipeline(data, batch_size=500)

Go 语言批量设置

package main
import (
    "context"
    "fmt"
    "github.com/go-redis/redis/v8"
)
func main() {
    ctx := context.Background()
    rdb := redis.NewClient(&redis.Options{
        Addr:     "localhost:6379",
        Password: "", // no password set
        DB:       0,  // use default DB
    })
    // 使用 Pipeline 批量设置
    pipe := rdb.Pipeline()
    for i := 0; i < 1000; i++ {
        pipe.Set(ctx, fmt.Sprintf("key:%d", i), fmt.Sprintf("value:%d", i), 0)
    }
    // 执行所有命令
    _, err := pipe.Exec(ctx)
    if err != nil {
        panic(err)
    }
    fmt.Println("批量设置完成")
}

性能优化建议

  1. 使用 pipeline:减少网络往返次数
  2. 合理分批:单次 pipeline 建议 100-1000 条
  3. 使用 MSET:适合一次性设置少量键值
  4. 避免大键值:单个键值对不要太大
  5. 选择合适的数据结构:考虑使用 hash、set 等

注意事项

  • 大数据量时注意内存使用
  • 设置过期时间避免内存溢出
  • 生产环境注意备份
  • 根据网络情况调整批量大小

选择哪种方法取决于你的具体需求:脚本语言偏好、数据量大小、是否需要处理复杂数据结构等。

抱歉,评论功能暂时关闭!