typescript - Hämta flera Redis-cache-nycklar baserat på mönster med NestJS


För närvarande har jag skapat en NestJS-applikation med en Redis-cache. Jag vill kunna hämta flera nycklar från min Redis-cache genom att använda ett mönster där jag kan få alla nycklar som innehåller en viss sträng.

För närvarande använder jag cache-manager och cache-manager-redis-store som min klient för att kunna ansluta till och komma åt min Redis Cache. Jag har gått igenom dokumentationen för att försöka använda .mget()-funktionen, men jag kan inte lista ut om jag på något sätt kan skicka en sträng och få alla nycklar som innehåller den strängen.

Jag funderar på att jag kanske måste gå över till en annan Redis-klient, men ville bara se om någon hade några andra idéer.

Svar #1

Det finns en egenskap som heter store i cache-manager från vilken du kan få alla nycklar genom att anropa metoden keys().

Detta är ett exempel på redisService

import { Injectable, Inject, CACHE_MANAGER } from '@nestjs/common';
import { Cache } from 'cache-manager';

@Injectable()
export class RedisCacheService {
    constructor(@Inject(CACHE_MANAGER) private readonly cache: Cache) {}

    async getKeys(key: string): Promise<any> {
        return await this.cache.store.keys(key);
    }

    async getValue(key: string): Promise<string> {
        return await this.cache.get(key);
    }

    async save(key: string, value: any, ttl: number): Promise<any> {
        return await this.cache.set(key, value, {
            ttl: ttl,
        });
    }

    async delete(key: string): Promise<void> {
        return await this.cache.del(key);
    }

    async getMultipleKeydata(key: string): Promise<any> {
        const redisKeys = await this.getKeys(key);
        const data: { [key: string]: any } = {};
        for (const key of redisKeys) {
            data[key] = await this.getValue(key);
        }
        return allData;
    }
}

Then kan du använda denna tjänst för att få flera nycklar eller kan få värden på flera nycklar

await this.redisService.getKeys('*' + email + '*');

Du kan också hämta värden för flera nycklar

await this.redisService.getMultipleKeydata('*' + email + '*');

Svar #2

Det finns två sätt du kan uppnå detta

  1. behåll en MÄNGD av nycklar som du vill hämta och gör SMEMBERS. Du kommer dock att behöva manuellt underhålla MÄNGDEN och lägga till och ta bort.

  2. Redisearch låter dig skapa sekundära index kring data för fulltextsökning etc.

Relaterade artiklar