我在应用程序中使用Redis。 Redis数据库每隔一段时间就会备份到Mongo。
我正在修复将Redis进行Mongo备份的cron作业。为了对其进行测试,我将代码作为脚本运行。我在让redis东西实际执行任何操作时遇到了麻烦。
基本上,脚本执行两件事。首先,它获取所有键,循环遍历它们,并创建从redis记录创建的mongo记录。之后,它将每个redis文件标记为已备份。其次,它再次循环浏览键,并删除标记为已备份的redis文件。
为了测试这一点,我在重新遍历所有键(应该只是最近创建的一个键)之前创建了一个新的哈希值。但是这些都没有发生。
代码如下:
exports.start = start = function (cb) {
console.log('program begin')
client.hmset(['newHASH', 'route', 'routeValue', 'ipAddress', 'ipAddressValue'], function (err, res) {
if (err) {
console.log(err)
}
console.log(res)
client.keys('*', function (err, keys) { // gets all hashes in redis db, returns them as 'keys'
if (err) {
console.log(err)
}
console.log('keys: ' + keys)
for (let i = 0, len = keys.length; i < len; i++) { // loop through all keys
client.hgetall(keys[i], function (err, results) { // gets all key/value pairs from keys[i], returns them as 'results'
if (err) {
console.log(err)
}
/* --inserts the object to be stored in Mongo db using the key/value pairs from 'results'-- */
AnalyticsRepo.create({
route: results.route,
ipAddress: Binary(results.ipAddress), // converts string to binary
userId: new ObjectID(results.userId), // converts string to Mongo ObjectID
timestamp: Date.parse(results.timestamp)}, // converts string to unix timestamp
function (err, insert) {
if (err) {
console.log(err)
}
})
// add backup field to keys[i] after saved to Mongo
client.hset([keys[i], 'backup', 'true'], (err, backup) => {
if (err) {
console.log(err)
}
})
})
}
})
// 2nd iteration of all hashes in redis
client.keys('*', function (err, keys) { // gets all hashes in redis db, returns them as 'keys'
if (err) {
console.log(err)
}
for (let i = 0, len = keys.length; i < len; i++) {
// if the hash has been saved to Mongo (has a 'backup' field equal to 'true'), delete the hash from redis
client.hget([keys[i], 'backup'], (err, backupField) => {
if (err) {
console.log(err)
}
if (backupField === 'true') {
client.del(keys[i], (err, success) => {
if (err) {
console.log(err)
}
console.log('record deleted')
})
}
})
}
})
})
cb()
}
const redisToMongo = function () {
db.init(function (err, results) {
if (err) {
console.error(err)
return process.exit(1)
} else {
start(() => {
process.exit()
})
}
})
}
let args = process.argv[1]
if (args === 'localPath') {
redisToMongo()
console.log('program run')
}
在最底部,我添加了代码,使我可以将代码作为脚本运行。我添加了一条日志语句:console.log('program run')
此日志语句有效。同样,在实际函数的第一行中,我添加了一条日志语句:console.log('program begin')
此日志语句也有效。但是,该函数中的其他日志语句均未执行任何操作。
运行程序时没有出现任何错误。为了确保redis做出某种反应,我在函数中给了它一个“错误的命令”,如下所示:client.hsetasdfg(...)
这给了我一个错误,应该这样。就像一切正常,直到我执行第一个redis命令为止,然后程序没有执行应有的功能,但也没有给我错误。
理想情况下,如果脚本可以运行,我将运行它,然后检查mongoDB并查看是否已从脚本中添加了一个条目。
请告知。这里发生了什么?