Ditt arbetsflöde körs två gånger. Sedan tre. Plötsligt har Google Sheets dubbla rader, Google Drive har flera kopior av samma dokument och du lägger tid på att lista ut vilken körning som var den “riktiga”. Det är den typen av röra som gör att du slutar lita på din egen automation.
Den här Redis lock-automationen slår hårt mot marketing ops-team, men även byråbyggare och produktteam som kör interna verktyg känner av den. När din automation bara kan köra en instans åt gången stoppar du spammen och du stoppar tyst datakorruption.
Den här guiden visar vad arbetsflödet gör, vilka resultat du kan förvänta dig och hur du kopplar in det i din n8n-setup så att dubbletttriggers inte förstör dina Sheets (eller ditt tålamod).
Så fungerar automationsflödet
Här är hela arbetsflödet som du kommer att sätta upp:
n8n Workflow Template: Redis + Google Sheets: stoppa dubbla körningar
flowchart LR
subgraph sg0["Flow 1"]
direction LR
n19@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If1", pos: "b", h: 48 }
n20@{ icon: "mdi:cog", form: "rounded", label: "Is Workflow Active2", pos: "b", h: 48 }
n21@{ icon: "mdi:location-exit", form: "rounded", label: "Stop and Error1", pos: "b", h: 48 }
n22@{ icon: "mdi:cog", form: "rounded", label: "Set Workflow Finished2", pos: "b", h: 48 }
n23@{ icon: "mdi:cog", form: "rounded", label: "Wait1", pos: "b", h: 48 }
n24@{ icon: "mdi:cog", form: "rounded", label: "Wait2", pos: "b", h: 48 }
n25@{ icon: "mdi:cog", form: "rounded", label: "Wait3", pos: "b", h: 48 }
n26@{ icon: "mdi:cog", form: "rounded", label: "Set Workflow 'started'", pos: "b", h: 48 }
n27@{ icon: "mdi:cog", form: "rounded", label: "Set Workflow 'finishing'", pos: "b", h: 48 }
n28@{ icon: "mdi:cog", form: "rounded", label: "Set Workflow 'loading'", pos: "b", h: 48 }
n19 --> n26
n19 --> n21
n23 --> n28
n24 --> n27
n25 --> n22
n20 --> n19
n28 --> n24
n26 --> n23
n27 --> n25
end
subgraph sg1["When Executed by Another Workflow Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "When Executed by Another Wor..", pos: "b", h: 48 }
n1@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Switch", pos: "b", h: 48 }
n7["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/redis.svg' width='40' height='40' /></div><br/>Get Key"]
n8["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/redis.svg' width='40' height='40' /></div><br/>Set Key"]
n9["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/redis.svg' width='40' height='40' /></div><br/>UnSet Key"]
n10@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set Timeout", pos: "b", h: 48 }
n11@{ icon: "mdi:swap-vertical", form: "rounded", label: "set continue", pos: "b", h: 48 }
n1 --> n7
n1 --> n8
n1 --> n9
n8 --> n11
n9 --> n11
n10 --> n1
n0 --> n10
end
subgraph sg2["Flow 3"]
direction LR
n12@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If", pos: "b", h: 48 }
n13@{ icon: "mdi:cog", form: "rounded", label: "Is Workflow Active1", pos: "b", h: 48 }
n14@{ icon: "mdi:location-exit", form: "rounded", label: "Stop and Error", pos: "b", h: 48 }
n15@{ icon: "mdi:cog", form: "rounded", label: "No Operation, do nothing", pos: "b", h: 48 }
n16@{ icon: "mdi:cog", form: "rounded", label: "Set Workflow Active1", pos: "b", h: 48 }
n17@{ icon: "mdi:cog", form: "rounded", label: "Set Workflow Finished1", pos: "b", h: 48 }
n18@{ icon: "mdi:cog", form: "rounded", label: "Wait", pos: "b", h: 48 }
n12 --> n16
n12 --> n14
n18 --> n17
n13 --> n12
n16 --> n15
n15 --> n18
end
subgraph sg3["Flow 4"]
direction LR
n3@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If2", pos: "b", h: 48 }
n4@{ icon: "mdi:cog", form: "rounded", label: "Is Workflow Active", pos: "b", h: 48 }
n4 --> n3
end
subgraph sg4["Flow 5"]
direction LR
n29@{ icon: "mdi:cog", form: "rounded", label: "Is Workflow Active3", pos: "b", h: 48 }
n30@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Switch1", pos: "b", h: 48 }
n29 --> n30
end
subgraph sg5["Flow 6"]
direction LR
n5@{ icon: "mdi:cog", form: "rounded", label: "Set Workflow Active", pos: "b", h: 48 }
end
subgraph sg6["Flow 7"]
direction LR
n6@{ icon: "mdi:cog", form: "rounded", label: "Set Workflow Finished", pos: "b", h: 48 }
end
subgraph sg7["When clicking ‘Test workflow’ Flow"]
direction LR
n2@{ icon: "mdi:play-circle", form: "rounded", label: "When clicking ‘Test workflow’", pos: "b", h: 48 }
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n0,n2 trigger
class n19,n1,n12,n3,n30 decision
class n7,n8,n9 database
classDef customIcon fill:none,stroke:none
class n7,n8,n9 customIcon
Varför det här spelar roll: dubblettkörningar som spammar Sheets och Drive
De flesta problem med “dubblettkörningar” ser inte dramatiska ut i början. Det är ett webhook-återförsök, en otålig användare som klickar två gånger eller två scheman som överlappar med några minuter. Sedan kör ditt långa jobb parallellt, båda instanserna skriver till Google Sheets, båda skapar filer i Google Drive, och nu har du dubbla poster, totalsummor som inte stämmer och trasiga nedströmsrapporter. Ännu värre: Google-API:er kan börja rate-limita dig, så felen känns slumpmässiga. Den mentala belastningen är påtaglig eftersom du inte kan avgöra om automationsflödet fallerar… eller bara krockar med sig självt.
Det eskalerar snabbt. Här är hur det brukar fallera i riktiga team.
- Du får lägga tid på att rensa dubblettrader i Google Sheets efter varje intensiv dag.
- Parallella körningar kan skapa flera Google Docs eller Drive-mappar, och du märker det först när en kund frågar vilken länk som är korrekt.
- Rate limits dyker upp vid sämsta möjliga tillfälle eftersom överlappande anrop dubblerar din API-trafik.
- Återförsök och omkörningar blir riskabla, eftersom du aldrig vet vad som redan har skrivit data.
Vad du bygger: ett Redis-lås + statusgate för långkörande jobb
Det här arbetsflödet lägger till en enkel regel: “bara en körning åt gången” för vilket långkörande jobb som helst i n8n. Det startar när ett annat arbetsflöde anropar det (via en Execute Workflow Trigger) och skickar in en åtgärd som get, set eller unset, samt en unik nyckel för jobbet. Om nyckeln redan är låst i Redis stoppar arbetsflödet tidigt och returnerar ett tydligt fel, i stället för att låta en andra instans kollidera med Google Sheets eller Drive. Om inget lås finns sätter det ett lås med en time-to-live (standard är cirka 10 minuter), uppdaterar lättlästa statuslägen som “working” och “finishing”, och tar sedan bort låset i slutet så att nästa körning kan starta rent.
Flödet börjar med routing (via en Switch) för att avgöra om du ska kontrollera status, sätta låset eller ta bort det. Redis fungerar som single source of truth för “upptagen” kontra “ledig”, medan Wait-noder representerar den långsamma delen av jobbet som du ersätter med ditt riktiga arbete. Till sist svarar arbetsflödet tydligt, så att uppströms arbetsflöden kan hantera “upptagen” på ett förutsägbart sätt.
Det här bygger du
| Vad som automatiseras | Vad du uppnår |
|---|---|
|
|
Förväntade resultat
Säg att ditt huvudflöde kör en tung synk som skapar ett Google Doc, lägger det i en Drive-mapp och skriver en sammanfattningsrad till Google Sheets. Det är kanske 10 minuters arbete från start till mål. Utan lås kan två triggers nära varandra dubbla API-anropen och du lägger cirka 30 minuter i veckan på att städa dubbletter och skicka länkar igen. Med det här arbetsflödet sätter den första körningen Redis-låset på sekunder, den andra körningen avslutas direkt med status “upptagen”, och du håller dina Sheets och Drive prydliga med i princip ingen manuell efterstädning.
Innan du börjar
- n8n-instans (prova n8n Cloud gratis)
- Alternativ för self-hosting om du föredrar det (Hostinger fungerar bra)
- Redis för att lagra lås- och statusnyckeln.
- Google Sheets för att validera utfallet “inga dubbla skrivningar”.
- Redis-inloggningsuppgifter (skapa dem i n8n Credentials).
Kunskapsnivå: Nybörjare. Du kopplar främst upp credentials och väljer en jobbnyckel och timeout.
Vill du att någon bygger detta åt dig? Prata med en automationsexpert (gratis 15-minuters konsultation).
Steg för steg
Ett föräldraflöde triggar körningen. Den här mallen är byggd för att anropas av ett annat n8n-arbetsflöde via Execute Workflow. Föräldern skickar action (get, set, unset), en key (din jobbidentifierare) och valfritt en timeout i sekunder.
Arbetsflödet routar baserat på action. En Switch-nod skickar exekveringen nedför rätt väg: hämta aktuell status, skriva lås/status-nyckeln eller ta bort den. Det betyder att du kan återanvända samma arbetsflöde både som grindvakt och som statuskontroll.
Redis avgör om jobbet kan fortsätta. Arbetsflödet läser och skriver en Redis-nyckel med namn som process_status_<key> med en TTL (standard cirka 600 sekunder). Om nyckeln redan finns stoppar en If-nod körningen tidigt med Stop and Error, vilket skyddar Google Sheets, Google Drive och allt annat nedströms.
Statusuppdateringar sker under den långsamma delen. Wait-noder står in för dina långkörande steg. Mellan väntetiderna kan arbetsflödet uppdatera statusflaggor som “loading” eller “finishing”, så att ett annat arbetsflöde kan polla med action=get och visa progress.
Du kan enkelt justera statusvärdena så att de matchar din process (till exempel “syncar sheets” eller “skapar docs”) utifrån dina behov. Se den fullständiga implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementation
Steg 1: konfigurera triggern för underworkflow
Det här workflowet är utformat för att anropas av andra workflows och använder en trigger för underworkflow med definierade indata för kontroll av samtidighet.
- Lägg till noden Sub-Workflow Trigger Inbound som er startpunkt.
- Ställ in Workflow Inputs så att den inkluderar
action,value,keyochtimeoutså att de matchar triggerns indata. - Behåll valfritt Manual Test Launcher för lokal testning under uppsättning (inte ansluten till produktionsflödet).
Steg 2: konfigurera routning av åtgärd och tilldelning av timeout
Workflowet tilldelar en standard-timeout och routar exekveringen utifrån inkommande action (get/set/unset).
- I Assign Timeout ställer ni in Include Other Fields till
trueoch lägger till en tilldelning för timeout med värdet600. - Koppla Assign Timeout till Route by Action.
- I Route by Action konfigurerar ni regler så att leftValue är
{{ $json.action }}och routar till utgångarnaget,setrespektiveunset.
Steg 3: anslut Redis för samtidighetsstatus
Workflowet använder Redis för att lagra och läsa processstatus per nyckel.
- Konfigurera Fetch Redis Key med Operation satt till
getoch Key satt till=process_status_{{ $json.key }}. - Inloggningsuppgifter krävs: Anslut era Redis-inloggningsuppgifter i Fetch Redis Key.
- Konfigurera Write Redis Key med Operation satt till
set, Key satt till=process_status_{{ $json.key }}, Value satt till={{ $json.value }}och TTL satt till={{ $json.timeout }}. - Inloggningsuppgifter krävs: Anslut era Redis-inloggningsuppgifter i Write Redis Key.
- Konfigurera Remove Redis Key med Operation satt till
deleteoch Key satt till=process_status_{{ $json.key }}. - Inloggningsuppgifter krävs: Anslut era Redis-inloggningsuppgifter i Remove Redis Key.
- Koppla Write Redis Key och Remove Redis Key till Mark Continue för att returnera en success-flagga.
key-värde för att undvika kollisioner.Steg 4: konfigurera anrop till underworkflow och statuskontroller
Det här workflowet använder flera executeWorkflow-noder för att hantera läsning och skrivning av status. Konfigurera dem utifrån funktion snarare än individuellt.
- För alla Run Sub-Workflow Config-noder (12 totalt) väljer ni mål-workflow i workflowId och behåller input mapping-schemat enligt definition.
- Säkerställ att “get”-operationerna använder indata som
key: some_workflow_keyochaction: get(till exempel i Run Sub-Workflow Config 1, Run Sub-Workflow Config 4, Run Sub-Workflow Config 7, Run Sub-Workflow Config 12). - Säkerställ att “set”-operationerna använder indata som
action: setochvalue: working,started,loadingellerfinishing(till exempel Run Sub-Workflow Config 2, Run Sub-Workflow Config 5, Run Sub-Workflow Config 9, Run Sub-Workflow Config 10, Run Sub-Workflow Config 11). - Säkerställ att “unset”-operationerna använder indata som
action: unset(till exempel Run Sub-Workflow Config 3, Run Sub-Workflow Config 6, Run Sub-Workflow Config 8). - Koppla statuskontroller: Run Sub-Workflow Config 1 → Check Output Empty A, Run Sub-Workflow Config 4 → Check Output Empty B och Run Sub-Workflow Config 7 → Check Output Empty C.
Steg 5: lägg till fördröjningar och statusroutning
Fördröjningsnoder och statusroutning säkerställer väntelägen och statusövergångar.
- Koppla No-Op Placeholder till Delay Step A och Delay Step A till Run Sub-Workflow Config 6.
- Koppla Run Sub-Workflow Config 9 → Delay Step B → Run Sub-Workflow Config 11 → Delay Step C → Run Sub-Workflow Config 10 → Delay Step D → Run Sub-Workflow Config 8.
- Koppla Run Sub-Workflow Config 12 till Route by Status och ställ in regler för
started,loadingochfinishedmed{{ $json.output }}.
started, loading eller finished, routas den till fallback-utgången extra i Route by Status.Steg 6: lägg till felhantering
Workflowet blockerar samtidiga körningar genom att stoppa med ett fel när en process redan körs.
- I Check Output Empty B kopplar ni false-grenen till Abort With Error A.
- I Check Output Empty C kopplar ni false-grenen till Abort With Error B.
- Ställ in Error Message i både Abort With Error A och Abort With Error B till
Already Executing.
Steg 7: testa och aktivera ert workflow
Verifiera att samtidighetsvakten läser och skriver Redis-nycklar korrekt innan ni går live.
- Använd Manual Test Launcher eller anropa Sub-Workflow Trigger Inbound från ett annat workflow med exempelindata (t.ex.
action: get,key: some_workflow_key). - Bekräfta att en lyckad körning sätter Mark Continue med
ok: trueoch att Redis-nycklar skapas/tas bort som förväntat. - Trigga en andra körning med samma nyckel och bekräfta att den stoppar med
Already Executingvia Abort With Error A eller Abort With Error B. - När testerna passerar, slå om workflowet till Active för användning i produktion.
Felsökningstips
- Redis-credentials kan löpa ut eller peka på fel databasindex. Om saker skapar fel, kontrollera Redis-credential-inställningarna i n8n först, och bekräfta sedan att nyckeln skrivs där du förväntar dig.
- Om du använder Wait-noder eller extern bearbetning varierar körtider. Höj TTL/timeout så att låset inte löper ut mitt i jobbet och släpper igenom en andra körning.
- Stop and Error är bra för tydlighet, men kan se ut som ett “fel” i övervakning. Om teamet vill ha notifieringar, byt felvägen mot Slack/e-post och returnera ett vänligt svar som “upptagen, försök igen”.
Snabba svar
Cirka 30 minuter om Redis redan går att nå från n8n.
Nej. Du konfigurerar credentials, ett nyckelnamn och din föredragna timeout. Logiken är redan byggd med standardnoder i n8n.
Ja. n8n har ett gratis self-hosted-alternativ och en gratis testperiod på n8n Cloud. Cloud-planer börjar på 20 USD/månad för högre volym. Du behöver också räkna in kostnaden för Redis-hosting (ofta 5–20 USD/månad beroende på leverantör och krav på drifttid).
Två alternativ: n8n Cloud (hanterat, enklast att komma igång) eller self-hosting på en VPS. För self-hosting är Hostinger VPS prisvärd och hanterar n8n bra. Self-hosting ger obegränsade exekveringar men kräver grundläggande serveradministration.
Ja, och det bör du. De flesta börjar med att ändra TTL i steget “Assign Timeout” / timeout set så att den matchar verklig jobblängd, och sedan byta namn på progressvärdena som skrivs till Redis (“working”, “loading”, “finishing”) så att en status-sida blir begriplig. Du kan också ersätta Stop and Error-noderna med ett Slack-meddelande eller ett “försök igen efter”-svar, beroende på hur artig du vill vara mot anropare. Om du behöver separata lås för separata uppgifter ändrar du bara nyckelnamngivningsmönstret så att varje jobb får sin egen Redis-nyckel.
Oftast beror det på att Redis host/port, lösenord eller TLS-inställning är fel i n8n-credentials. Det kan också vara nätverksåtkomst (din Redis-server tillåter bara lokal trafik) eller fel databasindex, vilket gör att det ser ut som att nycklar “inte sparas”. Kontrollera anslutningen från din n8n-host först och bekräfta sedan att arbetsflödet kan läsa tillbaka nyckeln som det precis skrev.
Mycket, eftersom varje anrop i princip bara är en snabb Redis-läsning/-skrivning plus din jobbtid. På n8n Cloud begränsas du främst av planens månatliga exekveringar, och på self-hostad n8n av serverkapaciteten. I praktiken är själva låskontrollen nästan omedelbar, så volymfrågan blir: hur länge kör ditt långjobb, och hur många unika nycklar du använder.
Ofta, ja. n8n gör mönstret enkelt eftersom du kan förgrena, stoppa körningar tydligt och self-hosta för hög volym utan att betala per liten delsteg. Zapier och Make kan hantera deduplicering i enkla fall, men riktig kontroll för “bara en körning åt gången” är svårare när du behöver statuskontroller, egna nycklar och förutsägbar felhantering. Om ditt flöde hanterar Google Sheets, Google Drive och HTTP-anrop i samma körning är den extra kontrollen värd det. Prata med en automationsexpert om du vill ha hjälp att välja det enklaste alternativet för din stack.
Sätt låset en gång, och överlappande körningar slutar vara ditt problem. Dina Google Sheets förblir pålitliga, din Drive håller sig prydlig och dina automationer känns stabila igen.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.