gpt4 book ai didi

redis - 批量重命名 key

转载 作者:IT王子 更新时间:2023-10-29 06:01:19 27 4
gpt4 key购买 nike

我有一个相当大的数据库(5 个数据库,每个大约一百万个键),每个键中都有环境命名空间。例如:“datamine::production::crosswalk==foobar”

我需要将我的开发环境与从生产 RDB 快照复制的数据同步。

所以我想做的是批量重命名每个键,将命名空间从 datamine::production 更改为 datamine::development。有什么好的方法可以实现这一目标吗?

到目前为止我尝试了什么

  • keys "datamine::production*" 的 redis-cli 命令,通过管道传输到 sed,然后返回到 redis-cli。这需要永远,并且由于某种原因在许多键上炸弹(偶尔将几个键组合在同一行中)。我想要一个更好的选择。

  • Perl 搜索/替换 .rdb 文件。我的本地 redis-server flat 拒绝加载修改后的 RDB。

最佳答案

解决方案:

好的,这是我为解决这个问题而编写的脚本。它需要“Redis”gem。希望其他人发现这很有用......

#!/usr/bin/env ruby

# A script to translate the current redis database into a namespace for another environment
# GWI's Redis keys are namespaced as "datamine::production", "datamine::development", etc.
# This script connects to redis and translates these key names in-place.
#
# This script does not use Rails, but needs the "redis" gem available
require 'Benchmark'
require 'Redis'

FROM_NAMESPACE = "production"
TO_NAMESPACE = "development"
NAMESPACE_PREFIX = "datamine::"
REDIS_SERVER = "localhost"
REDIS_PORT = "6379"
REDIS_DBS = [0,1,2,3,4,5]

redis = Redis.new(host: REDIS_SERVER, port: REDIS_PORT, timeout: 30)

REDIS_DBS.each do |redis_db|
redis.select(redis_db)
puts "Translating db ##{redis_db}..."
seconds = Benchmark.realtime do
dbsize = redis.dbsize.to_f
inc_threshold = (dbsize/100.0).round
i = 0
old_keys = redis.keys("#{NAMESPACE_PREFIX}#{FROM_NAMESPACE}*")
old_keys.each do |old_key|
new_key = old_key.gsub(FROM_NAMESPACE, TO_NAMESPACE)
redis.rename(old_key, new_key)
print "#{((i/dbsize)*100.0).round}% complete\r" if (i % inc_threshold == 0) # on whole # % only
i += 1
end
end
puts "\nDone. It took #{seconds} seconds"
end

关于redis - 批量重命名 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22052400/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com