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