Kiam pluraj laborantoj kunhavas provizon per Redis, ordigita aro povas realigi simplan politikon: elekti la permesatan prokurilon kun la malplej registritaj asignoj. Konservu prokurilan identigilon kiel membro kaj ĝian asignan nombron kiel poentaro.

Por provizo servantaj permesatajn publikajn petojn, la senpaga prokurila listo povas liveri finpunktajn kandidatojn por taksi laŭ la permesecaj reguloj de tiu provizo. Pravalorigu permesatajn membrojn per interkonsentita komenca nombro. Poste faru la elekton kaj pliigon kiel unu servoflankan operacion:

local chosen = redis.call('ZRANGE', KEYS[1], 0, 0)[1]
if not chosen then
    return nil
end

redis.call('ZINCRBY', KEYS[1], 1, chosen)
return chosen

Transdonu la ŝlosilon de la ordigita aro kiel la solan ŝlosilan argumenton de la skripto per la EVAL-interfaco de via Redis-kliento. Malplena provizo produktas nulan rezulton, kiun la aplikaĵo devas trakti sen fari peton.

Kial kunigi la du komandojn?

Apartaj legadoj kaj pliigoj lasas du laborantojn vidi la saman minimumon antaŭ ol iu ajn ĝin ĝisdatigas. Redis plenumas Lua-skripton atome, do alia laboranto ne povas enŝovi elekton inter la legado kaj la pliigo de ĉi tiu skripto. Tenu la skripton mallonga, ĉar ĝia plenumo blokas alian Redis-laboron.

ZRANGE redonas la plej malaltan poentaron unue; egalaj poentaroj solviĝas laŭ la ordo de membroj, ne hazarde. ZINCRBY pliigas la poentaron de la elektita membro je unu por la sekva asigno.

Difinu, kion signifas la poentaro

Ĉi tio kalkulas asignojn, inkluzive asignon kies reta peto poste malsukcesas. Ĝi ne mezuras latentan tempon, sukcesajn petojn aŭ nuntempe okazantan laboron. Ripeta elekto de la sola permesata membro restas ebla; la skripto ne rezervas ĝin ekskluzive.

Konservu permesatecon per la sanaj kaj politikaj reguloj de la provizo. Se vi forigas membron kaj poste restarigas ĝin, decidu ĉu konservi ĝian historian nombron. Komenci restarigitan prokurilon je nulo povas koncentri asignojn sur ĝin dum ĝi reatingas.

Politiko de malplej samtempeco bezonas alian vivciklon, inkluzive finiĝon kaj traktadon de forlasitaj taskoj. Ne interpretu ĉi tiun akumulan nombrilon kiel tiun vivciklon.

Rilataj artikoloj