Ga naar inhoud

Redis

Redis is een van de populairste in-memory data structuur opslagplaatsen die vaak gebruikt worden als een cache of message broker.

Deze bibliotheek is een integratie tussen Vapor en RediStack, wat de onderliggende driver is die communiceert met Redis.

Note

De meeste mogelijkheden van Redis worden geleverd door RediStack. We raden ten zeerste aan om vertrouwd te zijn met de documentatie ervan.

Waar nodig zijn links opgenomen.

Package

De eerste stap om Redis te gebruiken is het toevoegen als een dependency aan je project in je Swift package manifest.

Dit voorbeeld is voor een bestaand pakket. Voor hulp bij het starten van een nieuw project, zie de hoofdgids Getting Started.

dependencies: [
    // ...
    .package(url: "https://github.com/vapor/redis.git", from: "4.0.0")
]
// ...
targets: [
    .target(name: "App", dependencies: [
        // ...
        .product(name: "Redis", package: "redis")
    ])
]

Configuratie

Vapor gebruikt een pooling strategie voor RedisConnection instanties, en er zijn verschillende opties om zowel individuele verbindingen als de pools zelf te configureren.

Het absolute minimum dat nodig is voor het configureren van Redis is het opgeven van een URL om verbinding mee te maken:

let app = Application()

app.redis.configuration = try RedisConfiguration(hostname: "localhost")

Redis Configuratie

API Documentatie: RedisConfiguration

serverAddresses

Als u meerdere Redis eindpunten heeft, zoals een cluster van Redis instanties, dan kunt u beter een [SocketAddress] verzameling maken om in plaats daarvan de initializer mee te geven.

De meest gebruikelijke manier om een SocketAddress aan te maken is met de makeAddressResolvingHost(_:port:) statische methode.

let serverAddresses: [SocketAddress] = [
  try .makeAddressResolvingHost("localhost", port: RedisConnection.Configuration.defaultPort)
]

Voor een enkel Redis endpoint, kan het makkelijker zijn om met de convenience initializers te werken, omdat die het SocketAddress voor je aanmaken:

wachtwoord

Als uw Redis instance beveiligd is met een wachtwoord, moet u dit opgeven als password argument.

Elke verbinding die wordt gemaakt, zal worden geauthenticeerd met het wachtwoord.

database

Dit is de database index die u wenst te selecteren wanneer elke verbinding wordt gemaakt.

Dit bespaart u het SELECT commando zelf naar Redis te moeten sturen.

Waarschuwing

De database selectie wordt niet bijgehouden. Wees voorzichtig met zelfstandig versturen van het SELECT commando.

Connection Pool Opties

API Documentatie: RedisConfiguration.PoolOptions

Note

Alleen de opties die het meest worden gewijzigd worden hier uitgelicht. Voor alle opties, raadpleeg de API documentatie.

minimumConnectionCount

Dit is de waarde om in te stellen hoeveel verbindingen je wilt dat elke pool te allen tijde onderhoudt.

Als de waarde 0 is, zullen verbindingen die om welke reden dan ook verloren gaan, niet opnieuw worden aangemaakt totdat ze nodig zijn.

Dit staat bekend als een "koude start" verbinding, en heeft wel enige overhead ten opzichte van het handhaven van een minimum aantal verbindingen.

maximumConnectionCount

Deze optie bepaalt het gedrag van hoe het maximum aantal verbindingen wordt bijgehouden.

Zie ook

Raadpleeg de RedisConnectionPoolSize API om te weten welke mogelijkheden beschikbaar zijn.

Een commando versturen

Je kunt commando's sturen met de .redis eigenschap op elke Application of Request instantie, die je toegang geeft tot een RedisClient.

Elke RedisClient heeft verschillende extensies voor alle verschillende Redis commando's.

let value = try app.redis.get("my_key", as: String.self).wait()
print(value)
// Optional("my_value")

// of

let value = try await app.redis.get("my_key", as: String.self)
print(value)
// Optional("my_value")

Niet ondersteunde commando's

Als RediStack een commando met een extensiemethode niet ondersteunt, kunt u het nog steeds handmatig verzenden.

// elke waarde na het commando is het positionele argument dat Redis verwacht
try app.redis.send(command: "PING", with: ["hello"])
    .map {
        print($0)
    }
    .wait()
// "hello"

// of

let res = try await app.redis.send(command: "PING", with: ["hello"])
print(res)
// "hello"

Pub/Sub Mode

Redis ondersteunt de mogelijkheid om een "Pub/Sub" modus in te schakelen waarbij een verbinding kan luisteren naar specifieke "kanalen" en specifieke afsluitingen kan uitvoeren wanneer de geabonneerde kanalen een "bericht" publiceren (een of andere gegevenswaarde).

Er is een bepaalde levenscyclus voor een abonnement:

  1. subscribe: eenmaal aangeroepen wanneer het abonnement voor het eerst start
  2. message: 0+ keer aangeroepen als berichten worden gepubliceerd in de geabonneerde kanalen
  3. unsubscribe: eenmaal aangeroepen wanneer het abonnement eindigt, hetzij door een verzoek, hetzij doordat de verbinding wordt verbroken

Wanneer je een abonnement aanmaakt, moet je minstens een messageReceiver voorzien om alle berichten te behandelen die gepubliceerd worden door het geabonneerde kanaal.

U kunt optioneel een RedisSubscriptionChangeHandler opgeven voor onSubscribe en onUnsubscribe om hun respectievelijke lifecycle events af te handelen.

// creëert 2 abonnementen, een voor elk gegeven kanaal
app.redis.subscribe
  to: "channel_1", "channel_2",
  messageReceiver: { channel, message in
    switch channel {
    case "channel_1": // doe iets met de boodschap
    default: break
    }
  },
  onUnsubscribe: { channel, subscriptionCount in
    print("unsubscribed from \(channel)")
    print("subscriptions remaining: \(subscriptionCount)")
  }