- Esta extensión no está habilitada por defecto, pero puede estar disponible mediante solicitud.
LuaCache es una extensión que expone el ObjectCache de MediaWiki a través de una interfaz Lua, que puede utilizarse para almacenar datos entre peticiones. Sólo solicite la extensión si usted tiene conocimientos en Lua, ya que el uso de esta puede ser algo complejo.
Aplicaciones
LuaCache tiene dos aplicaciones principales: el almacenamiento en todo el sitio de los resultados de las consultas costosas, y la disminución de los problemas de rendimiento con los módulos utilizados en un número muy grande de páginas.
Almacenamiento de consultas
LuaCache puede utilizarse para almacenar en caché los resultados de consultas costosas de DPL, ya que será más rápido acceder a la caché que realizar la consulta de nuevo. Sin embargo, LuaCache es más lento que VariablesLua, por lo que una cadena alternativa podría ser: variable local → VariablesLua → LuaCache → consulta costosa.
Reducción de la tabla de enlaces
Cuando se utiliza un módulo de datos en una página, cualquier cambio en el módulo de datos requerirá una reevaluación de esa página. Cuando un módulo de datos se utiliza en un gran número de páginas, tiene que ser actualizado con frecuencia, pero la mayoría de las actualizaciones sólo afectan a un pequeño subconjunto de páginas que utilizan los datos, el resultado es que el wiki tiene que realizar regularmente una reevaluación inútil de las páginas que no serían cambiadas. El uso de LuaCache para almacenar los datos puede causar problemas típicos del almacenamiento en caché (requiriendo que las páginas sean purgadas), pero es probable que disminuya significativamente el número de páginas que el motor cree que son "dependientes" del módulo de datos. (Este número también se conoce como el número de "transclusiones" que aparecen en Especial:LoQueEnlazaAquí para esa página). Como caso de uso de LuaCache de Leaguepedia, el recuento de transclusiones para un módulo de datos bajó de aproximadamente 100 mil páginas a 7 páginas.
Uso
Cache object
Para acceder a la caché de objetos, primero hay que adquirir el objeto caché. Esto se puede hacer de la siguiente manera:
local cache = require 'mw.ext.LuaCache'
cache.get
cache.get( key )
Devuelve el valor almacenado en la caché bajo la llave (string) dada.
Si no hay ningún valor almacenado bajo la clave dada, se devuelve nil.
cache.set
cache.set( key, value )
cache.set( key, value, exptime )
Almacena el valor dado en la caché bajo la llave (string) dada. Opcionalmente, se puede especificar un exptime (tiempo de expiración) en segundos. Devuelve true si el valor se almacena con éxito, y false de lo contrario.
cache.getMulti
cache.getMulti( keys )
Recupera los valores almacenados bajo las claves dadas en el array de cadenas suministrado y luego construye y devuelve una tabla de los valores asociados a sus respectivas claves.
cache.setMulti
cache.setMulti( data )
cache.setMulti( data, exptime )
Acepta una tabla de datos y almacena el valor de cada fila en la caché bajo su respectiva clave. Opcionalmente, se puede especificar un exptime (tiempo de caducidad) en segundos, que se aplicará a cada entrada de la caché.
cache.delete
cache.delete( key )
Elimina la entrada de la caché identificada por la clave (cadena) dada.
Ejemplo
-- Módulo:Demo
local p = {}
local cache = require 'mw.ext.LuaCache'
function p.test(frame)
local args = frame.args
local keyPrefix = args[1] or 'sample'
local sampleValue = {
hello = 'World',
name = 'Alyanah',
counter = 0
}
local results = {}
local handleValue = function(r)
if r ~= nil then
sampleValue.counter = (r.counter or 0) + 1
table.insert(results, 'Hello: ' .. tostring(r.hello))
table.insert(results, 'Name: ' .. tostring(r.name))
table.insert(results, 'Counter: ' .. tostring(r.counter))
else
table.insert(results, '(nil)')
end
end
-- Obtener un elemento de la caché
-- Será nulo la primera vez que se ejecute esta función
-- y tendrá un valor después mientras el
-- el elemento permanezca en la caché.
local singleTestKey = keyPrefix .. '.singleTest'
local res = cache.get(singleTestKey)
table.insert(results, 'cache.get(\'' .. singleTestKey .. '\')')
handleValue(res)
-- Poner un elemento en la caché
res = cache.set(singleTestKey, sampleValue)
table.insert(results, 'cache.set returned ' .. tostring(res))
-- Obtener el elemento de la caché de nuevo
res = cache.get(singleTestKey)
table.insert(results, 'cache.get(\'' .. singleTestKey .. '\')')
handleValue(res)
table.insert(results, '')
-- Poner el elemento en la caché con una caducidad de 30s
res = cache.set(singleTestKey, sampleValue, 30)
table.insert(results, 'cache.set returned ' .. tostring(res))
-- Establecer varios objetos en la caché
res = cache.setMulti({
[keyPrefix .. '.multiTest.1'] = {
when = 'now',
what = '불고기'
},
[keyPrefix .. '.multiTest.2'] = {
when = 'tomorrow',
what = '김치찌개'
},
[keyPrefix .. '.multiTest.3'] = {
when = 'yesterday',
what = '순두부찌개'
}
})
table.insert(results, 'cache.setMulti returned ' .. tostring(res))
-- Obtener uno de los elementos de la caché
res = cache.get(keyPrefix .. '.multiTest.2')
if res then
table.insert(results, 'When: ' .. tostring(res.when))
table.insert(results, 'What: ' .. tostring(res.what))
else
table.insert(results, '(nil)')
end
-- Borrar uno de los elementos de la caché
res = cache.delete(keyPrefix .. '.multiTest.2')
table.insert(results, 'cache.delete returned ' .. tostring(res))
-- Obtener todos esos artículos
res = cache.getMulti({
keyPrefix .. '.multiTest.1',
keyPrefix .. '.multiTest.2',
keyPrefix .. '.multiTest.3',
})
for k, v in pairs(res) do
table.insert(results, tostring(k) .. ' = ')
if v and type(v) == 'table' then
table.insert(results, 'When: ' .. tostring(v.when))
table.insert(results, 'What: ' .. tostring(v.what))
else
table.insert(results, tostring(v))
end
end
-- Formatear los resultados como wikitexto preformateado
return ' ' .. table.concat(results, '\n ')
end
return p
{{#invoke:Demo|test}}devuelve:
cache.get('sample.singleTest')
(nil)
cache.set returned true
cache.get('sample.singleTest')
Hello: World
Name: Alyanah
Counter: 0
cache.set returned true
cache.setMulti returned true
When: tomorrow
What: 김치찌개
cache.delete returned true
sample.multiTest.3 =
When: yesterday
What: 순두부찌개
sample.multiTest.1 =
When: now
What: 불고기
Enlaces externos
Ayuda y comentarios
- Navega y busca otras páginas de ayuda en Ayuda:Contenidos.
- Revisa Comunidad Central de Fandom para más fuentes de ayuda y soporte.
- Revisa Contactar con Fandom para saber cómo reportar algún error o algún paso que no esté claro en este artículo.