upstash-redis-kv

Par mkurman · zorai

Lire et écrire dans un store clé-valeur compatible Redis via l'API REST d'Upstash. À utiliser lorsqu'il est nécessaire de sauvegarder ou de récupérer des données clé-valeur, d'exploiter les fonctionnalités Redis (mise en cache, compteurs, listes, sets, hashes, sorted sets, etc.) pour l'interaction en cours, ou lorsque l'utilisateur demande explicitement d'utiliser Upstash ou Redis.

npx skills add https://github.com/mkurman/zorai --skill upstash-redis-kv

Magasin de paires clé-valeur Upstash Redis

Interagir avec le magasin de paires clé-valeur compatible Redis d'Upstash en utilisant l'interface REST.

Localisation du script

bun run scripts/upstash-client.ts <command> [args...]

IMPORTANT : Toujours exécuter avec bun run, jamais directement.

Configuration

Variables d'environnement

Le script utilise par défaut ces variables d'environnement :

  • UPSTASH_REDIS_REST_URL - L'URL de l'API REST Upstash
  • UPSTASH_REDIS_REST_TOKEN - Le jeton de l'API REST Upstash

Surcharger les identifiants

Si l'utilisateur fournit des identifiants provenant d'une autre source (contexte de conversation, fichier, etc.), utiliser les drapeaux --url et --token pour surcharger les variables d'environnement :

bun run scripts/upstash-client.ts --url "https://..." --token "AX..." GET mykey

Priorité : Drapeaux en ligne de commande > Variables d'environnement

Référence des commandes

Commandes de chaîne

# Récupérer/Définir
GET <key>
SET <key> <value> [--ex seconds] [--px ms] [--nx] [--xx] [--keepttl] [--get]
SETNX <key> <value>                    # Définir si n'existe pas
SETEX <key> <seconds> <value>          # Définir avec expiration

# Plusieurs clés (paires clé/valeur)
MGET <key1> [key2...]
MSET <key1> <val1> [key2 val2...]
MSETNX <key1> <val1> [key2 val2...]    # Définir tous si aucun n'existe

# Compteurs
INCR <key>
INCRBY <key> <increment>
INCRBYFLOAT <key> <increment>
DECR <key>
DECRBY <key> <decrement>

# Manipulation de chaînes
APPEND <key> <value>
STRLEN <key>
GETRANGE <key> <start> <end>
SETRANGE <key> <offset> <value>

Commandes de hachage

Les hachages stockent des paires champ-valeur. Passer les champs et valeurs comme arguments alternés :

# Définir les champs de hachage (paires champ/valeur)
HSET <key> <field1> <val1> [field2 val2...]
HSETNX <key> <field> <value>           # Définir le champ si n'existe pas

# Récupérer les champs de hachage
HGET <key> <field>
HMGET <key> <field1> [field2...]
HGETALL <key>

# Opérations de hachage
HDEL <key> <field1> [field2...]
HEXISTS <key> <field>
HKEYS <key>
HVALS <key>
HLEN <key>
HINCRBY <key> <field> <increment>
HINCRBYFLOAT <key> <field> <increment>
HSCAN <key> <cursor> [MATCH pattern] [COUNT count]

Exemples :

# Stocker les données utilisateur
bun run scripts/upstash-client.ts HSET user:1 name "John" email "john@example.com" age 30

# Récupérer un seul champ
bun run scripts/upstash-client.ts HGET user:1 name

# Récupérer tous les champs
bun run scripts/upstash-client.ts HGETALL user:1

# Incrémenter un champ numérique
bun run scripts/upstash-client.ts HINCRBY user:1 age 1

Commandes de liste

Les listes sont des collections ordonnées. Les valeurs sont ajoutées/supprimées à gauche (tête) ou à droite (queue) :

# Ajouter des éléments
LPUSH <key> <val1> [val2...]           # Ajouter à la tête
RPUSH <key> <val1> [val2...]           # Ajouter à la queue
LPUSHX <key> <val1> [val2...]          # Ajouter si la liste existe
RPUSHX <key> <val1> [val2...]

# Supprimer des éléments
LPOP <key> [count]
RPOP <key> [count]

# Accéder aux éléments
LRANGE <key> <start> <stop>            # Obtenir une plage (0 = premier, -1 = dernier)
LLEN <key>
LINDEX <key> <index>

# Modifier
LSET <key> <index> <value>
LREM <key> <count> <value>             # Supprimer count occurrences
LTRIM <key> <start> <stop>             # Conserver uniquement la plage
LINSERT <key> <BEFORE|AFTER> <pivot> <value>
LPOS <key> <value>
LMOVE <src> <dst> <LEFT|RIGHT> <LEFT|RIGHT>

Exemples :

# Créer une file de tâches
bun run scripts/upstash-client.ts RPUSH tasks "task1" "task2" "task3"

# Obtenir toutes les tâches
bun run scripts/upstash-client.ts LRANGE tasks 0 -1

# Retirer une tâche de l'avant (file FIFO)
bun run scripts/upstash-client.ts LPOP tasks

