21. juni 2010 - 01:31Der er
16 kommentarer og 1 løsning
Opdater MySQL regelmæssigt - ASP
Hej Eksperter.
Jeg sidder og er stødt ind i et bump på vejen.
Jeg skal til, at lave et råstof system til et browserspil hvor en by fx udvinder 2400 træ pr. time.
Jeg vil ikke have det sådan, at byen får 2400 træ stukket ind på kontoen hver time - men derimod, at det bliver opdateret hen af vejen så der bl.a. også kan købes for de råstoffer der kommer løbende ind på kontoen..
Men.. Hvis vi nu siger, at der kommer 2400 træ pr. time. Så er det jo 2400/60 pr. minut = 40 og det er jo 40/60 pr. sekund = 0,66
Derfor skal denne bruger jo faktisk have 0,66 stykker træ hvert sekund hele døgnet rundt - også selvom han ikke er online..
Det første forstår jeg udmærket godt begrundelsen bag og det hele :)
- Dog.. Hvad mener du med et "ikke-web-app task" og web requests? Jeg er næsten sikker på jeg ved hvad du mener - men kender ikke begreberne som du omtaler dem.
"ikke-web-app task" et eller andet program der kører og som ikke er en web app. Kan være et program som køres af cron / Windows Scheduler eller et permanent kørende process (daemon / Windows Service).
"web requests" de almindelige requests som kommer til web app.
web request = en eller anden requester en ASP side fra dit site
og ideen er at du ikke nødvendigvis laver den opdatering hver time, men at du sørger for at alle de opdateringer der skal udføres er udført inden data skal vises
Vil det ikke slide meget hårdt webserveren hvis vi nu siger, at 500 spiller spillet dagligt og der er 2000 byer i hele verden hvori alle råstoffer opdatere konstant inde i databasen?
Ikke nødvendigvis. Hvis du f.eks. opdaterer hver time, så skal der udføres 24 opdateringer på et døgn. Uafhængigt af hvor mange der spiller.
Hvis du lader en request trigge opdatering, så skal der: - laves 0-24 opdateringer per døgn uanset antal spillere - laves en check af om der er behov for en opdatering for hver request (men den kan caches i Application objekttet så du ikke bhøver ramme databasen hver gang)
Du kunne jo også lave det sådan at du laver en funktion i dit spil, der viser hvor meget træ man har, og det så er den du kalder hver gang du viser mængden af træ
Når så du henter antalTræ fra databasen kan du samtidig hente TræOpdateret feltet, og se hvornår brugeren sidst er tilskrevet sit træ..
hvis det er 18 dage siden, så er 18 dages sekunder 1555200 * 0,66 = 1026432, som lægges til det antal træ du får fra databasen, og så updater du antalTræ med det tal.
Næste gang antal træ udskrives, vil det måske være 2 minutter siden .. og så kører funktionen igen blot med 120 * 0,66 osv.. på den måde bruger du kun energi på at opdatere for de brugere der er relevat.. Og du slipper for noget der skal kører hele tiden
Arne_v - Så får man jo også kun træ 1 gang i timen, men ville jo gerne have det sådan, at man fik træ løbende..
Therealyoda - hm, det kan godt laves (tænker du på, at det skal laves med timestamps?), men giver det så ikke en opdatering af databasen hver gang brugeren er online og for hver gang han skifter side? - Hvis man så ser på det, så hvis han har 100 stykker træ når han logger af, og først efter 18 dage logger på igen hvor han i mellemtiden er blevet angrebet. Så har angriberen ikke kunnet erobre det træ han burde have haft da brugeren først får råstofferne den dag han logger på igen? Hvis jeg har forstået det rigtigt.
Det kommer vel an på hvordan man laver det ? .. men jo .. der kommer jo en update hver gang brugeren skifter side.. med mindre du lægger en tidsbegrænsning ind i funktionen .. hvis du vil spare den update ..
du skal jo bare lave en funktion som henter brugerens træ..
hvis du har træTid og træAntal i databasen
så : Function brugerensTrae(brugerid) select træTid og træAntal fra database antalSek = dateDiff("S",træTid,now()) brugerensTrae= (antalSek*0,66)+træAntal if antalSek > 600 then database update træTid og træAntal end if end Function
På den måde kan du også bruge funktionen når brugeren er offline.. til at se hvor meget træ han har.. eks når du skal udregne hvor meget de andre må snuppe fra ham .. og når han er online laver han kun en db update hvert 10 minut..
Øhm.. Jeg har lige prøvet, at bruge cdbl() - men den afrunder da ikke? Jeg prøvede med: cdbl(5464.564) for, at teste afrundingen - men det giver jo bare 5464.564?? Den skulle gerne gå ind og sige:
Hvis det er >= 5464.5 så runder den op og hvis det er < 5464.5 så runder den ned
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.