Merged in fix/redis-delete (pull request #3271)

feat(redis): include git hash when deleting without fuzzy

* feat(redis): include git hash when deleting without fuzzy

* Refactor


Approved-by: Joakim Jäderberg
This commit is contained in:
Linus Flood
2025-12-02 07:02:52 +00:00
parent 8f7e4b8d06
commit b1ccabb0b6
4 changed files with 40 additions and 8 deletions

View File

@@ -49,7 +49,7 @@ export async function POST() {
revalidateManuallyLogger.info(`Tag: ${tag}`) revalidateManuallyLogger.info(`Tag: ${tag}`)
revalidateTag(tag) revalidateTag(tag)
cacheClient.deleteKey(tag, { fuzzy: false }) cacheClient.deleteKey(tag, { fuzzy: false, includeGitHashInKey: true })
return Response.json({ revalidated: true, now: Date.now() }) return Response.json({ revalidated: true, now: Date.now() })
} catch (error) { } catch (error) {

View File

@@ -98,7 +98,10 @@ export type DataCache = {
* @param fuzzy If true, does a wildcard delete. *key* * @param fuzzy If true, does a wildcard delete. *key*
* @returns * @returns
*/ */
deleteKey: (key: string, opts?: { fuzzy?: boolean }) => Promise<void> deleteKey: (
key: string,
opts?: { fuzzy?: boolean; includeGitHashInKey?: boolean }
) => Promise<void>
/** /**
* Deletes a key from the cache * Deletes a key from the cache
@@ -106,5 +109,8 @@ export type DataCache = {
* @param fuzzy If true, does a wildcard delete. *key* * @param fuzzy If true, does a wildcard delete. *key*
* @returns * @returns
*/ */
deleteKeys: (keys: string[], opts?: { fuzzy?: boolean }) => Promise<void> deleteKeys: (
keys: string[],
opts?: { fuzzy?: boolean; includeGitHashInKey?: boolean }
) => Promise<void>
} }

View File

@@ -4,11 +4,24 @@ import { env } from "../../env/server"
import { safeTry } from "../../utils/safeTry" import { safeTry } from "../../utils/safeTry"
import { cacheLogger } from "../logger" import { cacheLogger } from "../logger"
import { getCacheEndpoint } from "./endpoints" import { getCacheEndpoint } from "./endpoints"
import { generateCacheKey } from "./generateCacheKey"
const API_KEY = env.REDIS_API_KEY ?? "" const API_KEY = env.REDIS_API_KEY ?? ""
export async function deleteKey(key: string, opts?: { fuzzy?: boolean }) { export async function deleteKey(
key: string,
opts?: { fuzzy?: boolean; includeGitHashInKey?: boolean }
) {
const perf = performance.now() const perf = performance.now()
const endpoint = getCacheEndpoint(key)
let cacheKey: string | undefined = key
if (opts?.includeGitHashInKey) {
cacheKey = generateCacheKey(key, {
includeGitHashInKey: true,
})
}
const endpoint = getCacheEndpoint(cacheKey)
if (opts?.fuzzy) { if (opts?.fuzzy) {
endpoint.searchParams.set("fuzzy", "true") endpoint.searchParams.set("fuzzy", "true")
@@ -29,7 +42,7 @@ export async function deleteKey(key: string, opts?: { fuzzy?: boolean }) {
if (response?.status !== 404) { if (response?.status !== 404) {
Sentry.captureException(error ?? new Error("Unable to DELETE cachekey"), { Sentry.captureException(error ?? new Error("Unable to DELETE cachekey"), {
extra: { extra: {
cacheKey: key, cacheKey: cacheKey,
statusCode: response?.status, statusCode: response?.status,
statusText: response?.statusText, statusText: response?.statusText,
}, },

View File

@@ -4,12 +4,25 @@ import { env } from "../../env/server"
import { safeTry } from "../../utils/safeTry" import { safeTry } from "../../utils/safeTry"
import { cacheLogger } from "../logger" import { cacheLogger } from "../logger"
import { getDeleteMultipleKeysEndpoint } from "./endpoints" import { getDeleteMultipleKeysEndpoint } from "./endpoints"
import { generateCacheKey } from "./generateCacheKey"
const API_KEY = env.REDIS_API_KEY ?? "" const API_KEY = env.REDIS_API_KEY ?? ""
export async function deleteKeys(keys: string[], opts?: { fuzzy?: boolean }) { export async function deleteKeys(
keys: string[],
opts?: { fuzzy?: boolean; includeGitHashInKey?: boolean }
) {
const perf = performance.now() const perf = performance.now()
const endpoint = getDeleteMultipleKeysEndpoint() const endpoint = getDeleteMultipleKeysEndpoint()
let cacheKeys: string[] = keys
if (opts?.includeGitHashInKey) {
cacheKeys = keys.map((key) =>
generateCacheKey(key, {
includeGitHashInKey: true,
})
)
}
const [response, error] = await safeTry( const [response, error] = await safeTry(
fetch(endpoint, { fetch(endpoint, {
method: "DELETE", method: "DELETE",
@@ -18,7 +31,7 @@ export async function deleteKeys(keys: string[], opts?: { fuzzy?: boolean }) {
"Content-Type": "application/json", "Content-Type": "application/json",
"x-api-key": API_KEY, "x-api-key": API_KEY,
}, },
body: JSON.stringify({ keys, fuzzy: opts?.fuzzy ?? false }), body: JSON.stringify({ keys: cacheKeys, fuzzy: opts?.fuzzy ?? false }),
signal: AbortSignal.timeout(10_000), signal: AbortSignal.timeout(10_000),
}) })
) )