複数のRedisのオペレーションが含まれている場合は、一般的に私はLuaのスクリプトを記述して、私のnodejsプログラムを通してそれを呼び出すことを好みます。これは無関係の例ですが、luaからnodejまでの使用方法を示しています。
例:LUAを使用していますget_state.lua
local jobId = KEYS[1]
local jobExists = redis.pcall('exists', jobId)
if jobExists == 0 or jobExists == nil then
return 404 -- not found.
end
-- check the job state
local st = tonumber(redis.pcall('hmget', jobId, 'ctlState')[1])
if st == nil then
st = 12002 -- job running, unless explicitly stated otherwise
end
return st
NodeJSコード:
...
// List of script files
var scriptMap = {
getState: {file:'./scripts/get_state.lua'}
};
...
// A function to load the script file to Redis and cache the sha.
function loadScript(script) {
logger.trace("loadScript(): executing...");
if (scriptMap[script]['hash']) {
logger.trace("Sript already loaded. Returning without loading again...");
return Promise.resolve(scriptMap[script]['hash']);
}
//load from file and send to redis
logger.trace("Loading script from file %s...", scriptMap[script].file);
return fs.readFileAsync(scriptMap[script].file).then(function(data) {
return getConnection().then(function(conn) {
logger.trace("Loading script to Redis...");
return conn.scriptAsync('load', data)
})
})
}
index.js言うそして、最後に、キャッシュされたSHAを使用する機能は、スクリプトを実行するためにダイジェスト:
getJobState: function(jobId) {
return loadScript('getState').then(function(hash) {
return getConnection().then(function (conn) {
return conn.evalshaAsync(hash, 1, jobId)
})
})
},
ルアスクリプトでクエリredis-sideを実行できますか? –
@ChrisTannerいいえ、申し訳ありませんが、できません。私はnode.jsサーバーでそれを行う必要があります。 –
redisに7回のラウンドトリップを実行する代わりに、この操作をアトミックに行うことができるluaスクリプトの使用を検討してください。このようにして、あなたのチェック操作が他のクライアントコードによって中断されないことを確かめます。 –