# Retirer une tâche de l'arrière (pile LIFO)
bun run scripts/upstash-client.ts RPOP tasks

Commandes d'ensemble

Les ensembles stockent des membres uniques et non ordonnés :

# Ajouter/supprimer des membres
SADD <key> <member1> [member2...]
SREM <key> <member1> [member2...]

# Requête
SMEMBERS <key>
SISMEMBER <key> <member>
SMISMEMBER <key> <member1> [member2...]
SCARD <key>

# Accès aléatoire
SPOP <key> [count]
SRANDMEMBER <key> [count]

# Opérations d'ensemble
SINTER <key1> [key2...]
SINTERSTORE <dest> <key1> [key2...]
SUNION <key1> [key2...]
SUNIONSTORE <dest> <key1> [key2...]
SDIFF <key1> [key2...]
SDIFFSTORE <dest> <key1> [key2...]
SMOVE <src> <dst> <member>
SSCAN <key> <cursor> [MATCH pattern] [COUNT count]

Exemples :

# Ajouter des étiquettes
bun run scripts/upstash-client.ts SADD article:1:tags "javascript" "redis" "nodejs"

# Vérifier l'appartenance
bun run scripts/upstash-client.ts SISMEMBER article:1:tags "javascript"

# Obtenir tous les membres
bun run scripts/upstash-client.ts SMEMBERS article:1:tags

# Trouver les étiquettes communes entre articles
bun run scripts/upstash-client.ts SINTER article:1:tags article:2:tags

Commandes d'ensemble trié

Les ensembles triés stockent des membres avec des scores pour le classement :

# Ajouter des membres (paires score/membre)
ZADD <key> <score1> <member1> [score2 member2...] [--nx] [--xx] [--gt] [--lt] [--ch]

# Supprimer
ZREM <key> <member1> [member2...]
ZREMRANGEBYRANK <key> <start> <stop>
ZREMRANGEBYSCORE <key> <min> <max>

# Scores et rangs
ZSCORE <key> <member>
ZMSCORE <key> <member1> [member2...]
ZRANK <key> <member>                   # Rang (bas à haut)
ZREVRANK <key> <member>                # Rang (haut à bas)
ZINCRBY <key> <increment> <member>

# Requêtes de plage
ZRANGE <key> <start> <stop> [--withscores] [--rev] [--byscore] [--bylex]
ZRANGEBYSCORE <key> <min> <max> [--withscores] [--limit off,count]
ZREVRANGE <key> <start> <stop> [--withscores]
ZREVRANGEBYSCORE <key> <max> <min> [--withscores] [--limit off,count]

# Comptage
ZCARD <key>
ZCOUNT <key> <min> <max>

# Pop
ZPOPMIN <key> [count]
ZPOPMAX <key> [count]

# Opérations d'ensemble
ZINTERSTORE <dest> <numkeys> <key1> [key2...]
ZUNIONSTORE <dest> <numkeys> <key1> [key2...]
ZSCAN <key> <cursor> [MATCH pattern] [COUNT count]

Exemples :

# Créer un classement (paires score membre)
bun run scripts/upstash-client.ts ZADD leaderboard 1000 "player1" 1500 "player2" 1200 "player3"

# Obtenir les 3 premiers avec scores (le plus haut en premier)
bun run scripts/upstash-client.ts ZRANGE leaderboard 0 2 --rev --withscores

# Obtenir le rang du joueur
bun run scripts/upstash-client.ts ZREVRANK leaderboard "player2"

# Incrémenter le score du joueur
bun run scripts/upstash-client.ts ZINCRBY leaderboard 100 "player1"

# Obtenir les joueurs avec des scores entre 1 000 et 1 500
bun run scripts/upstash-client.ts ZRANGEBYSCORE leaderboard 1000 1500 --withscores

Commandes de clé

# Supprimer
DEL <key1> [key2...]
UNLINK <key1> [key2...]                # Suppression asynchrone

# Existence/Type
EXISTS <key1> [key2...]
TYPE <key>

# Expiration
EXPIRE <key> <seconds>
EXPIREAT <key> <timestamp>
PEXPIRE <key> <milliseconds>
PEXPIREAT <key> <timestamp>
TTL <key>
PTTL <key>
PERSIST <key>                          # Supprimer l'expiration

# Renommer
RENAME <key> <newkey>
RENAMENX <key> <newkey>

# Rechercher
KEYS <pattern>                         # À utiliser avec prudence en production
SCAN <cursor> [MATCH pattern] [COUNT count]

# Autre
COPY <src> <dst>
DUMP <key>
TOUCH <key1> [key2...]
RANDOMKEY
OBJECT ENCODING|FREQ|IDLETIME|REFCOUNT <key>

Exemples :

# Définir une clé avec expiration d'1 heure
bun run scripts/upstash-client.ts SET session:abc "data"
bun run scripts/upstash-client.ts EXPIRE session:abc 3600

# Ou en une seule commande
bun run scripts/upstash-client.ts SET session:abc "data" --ex 3600

