Si plusieurs opérations de redis sont impliqués, en général, je préfère écrire script lua puis l'appeler par mon programme nodejs. Ceci est un exemple sans rapport, mais il montre comment vous pouvez utiliser lua via nodejs.
exemple: 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
code NodeJS qui utilise Lua: dire index.js
...
// 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)
})
})
}
Et, enfin, une fonction qui utilise le cache sha digérer pour exécuter le script:
getJobState: function(jobId) {
return loadScript('getState').then(function(hash) {
return getConnection().then(function (conn) {
return conn.evalshaAsync(hash, 1, jobId)
})
})
},
Vous pouvez exécuter la requête redis-side avec des scripts lua? –
@ChrisTanner Non, désolé, je ne peux pas. Je dois le faire sur le serveur node.js. –
Au lieu de faire 7 roundtrips à redis, pensez à utiliser le script lua qui peut effectuer cette opération atomiquement. De cette façon, vous êtes sûr que votre opération de vérification n'est pas interrompue par un autre code client. –