# Vérifier le TTL
bun run scripts/upstash-client.ts TTL session:abc

# Scanner les clés correspondant au motif
bun run scripts/upstash-client.ts SCAN 0 MATCH "user:*" COUNT 100

Commandes serveur

PING [message]
ECHO <message>
DBSIZE
TIME
INFO [section]
FLUSHDB                                # Supprimer toutes les clés de la DB actuelle (DANGEREUX)
FLUSHALL                               # Supprimer toutes les clés de toutes les DBs (DANGEREUX)

Options de commandes

Options SET

--ex <seconds>     # Expirer en secondes
--px <ms>          # Expirer en millisecondes
--exat <ts>        # Expirer au timestamp Unix (secondes)
--pxat <ts>        # Expirer au timestamp Unix (ms)
--nx               # Définir uniquement si la clé n'existe pas
--xx               # Définir uniquement si la clé existe
--keepttl          # Conserver le TTL existant
--get              # Retourner l'ancienne valeur

Options ZADD

--nx               # Ajouter uniquement les nouveaux membres
--xx               # Mettre à jour uniquement les membres existants
--gt               # Mettre à jour uniquement si le nouveau score > courant
--lt               # Mettre à jour uniquement si le nouveau score < courant
--ch               # Retourner le nombre d'éléments modifiés

Options ZRANGE

--withscores       # Inclure les scores dans la sortie
--byscore          # Plage par score au lieu du rang
--bylex            # Plage par ordre lexicographique
--rev              # Ordre inverse
--limit off,count  # Limiter les résultats (ex. --limit 0,10)

Format de sortie

  • Valeurs de chaîne : Affichées directement
  • null/nil : Affiche (nil)
  • Objets/tableaux : Affichés au format JSON avec indentation

Comportement de confirmation

Par défaut : Demander une confirmation

Avant d'exécuter toute opération destructive (écriture, modification ou suppression), vous DEVEZ demander une confirmation à l'utilisateur. Cela inclut :

Opérations d'écriture :

  • SET, SETNX, SETEX, PSETEX, MSET, MSETNX
  • HSET, HSETNX
  • LPUSH, RPUSH, LPUSHX, RPUSHX, LSET, LINSERT
  • SADD
  • ZADD

Opérations de modification :

  • INCR, INCRBY, INCRBYFLOAT, DECR, DECRBY
  • APPEND, SETRANGE
  • HINCRBY, HINCRBYFLOAT
  • LREM, LTRIM, LMOVE
  • ZINCRBY

Opérations de suppression :

  • DEL, UNLINK
  • HDEL
  • LPOP, RPOP
  • SREM, SPOP, SMOVE
  • ZREM, ZREMRANGEBYRANK, ZREMRANGEBYSCORE, ZPOPMIN, ZPOPMAX
  • FLUSHDB, FLUSHALL (prudence accrue)

Opérations TTL/Renommage :

  • EXPIRE, EXPIREAT, PEXPIRE, PEXPIREAT, PERSIST
  • RENAME, RENAMENX

Exemple d'invite de confirmation :

« Je vais exécuter HSET user:1 avec les champs {name: "John", email: "john@example.com"}. Procéder ? »

Mode YOLO : Ignorer la confirmation

Si l'utilisateur indique qu'il ne souhaite pas être invité à confirmer, respecter cela pour toutes les opérations ultérieures. Les indicateurs incluent :

  • « Mode YOLO »
  • « Ne demande pas de confirmation »
  • « Tu es libre de faire des changements sans demander »
  • « Fais juste »
  • « Pas besoin de confirmer »
  • « Auto-approuver » ou « auto-confirmer »
  • Toute formulation similaire indiquant une approbation générale

Une fois le mode YOLO activé, procéder aux opérations destructives sans demander, mais informer toujours l'utilisateur de ce qui a été fait.

Exemple :

Défini user:1 avec {name: "John", email: "john@example.com"} - effectué.

Gestion des erreurs

Si les identifiants sont manquants ou invalides, le script se terminera avec un message d'erreur. S'assurer que l'utilisateur a configuré soit :

  1. Les variables d'environnement (UPSTASH_REDIS_REST_URL, UPSTASH_REDIS_REST_TOKEN)
  2. Soit fournit les identifiants via les drapeaux --url et --token

Quand utiliser cette compétence

  • L'utilisateur demande explicitement de stocker ou récupérer des données depuis Upstash/Redis
  • Besoin de persister des données entre les conversations ou sessions
  • Implémenter la mise en cache pour les opérations coûteuses
  • Maintenir des compteurs, des limites de débit ou des statistiques
  • Stocker les préférences utilisateur ou les données de session
  • Construire des classements ou des rangs (ensembles triés)
  • Gérer des files d'attente ou des listes de tâches (listes)
  • Étiquetage ou catégorisation (ensembles)
  • Stocker des objets structurés (hachages)
  • Tout scénario nécessitant un stockage de paires clé-valeur rapide

Skills similaires