zilmate 1.8.0 → 1.8.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/copywriting/SKILL.md +252 -0
- package/.agents/skills/copywriting/evals/evals.json +111 -0
- package/.agents/skills/copywriting/references/copy-frameworks.md +344 -0
- package/.agents/skills/copywriting/references/natural-transitions.md +272 -0
- package/.agents/skills/firecrawl-deep-research/SKILL.md +108 -0
- package/.agents/skills/shadcn/SKILL.md +267 -0
- package/.agents/skills/shadcn/agents/openai.yml +5 -0
- package/.agents/skills/shadcn/assets/shadcn-small.png +0 -0
- package/.agents/skills/shadcn/assets/shadcn.png +0 -0
- package/.agents/skills/shadcn/cli.md +290 -0
- package/.agents/skills/shadcn/customization.md +209 -0
- package/.agents/skills/shadcn/evals/evals.json +47 -0
- package/.agents/skills/shadcn/mcp.md +105 -0
- package/.agents/skills/shadcn/registry.md +277 -0
- package/.agents/skills/shadcn/rules/base-vs-radix.md +306 -0
- package/.agents/skills/shadcn/rules/composition.md +195 -0
- package/.agents/skills/shadcn/rules/forms.md +192 -0
- package/.agents/skills/shadcn/rules/icons.md +101 -0
- package/.agents/skills/shadcn/rules/styling.md +162 -0
- package/.agents/skills/tavily-research/SKILL.md +100 -0
- package/.agents/skills/upstash/SKILL.md +48 -0
- package/.agents/skills/upstash/upstash-box-js/overview.md +243 -0
- package/.agents/skills/upstash/upstash-box-py/overview.md +275 -0
- package/.agents/skills/upstash/upstash-cli/overview.md +138 -0
- package/.agents/skills/upstash/upstash-qstash-js/advanced/callbacks.md +147 -0
- package/.agents/skills/upstash/upstash-qstash-js/advanced/deduplication.md +86 -0
- package/.agents/skills/upstash/upstash-qstash-js/advanced/dlq.md +164 -0
- package/.agents/skills/upstash/upstash-qstash-js/advanced/multi-region/summary.md +388 -0
- package/.agents/skills/upstash/upstash-qstash-js/advanced/multi-region/verify-multi-region-setup.ts +388 -0
- package/.agents/skills/upstash/upstash-qstash-js/fundamentals/local-development.md +106 -0
- package/.agents/skills/upstash/upstash-qstash-js/fundamentals/publishing-messages.md +144 -0
- package/.agents/skills/upstash/upstash-qstash-js/fundamentals/queues-and-flow-control.md +148 -0
- package/.agents/skills/upstash/upstash-qstash-js/fundamentals/schedules.md +177 -0
- package/.agents/skills/upstash/upstash-qstash-js/fundamentals/url-groups.md +127 -0
- package/.agents/skills/upstash/upstash-qstash-js/overview.md +81 -0
- package/.agents/skills/upstash/upstash-qstash-js/verification/platform-specific/nextjs.md +171 -0
- package/.agents/skills/upstash/upstash-qstash-js/verification/receiver.md +213 -0
- package/.agents/skills/upstash/upstash-ratelimit-js/algorithms.md +84 -0
- package/.agents/skills/upstash/upstash-ratelimit-js/features.md +117 -0
- package/.agents/skills/upstash/upstash-ratelimit-js/methods-getting-started.md +77 -0
- package/.agents/skills/upstash/upstash-ratelimit-js/overview.md +26 -0
- package/.agents/skills/upstash/upstash-ratelimit-js/pricing-cost.md +146 -0
- package/.agents/skills/upstash/upstash-ratelimit-js/traffic-protection.md +77 -0
- package/.agents/skills/upstash/upstash-redis-js/advanced-features/auto-pipeline.md +49 -0
- package/.agents/skills/upstash/upstash-redis-js/advanced-features/pipeline-and-transactions.md +42 -0
- package/.agents/skills/upstash/upstash-redis-js/advanced-features/scripting.md +124 -0
- package/.agents/skills/upstash/upstash-redis-js/data-structures/hashes.md +71 -0
- package/.agents/skills/upstash/upstash-redis-js/data-structures/json.md +133 -0
- package/.agents/skills/upstash/upstash-redis-js/data-structures/lists.md +72 -0
- package/.agents/skills/upstash/upstash-redis-js/data-structures/sets.md +90 -0
- package/.agents/skills/upstash/upstash-redis-js/data-structures/sorted-sets.md +126 -0
- package/.agents/skills/upstash/upstash-redis-js/data-structures/streams.md +196 -0
- package/.agents/skills/upstash/upstash-redis-js/data-structures/strings.md +73 -0
- package/.agents/skills/upstash/upstash-redis-js/migrations/from-ioredis.md +163 -0
- package/.agents/skills/upstash/upstash-redis-js/migrations/from-redis-node.md +205 -0
- package/.agents/skills/upstash/upstash-redis-js/overview.md +183 -0
- package/.agents/skills/upstash/upstash-redis-js/patterns/caching.md +58 -0
- package/.agents/skills/upstash/upstash-redis-js/patterns/distributed-locks.md +130 -0
- package/.agents/skills/upstash/upstash-redis-js/patterns/leaderboard.md +134 -0
- package/.agents/skills/upstash/upstash-redis-js/patterns/rate-limiting.md +187 -0
- package/.agents/skills/upstash/upstash-redis-js/patterns/session-management.md +217 -0
- package/.agents/skills/upstash/upstash-redis-js/performance/batching-operations.md +76 -0
- package/.agents/skills/upstash/upstash-redis-js/performance/data-serialization.md +134 -0
- package/.agents/skills/upstash/upstash-redis-js/performance/error-handling.md +118 -0
- package/.agents/skills/upstash/upstash-redis-js/performance/pipeline-optimization.md +105 -0
- package/.agents/skills/upstash/upstash-redis-js/performance/redis-replicas.md +14 -0
- package/.agents/skills/upstash/upstash-redis-js/performance/ttl-expiration.md +32 -0
- package/.agents/skills/upstash/upstash-redis-js/search/adapters.md +99 -0
- package/.agents/skills/upstash/upstash-redis-js/search/commands/aggregating.md +234 -0
- package/.agents/skills/upstash/upstash-redis-js/search/commands/aliases.md +76 -0
- package/.agents/skills/upstash/upstash-redis-js/search/commands/index-management.md +124 -0
- package/.agents/skills/upstash/upstash-redis-js/search/commands/querying.md +315 -0
- package/.agents/skills/upstash/upstash-redis-js/search/overview.md +155 -0
- package/.agents/skills/upstash/upstash-redis-start/overview.md +71 -0
- package/.agents/skills/upstash/upstash-search-js/overview.md +48 -0
- package/.agents/skills/upstash/upstash-search-js/quick-start.md +158 -0
- package/.agents/skills/upstash/upstash-search-js/sdk-overview.md +158 -0
- package/.agents/skills/upstash/upstash-vector-js/features/filtering-and-metadata.md +82 -0
- package/.agents/skills/upstash/upstash-vector-js/features/index-structure.md +193 -0
- package/.agents/skills/upstash/upstash-vector-js/features/namespaces.md +32 -0
- package/.agents/skills/upstash/upstash-vector-js/overview.md +44 -0
- package/.agents/skills/upstash/upstash-vector-js/sdk-methods.md +210 -0
- package/.agents/skills/upstash/upstash-workflow-js/agents.md +248 -0
- package/.agents/skills/upstash/upstash-workflow-js/basics/client.md +180 -0
- package/.agents/skills/upstash/upstash-workflow-js/basics/context.md +230 -0
- package/.agents/skills/upstash/upstash-workflow-js/basics/serve.md +70 -0
- package/.agents/skills/upstash/upstash-workflow-js/features/flow-control.md +145 -0
- package/.agents/skills/upstash/upstash-workflow-js/features/invoke.md +97 -0
- package/.agents/skills/upstash/upstash-workflow-js/features/retries-failures-reliability.md +239 -0
- package/.agents/skills/upstash/upstash-workflow-js/features/wait-for-event.md +97 -0
- package/.agents/skills/upstash/upstash-workflow-js/features/webhooks.md +79 -0
- package/.agents/skills/upstash/upstash-workflow-js/how-to/local-dev.md +177 -0
- package/.agents/skills/upstash/upstash-workflow-js/how-to/middleware.md +166 -0
- package/.agents/skills/upstash/upstash-workflow-js/how-to/migrations.md +201 -0
- package/.agents/skills/upstash/upstash-workflow-js/how-to/realtime.md +186 -0
- package/.agents/skills/upstash/upstash-workflow-js/overview.md +55 -0
- package/.agents/skills/upstash/upstash-workflow-js/rest-api.md +156 -0
- package/.agents/skills/upstash/upstash-workflow-js/troubleshooting.md +201 -0
- package/.agents/skills/upstash-box-js/SKILL.md +248 -0
- package/.agents/skills/upstash-box-py/SKILL.md +280 -0
- package/.agents/skills/upstash-cli/SKILL.md +143 -0
- package/.agents/skills/upstash-qstash-js/SKILL.md +86 -0
- package/.agents/skills/upstash-qstash-js/advanced/callbacks.md +147 -0
- package/.agents/skills/upstash-qstash-js/advanced/deduplication.md +86 -0
- package/.agents/skills/upstash-qstash-js/advanced/dlq.md +164 -0
- package/.agents/skills/upstash-qstash-js/advanced/multi-region/summary.md +388 -0
- package/.agents/skills/upstash-qstash-js/advanced/multi-region/verify-multi-region-setup.ts +388 -0
- package/.agents/skills/upstash-qstash-js/fundamentals/local-development.md +106 -0
- package/.agents/skills/upstash-qstash-js/fundamentals/publishing-messages.md +144 -0
- package/.agents/skills/upstash-qstash-js/fundamentals/queues-and-flow-control.md +148 -0
- package/.agents/skills/upstash-qstash-js/fundamentals/schedules.md +177 -0
- package/.agents/skills/upstash-qstash-js/fundamentals/url-groups.md +127 -0
- package/.agents/skills/upstash-qstash-js/verification/platform-specific/nextjs.md +171 -0
- package/.agents/skills/upstash-qstash-js/verification/receiver.md +213 -0
- package/.agents/skills/upstash-ratelimit-js/SKILL.md +31 -0
- package/.agents/skills/upstash-ratelimit-js/algorithms.md +84 -0
- package/.agents/skills/upstash-ratelimit-js/features.md +117 -0
- package/.agents/skills/upstash-ratelimit-js/methods-getting-started.md +77 -0
- package/.agents/skills/upstash-ratelimit-js/pricing-cost.md +146 -0
- package/.agents/skills/upstash-ratelimit-js/traffic-protection.md +77 -0
- package/.agents/skills/upstash-redis-js/SKILL.md +188 -0
- package/.agents/skills/upstash-redis-js/advanced-features/auto-pipeline.md +49 -0
- package/.agents/skills/upstash-redis-js/advanced-features/pipeline-and-transactions.md +42 -0
- package/.agents/skills/upstash-redis-js/advanced-features/scripting.md +124 -0
- package/.agents/skills/upstash-redis-js/data-structures/hashes.md +71 -0
- package/.agents/skills/upstash-redis-js/data-structures/json.md +133 -0
- package/.agents/skills/upstash-redis-js/data-structures/lists.md +72 -0
- package/.agents/skills/upstash-redis-js/data-structures/sets.md +90 -0
- package/.agents/skills/upstash-redis-js/data-structures/sorted-sets.md +126 -0
- package/.agents/skills/upstash-redis-js/data-structures/streams.md +196 -0
- package/.agents/skills/upstash-redis-js/data-structures/strings.md +73 -0
- package/.agents/skills/upstash-redis-js/migrations/from-ioredis.md +163 -0
- package/.agents/skills/upstash-redis-js/migrations/from-redis-node.md +205 -0
- package/.agents/skills/upstash-redis-js/patterns/caching.md +58 -0
- package/.agents/skills/upstash-redis-js/patterns/distributed-locks.md +130 -0
- package/.agents/skills/upstash-redis-js/patterns/leaderboard.md +134 -0
- package/.agents/skills/upstash-redis-js/patterns/rate-limiting.md +187 -0
- package/.agents/skills/upstash-redis-js/patterns/session-management.md +217 -0
- package/.agents/skills/upstash-redis-js/performance/batching-operations.md +76 -0
- package/.agents/skills/upstash-redis-js/performance/data-serialization.md +134 -0
- package/.agents/skills/upstash-redis-js/performance/error-handling.md +118 -0
- package/.agents/skills/upstash-redis-js/performance/pipeline-optimization.md +105 -0
- package/.agents/skills/upstash-redis-js/performance/redis-replicas.md +14 -0
- package/.agents/skills/upstash-redis-js/performance/ttl-expiration.md +32 -0
- package/.agents/skills/upstash-redis-js/search/adapters.md +99 -0
- package/.agents/skills/upstash-redis-js/search/commands/aggregating.md +234 -0
- package/.agents/skills/upstash-redis-js/search/commands/aliases.md +76 -0
- package/.agents/skills/upstash-redis-js/search/commands/index-management.md +124 -0
- package/.agents/skills/upstash-redis-js/search/commands/querying.md +315 -0
- package/.agents/skills/upstash-redis-js/search/overview.md +155 -0
- package/.agents/skills/upstash-redis-start/SKILL.md +76 -0
- package/.agents/skills/upstash-search-js/SKILL.md +53 -0
- package/.agents/skills/upstash-search-js/quick-start.md +158 -0
- package/.agents/skills/upstash-search-js/sdk-overview.md +158 -0
- package/.agents/skills/upstash-vector-js/SKILL.md +49 -0
- package/.agents/skills/upstash-vector-js/features/filtering-and-metadata.md +82 -0
- package/.agents/skills/upstash-vector-js/features/index-structure.md +193 -0
- package/.agents/skills/upstash-vector-js/features/namespaces.md +32 -0
- package/.agents/skills/upstash-vector-js/sdk-methods.md +210 -0
- package/.agents/skills/upstash-workflow-js/SKILL.md +60 -0
- package/.agents/skills/upstash-workflow-js/agents.md +248 -0
- package/.agents/skills/upstash-workflow-js/basics/client.md +180 -0
- package/.agents/skills/upstash-workflow-js/basics/context.md +230 -0
- package/.agents/skills/upstash-workflow-js/basics/serve.md +70 -0
- package/.agents/skills/upstash-workflow-js/features/flow-control.md +145 -0
- package/.agents/skills/upstash-workflow-js/features/invoke.md +97 -0
- package/.agents/skills/upstash-workflow-js/features/retries-failures-reliability.md +239 -0
- package/.agents/skills/upstash-workflow-js/features/wait-for-event.md +97 -0
- package/.agents/skills/upstash-workflow-js/features/webhooks.md +79 -0
- package/.agents/skills/upstash-workflow-js/how-to/local-dev.md +177 -0
- package/.agents/skills/upstash-workflow-js/how-to/middleware.md +166 -0
- package/.agents/skills/upstash-workflow-js/how-to/migrations.md +201 -0
- package/.agents/skills/upstash-workflow-js/how-to/realtime.md +186 -0
- package/.agents/skills/upstash-workflow-js/rest-api.md +156 -0
- package/.agents/skills/upstash-workflow-js/troubleshooting.md +201 -0
- package/dist/agents/coding.agent.d.ts +185 -42
- package/dist/agents/coding.agent.d.ts.map +1 -1
- package/dist/agents/coding.agent.js +42 -5
- package/dist/agents/coding.agent.js.map +1 -1
- package/dist/agents/manager.d.ts +216 -41
- package/dist/agents/manager.d.ts.map +1 -1
- package/dist/agents/manager.js +103 -140
- package/dist/agents/manager.js.map +1 -1
- package/dist/agents/security.agent.d.ts +3 -3
- package/dist/agents/swarm/development/lead.d.ts +3 -0
- package/dist/agents/swarm/development/lead.d.ts.map +1 -0
- package/dist/agents/swarm/development/lead.js +24 -0
- package/dist/agents/swarm/development/lead.js.map +1 -0
- package/dist/agents/swarm/main.d.ts +69 -0
- package/dist/agents/swarm/main.d.ts.map +1 -1
- package/dist/agents/swarm/main.js +65 -11
- package/dist/agents/swarm/main.js.map +1 -1
- package/dist/agents/swarm/registry.d.ts +2 -1
- package/dist/agents/swarm/registry.d.ts.map +1 -1
- package/dist/agents/swarm/registry.js +225 -95
- package/dist/agents/swarm/registry.js.map +1 -1
- package/dist/cli/composer.d.ts.map +1 -1
- package/dist/cli/composer.js +85 -30
- package/dist/cli/composer.js.map +1 -1
- package/dist/cli/confirm.d.ts +2 -2
- package/dist/cli/confirm.d.ts.map +1 -1
- package/dist/cli/confirm.js +373 -4
- package/dist/cli/confirm.js.map +1 -1
- package/dist/cli/doctor.d.ts +1 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +47 -2
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/format.d.ts +4 -0
- package/dist/cli/format.d.ts.map +1 -1
- package/dist/cli/format.js +352 -65
- package/dist/cli/format.js.map +1 -1
- package/dist/cli/interactive.d.ts.map +1 -1
- package/dist/cli/interactive.js +80 -2
- package/dist/cli/interactive.js.map +1 -1
- package/dist/cli/menu.d.ts.map +1 -1
- package/dist/cli/menu.js +93 -83
- package/dist/cli/menu.js.map +1 -1
- package/dist/cli/render.d.ts.map +1 -1
- package/dist/cli/render.js +2 -1
- package/dist/cli/render.js.map +1 -1
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +262 -27
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/swarm.d.ts.map +1 -1
- package/dist/cli/swarm.js +13 -10
- package/dist/cli/swarm.js.map +1 -1
- package/dist/cli/theme.d.ts +7 -1
- package/dist/cli/theme.d.ts.map +1 -1
- package/dist/cli/theme.js +4 -16
- package/dist/cli/theme.js.map +1 -1
- package/dist/cli/update.d.ts.map +1 -1
- package/dist/cli/update.js +27 -4
- package/dist/cli/update.js.map +1 -1
- package/dist/config/env.d.ts +3 -1
- package/dist/config/env.d.ts.map +1 -1
- package/dist/config/env.js +22 -2
- package/dist/config/env.js.map +1 -1
- package/dist/config/models.d.ts +1 -0
- package/dist/config/models.d.ts.map +1 -1
- package/dist/config/models.js +17 -1
- package/dist/config/models.js.map +1 -1
- package/dist/documents/pdf.d.ts.map +1 -1
- package/dist/documents/pdf.js +282 -22
- package/dist/documents/pdf.js.map +1 -1
- package/dist/documents/slides.d.ts.map +1 -1
- package/dist/documents/slides.js +160 -30
- package/dist/documents/slides.js.map +1 -1
- package/dist/index.js +73 -18
- package/dist/index.js.map +1 -1
- package/dist/memory/history.js +1 -1
- package/dist/observability/doctor.d.ts.map +1 -1
- package/dist/observability/doctor.js +3 -0
- package/dist/observability/doctor.js.map +1 -1
- package/dist/runtime/progress.d.ts +5 -1
- package/dist/runtime/progress.d.ts.map +1 -1
- package/dist/runtime/progress.js.map +1 -1
- package/dist/runtime/swarm.d.ts +1 -1
- package/dist/runtime/swarm.d.ts.map +1 -1
- package/dist/runtime/swarm.js +19 -3
- package/dist/runtime/swarm.js.map +1 -1
- package/dist/runtime/tool-utils.d.ts +2 -0
- package/dist/runtime/tool-utils.d.ts.map +1 -1
- package/dist/runtime/tool-utils.js +91 -0
- package/dist/runtime/tool-utils.js.map +1 -1
- package/dist/server.js +1 -1
- package/dist/server.js.map +1 -1
- package/dist/skills/loader.d.ts.map +1 -1
- package/dist/skills/loader.js +16 -0
- package/dist/skills/loader.js.map +1 -1
- package/dist/test-call.d.ts +2 -0
- package/dist/test-call.d.ts.map +1 -0
- package/dist/test-call.js +29 -0
- package/dist/test-call.js.map +1 -0
- package/dist/test-manager-call.d.ts +2 -0
- package/dist/test-manager-call.d.ts.map +1 -0
- package/dist/test-manager-call.js +138 -0
- package/dist/test-manager-call.js.map +1 -0
- package/dist/test-manager-filtered.d.ts +2 -0
- package/dist/test-manager-filtered.d.ts.map +1 -0
- package/dist/test-manager-filtered.js +130 -0
- package/dist/test-manager-filtered.js.map +1 -0
- package/dist/test-mcp-call.d.ts +2 -0
- package/dist/test-mcp-call.d.ts.map +1 -0
- package/dist/test-mcp-call.js +103 -0
- package/dist/test-mcp-call.js.map +1 -0
- package/dist/tools/composio.tool.d.ts +1 -1
- package/dist/tools/composio.tool.d.ts.map +1 -1
- package/dist/tools/composio.tool.js +7 -16
- package/dist/tools/composio.tool.js.map +1 -1
- package/dist/tools/daytona-browser.tool.js +1 -1
- package/dist/tools/daytona-browser.tool.js.map +1 -1
- package/dist/tools/executive.tool.d.ts +40 -0
- package/dist/tools/executive.tool.d.ts.map +1 -0
- package/dist/tools/executive.tool.js +74 -0
- package/dist/tools/executive.tool.js.map +1 -0
- package/dist/tools/filesystem.tool.d.ts +183 -40
- package/dist/tools/filesystem.tool.d.ts.map +1 -1
- package/dist/tools/filesystem.tool.js +564 -111
- package/dist/tools/filesystem.tool.js.map +1 -1
- package/dist/tools/mcp.tool.d.ts +56 -0
- package/dist/tools/mcp.tool.d.ts.map +1 -0
- package/dist/tools/mcp.tool.js +285 -0
- package/dist/tools/mcp.tool.js.map +1 -0
- package/dist/tools/osint.tool.d.ts +4 -4
- package/dist/tools/pentest.tool.d.ts +2 -2
- package/dist/tools/setup-assistant.tool.d.ts +1 -1
- package/dist/tools/setup-assistant.tool.js +1 -1
- package/dist/tools/setup-assistant.tool.js.map +1 -1
- package/dist/workspace/paths.d.ts +1 -0
- package/dist/workspace/paths.d.ts.map +1 -1
- package/dist/workspace/paths.js +3 -4
- package/dist/workspace/paths.js.map +1 -1
- package/package.json +8 -4
- package/scripts/postinstall.mjs +19 -4
- package/scripts/release-github.mjs +11 -11
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# Lists
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Lists are ordered collections of strings. They support operations at both ends (head and tail) with O(1) time complexity.
|
|
6
|
+
|
|
7
|
+
## Good For
|
|
8
|
+
|
|
9
|
+
- Activity feeds (latest posts, news)
|
|
10
|
+
- Job queues
|
|
11
|
+
- Recent items (last 100 searches)
|
|
12
|
+
- Stack or queue implementations
|
|
13
|
+
|
|
14
|
+
## Limitations
|
|
15
|
+
|
|
16
|
+
- Maximum length: 2^32 - 1 (4.2 billion) elements
|
|
17
|
+
- Accessing elements by index is O(N) for large lists
|
|
18
|
+
- No built-in deduplication (use sets for unique values)
|
|
19
|
+
|
|
20
|
+
## Examples
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
import { Redis } from "@upstash/redis";
|
|
24
|
+
|
|
25
|
+
const redis = Redis.fromEnv();
|
|
26
|
+
|
|
27
|
+
// Push to left (head) of list
|
|
28
|
+
await redis.lpush("tasks", "task1");
|
|
29
|
+
await redis.lpush("tasks", "task2", "task3"); // ["task3", "task2", "task1"]
|
|
30
|
+
|
|
31
|
+
// Push to right (tail) of list
|
|
32
|
+
await redis.rpush("tasks", "task4"); // ["task3", "task2", "task1", "task4"]
|
|
33
|
+
|
|
34
|
+
// Get list length
|
|
35
|
+
const length = await redis.llen("tasks"); // 4
|
|
36
|
+
|
|
37
|
+
// Get range of elements (0-based index, inclusive)
|
|
38
|
+
const allTasks = await redis.lrange("tasks", 0, -1); // All elements
|
|
39
|
+
const firstTwo = await redis.lrange("tasks", 0, 1); // ["task3", "task2"]
|
|
40
|
+
|
|
41
|
+
// Get element by index
|
|
42
|
+
const first = await redis.lindex("tasks", 0); // "task3"
|
|
43
|
+
const last = await redis.lindex("tasks", -1); // "task4"
|
|
44
|
+
|
|
45
|
+
// Set element at index
|
|
46
|
+
await redis.lset("tasks", 0, "updated-task");
|
|
47
|
+
|
|
48
|
+
// Pop from left (head)
|
|
49
|
+
const leftItem = await redis.lpop("tasks"); // "updated-task"
|
|
50
|
+
|
|
51
|
+
// Pop from right (tail)
|
|
52
|
+
const rightItem = await redis.rpop("tasks"); // "task4"
|
|
53
|
+
|
|
54
|
+
// Pop multiple elements from left
|
|
55
|
+
await redis.lpush("numbers", 1, 2, 3, 4, 5);
|
|
56
|
+
const twoItems = await redis.lpop("numbers", 2); // [5, 4]
|
|
57
|
+
|
|
58
|
+
// Trim list to specified range (keep only indices 0 to 2)
|
|
59
|
+
await redis.ltrim("tasks", 0, 2);
|
|
60
|
+
|
|
61
|
+
// Remove elements by value
|
|
62
|
+
await redis.rpush("items", "a", "b", "c", "b", "d");
|
|
63
|
+
await redis.lrem("items", 2, "b"); // Remove first 2 occurrences of "b" from left
|
|
64
|
+
// Use negative count to remove from right, 0 to remove all
|
|
65
|
+
|
|
66
|
+
// Insert before or after a pivot element
|
|
67
|
+
await redis.linsert("items", "BEFORE", "c", "x"); // Insert "x" before "c"
|
|
68
|
+
await redis.linsert("items", "AFTER", "c", "y"); // Insert "y" after "c"
|
|
69
|
+
|
|
70
|
+
// Delete entire list
|
|
71
|
+
await redis.del("tasks");
|
|
72
|
+
```
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# Sets
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Sets are unordered collections of unique strings. They provide fast membership testing and set operations (union, intersection, difference).
|
|
6
|
+
|
|
7
|
+
## Good For
|
|
8
|
+
|
|
9
|
+
- Unique item tracking (unique visitors, tags)
|
|
10
|
+
- Deduplication
|
|
11
|
+
- Membership testing
|
|
12
|
+
- Set operations (finding common elements between sets)
|
|
13
|
+
|
|
14
|
+
## Limitations
|
|
15
|
+
|
|
16
|
+
- Maximum members: 2^32 - 1 (4.2 billion) per set
|
|
17
|
+
- Unordered (no guaranteed iteration order)
|
|
18
|
+
- Members must be unique (duplicates are automatically ignored)
|
|
19
|
+
|
|
20
|
+
## Examples
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
import { Redis } from "@upstash/redis";
|
|
24
|
+
|
|
25
|
+
const redis = Redis.fromEnv();
|
|
26
|
+
|
|
27
|
+
// Add members to set (duplicates are ignored)
|
|
28
|
+
await redis.sadd("tags", "javascript", "redis", "typescript");
|
|
29
|
+
await redis.sadd("tags", "javascript"); // Ignored, already exists
|
|
30
|
+
|
|
31
|
+
// Get all members
|
|
32
|
+
const allTags = await redis.smembers("tags"); // ["javascript", "redis", "typescript"]
|
|
33
|
+
|
|
34
|
+
// Check if member exists
|
|
35
|
+
const hasRedis = await redis.sismember("tags", "redis"); // 1 if exists, 0 if not
|
|
36
|
+
|
|
37
|
+
// Check multiple members at once
|
|
38
|
+
const exists = await redis.smismember("tags", ["redis", "python", "typescript"]);
|
|
39
|
+
// [1, 0, 1] - redis exists, python doesn't, typescript exists
|
|
40
|
+
|
|
41
|
+
// Get number of members
|
|
42
|
+
const count = await redis.scard("tags"); // 3
|
|
43
|
+
|
|
44
|
+
// Remove members
|
|
45
|
+
await redis.srem("tags", "typescript");
|
|
46
|
+
await redis.srem("tags", "javascript", "redis"); // Remove multiple
|
|
47
|
+
|
|
48
|
+
// Pop random member (removes and returns)
|
|
49
|
+
await redis.sadd("items", "a", "b", "c", "d");
|
|
50
|
+
const random = await redis.spop("items"); // Removes and returns random member
|
|
51
|
+
const twoRandom = await redis.spop("items", 2); // Remove and return 2 random members
|
|
52
|
+
|
|
53
|
+
// Get random member without removing
|
|
54
|
+
const randomItem = await redis.srandmember("items");
|
|
55
|
+
const threeRandom = await redis.srandmember("items", 3);
|
|
56
|
+
|
|
57
|
+
// Set operations with multiple sets
|
|
58
|
+
await redis.sadd("set1", "a", "b", "c");
|
|
59
|
+
await redis.sadd("set2", "b", "c", "d");
|
|
60
|
+
await redis.sadd("set3", "c", "d", "e");
|
|
61
|
+
|
|
62
|
+
// Intersection (common elements)
|
|
63
|
+
const common = await redis.sinter("set1", "set2"); // ["b", "c"]
|
|
64
|
+
const commonAll = await redis.sinter("set1", "set2", "set3"); // ["c"]
|
|
65
|
+
|
|
66
|
+
// Count the intersection without returning members
|
|
67
|
+
const commonCount = await redis.sintercard(["set1", "set2"]); // 2
|
|
68
|
+
|
|
69
|
+
// Store intersection result in new set
|
|
70
|
+
await redis.sinterstore("result", "set1", "set2");
|
|
71
|
+
|
|
72
|
+
// Union (all unique elements from all sets)
|
|
73
|
+
const union = await redis.sunion("set1", "set2"); // ["a", "b", "c", "d"]
|
|
74
|
+
|
|
75
|
+
// Store union result
|
|
76
|
+
await redis.sunionstore("result", "set1", "set2");
|
|
77
|
+
|
|
78
|
+
// Difference (elements in first set but not in others)
|
|
79
|
+
const diff = await redis.sdiff("set1", "set2"); // ["a"]
|
|
80
|
+
const diff2 = await redis.sdiff("set2", "set1"); // ["d"]
|
|
81
|
+
|
|
82
|
+
// Store difference result
|
|
83
|
+
await redis.sdiffstore("result", "set1", "set2");
|
|
84
|
+
|
|
85
|
+
// Move member from one set to another
|
|
86
|
+
await redis.smove("set1", "set2", "a"); // Move "a" from set1 to set2
|
|
87
|
+
|
|
88
|
+
// Delete entire set
|
|
89
|
+
await redis.del("tags");
|
|
90
|
+
```
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# Sorted Sets
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Sorted sets store unique members with associated scores. Members are automatically ordered by score, enabling range queries and rankings.
|
|
6
|
+
|
|
7
|
+
## Good For
|
|
8
|
+
|
|
9
|
+
- Leaderboards and rankings
|
|
10
|
+
- Priority queues
|
|
11
|
+
- Time-series data (using timestamp as score)
|
|
12
|
+
- Trending content (using engagement score)
|
|
13
|
+
|
|
14
|
+
## Limitations
|
|
15
|
+
|
|
16
|
+
- Maximum members: 2^32 - 1 (4.2 billion) per sorted set
|
|
17
|
+
- Scores are 64-bit floating point numbers
|
|
18
|
+
- Members must be unique (updating a member replaces its score)
|
|
19
|
+
|
|
20
|
+
## Examples
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
import { Redis } from "@upstash/redis";
|
|
24
|
+
|
|
25
|
+
const redis = Redis.fromEnv();
|
|
26
|
+
|
|
27
|
+
// Add members with scores
|
|
28
|
+
await redis.zadd("leaderboard", { score: 100, member: "player1" });
|
|
29
|
+
await redis.zadd(
|
|
30
|
+
"leaderboard",
|
|
31
|
+
{ score: 250, member: "player2" },
|
|
32
|
+
{ score: 150, member: "player3" }
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
// Update score (replaces if member exists)
|
|
36
|
+
await redis.zadd("leaderboard", { score: 300, member: "player1" });
|
|
37
|
+
|
|
38
|
+
// Increment score
|
|
39
|
+
await redis.zincrby("leaderboard", 50, "player3"); // player3 now has 200
|
|
40
|
+
|
|
41
|
+
// Get number of members
|
|
42
|
+
const count = await redis.zcard("leaderboard"); // 3
|
|
43
|
+
|
|
44
|
+
// Get score of a member
|
|
45
|
+
const score = await redis.zscore("leaderboard", "player1"); // 300
|
|
46
|
+
|
|
47
|
+
// Get rank (position) of member (0-based, lowest score = rank 0)
|
|
48
|
+
const rank = await redis.zrank("leaderboard", "player3"); // 0 (lowest score)
|
|
49
|
+
|
|
50
|
+
// Get reverse rank (highest score = rank 0)
|
|
51
|
+
const revRank = await redis.zrevrank("leaderboard", "player1"); // 0 (highest score)
|
|
52
|
+
|
|
53
|
+
// Get range by rank (ascending order)
|
|
54
|
+
const bottom2 = await redis.zrange("leaderboard", 0, 1);
|
|
55
|
+
// ["player3", "player2"] - without scores
|
|
56
|
+
|
|
57
|
+
// Get range with scores
|
|
58
|
+
const bottom2WithScores = await redis.zrange("leaderboard", 0, 1, { withScores: true });
|
|
59
|
+
// [{ member: "player3", score: 200 }, { member: "player2", score: 250 }]
|
|
60
|
+
|
|
61
|
+
// Get range in descending order (highest scores first)
|
|
62
|
+
const top2 = await redis.zrange("leaderboard", 0, 1, { rev: true });
|
|
63
|
+
// ["player1", "player2"]
|
|
64
|
+
|
|
65
|
+
const top2WithScores = await redis.zrange("leaderboard", 0, 1, { withScores: true, rev: true });
|
|
66
|
+
// [{ member: "player1", score: 300 }, { member: "player2", score: 250 }]
|
|
67
|
+
|
|
68
|
+
// Get all members
|
|
69
|
+
const all = await redis.zrange("leaderboard", 0, -1);
|
|
70
|
+
|
|
71
|
+
// Get range by score
|
|
72
|
+
const midRange = await redis.zrange("leaderboard", 150, 250, { byScore: true });
|
|
73
|
+
// ["player3", "player2"]
|
|
74
|
+
|
|
75
|
+
// Get range by score (descending)
|
|
76
|
+
const midRangeDesc = await redis.zrange("leaderboard", 250, 150, { rev: true, byScore: true });
|
|
77
|
+
// ["player2", "player3"]
|
|
78
|
+
|
|
79
|
+
// Count members in score range
|
|
80
|
+
const countInRange = await redis.zcount("leaderboard", 100, 250); // 2
|
|
81
|
+
|
|
82
|
+
// Remove members
|
|
83
|
+
await redis.zrem("leaderboard", "player2");
|
|
84
|
+
await redis.zrem("leaderboard", "player1", "player3"); // Remove multiple
|
|
85
|
+
|
|
86
|
+
// Remove by rank range
|
|
87
|
+
await redis.zadd(
|
|
88
|
+
"scores",
|
|
89
|
+
{ score: 1, member: "a" },
|
|
90
|
+
{ score: 2, member: "b" },
|
|
91
|
+
{ score: 3, member: "c" }
|
|
92
|
+
);
|
|
93
|
+
await redis.zremrangebyrank("scores", 0, 0); // Remove lowest score (rank 0)
|
|
94
|
+
|
|
95
|
+
// Remove by score range
|
|
96
|
+
await redis.zremrangebyscore("scores", 2, 3); // Remove members with scores 2-3
|
|
97
|
+
|
|
98
|
+
// Pop members (remove and return)
|
|
99
|
+
await redis.zadd("items", { score: 1, member: "a" }, { score: 2, member: "b" });
|
|
100
|
+
const lowest = await redis.zpopmin("items"); // Remove and return lowest score
|
|
101
|
+
const highest = await redis.zpopmax("items"); // Remove and return highest score
|
|
102
|
+
|
|
103
|
+
// Pop multiple members
|
|
104
|
+
await redis.zadd(
|
|
105
|
+
"items",
|
|
106
|
+
{ score: 1, member: "a" },
|
|
107
|
+
{ score: 2, member: "b" },
|
|
108
|
+
{ score: 3, member: "c" }
|
|
109
|
+
);
|
|
110
|
+
const twoLowest = await redis.zpopmin("items", 2); // Remove 2 lowest
|
|
111
|
+
|
|
112
|
+
// Practical example: Time-series data
|
|
113
|
+
const now = Date.now();
|
|
114
|
+
await redis.zadd(
|
|
115
|
+
"events",
|
|
116
|
+
{ score: now - 3600000, member: "event1" }, // 1 hour ago
|
|
117
|
+
{ score: now - 1800000, member: "event2" }, // 30 min ago
|
|
118
|
+
{ score: now, member: "event3" } // now
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
// Get events from last hour
|
|
122
|
+
const lastHour = await redis.zrange("events", now - 3600000, now, { byScore: true });
|
|
123
|
+
|
|
124
|
+
// Delete entire sorted set
|
|
125
|
+
await redis.del("leaderboard");
|
|
126
|
+
```
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
# Streams
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Streams are append-only logs of entries with unique IDs. They support consumer groups for distributed processing and delivery guarantees.
|
|
6
|
+
|
|
7
|
+
## Good For
|
|
8
|
+
|
|
9
|
+
- Event sourcing
|
|
10
|
+
- Activity logs
|
|
11
|
+
- Message queues with multiple consumers
|
|
12
|
+
- Real-time data feeds
|
|
13
|
+
- Chat systems
|
|
14
|
+
|
|
15
|
+
## Limitations
|
|
16
|
+
|
|
17
|
+
- Entries cannot be modified after insertion
|
|
18
|
+
- Memory grows unbounded unless trimmed
|
|
19
|
+
- Maximum stream length: practical limits based on memory
|
|
20
|
+
|
|
21
|
+
## Examples
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
import { Redis } from "@upstash/redis";
|
|
25
|
+
|
|
26
|
+
const redis = Redis.fromEnv();
|
|
27
|
+
|
|
28
|
+
// Add entry to stream (auto-generated ID)
|
|
29
|
+
const id1 = await redis.xadd("events", "*", {
|
|
30
|
+
type: "user.login",
|
|
31
|
+
userId: "123",
|
|
32
|
+
timestamp: Date.now(),
|
|
33
|
+
});
|
|
34
|
+
// Returns ID like "1642424242424-0"
|
|
35
|
+
|
|
36
|
+
// Add with specific ID (timestamp-sequence format)
|
|
37
|
+
const id2 = await redis.xadd("events", "1642424242424-1", {
|
|
38
|
+
type: "user.logout",
|
|
39
|
+
userId: "123",
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
// Add with trim (limit stream size)
|
|
43
|
+
await redis.xadd(
|
|
44
|
+
"events",
|
|
45
|
+
"*",
|
|
46
|
+
{ event: "test" },
|
|
47
|
+
{
|
|
48
|
+
trim: {
|
|
49
|
+
type: "MAXLEN",
|
|
50
|
+
comparison: "=",
|
|
51
|
+
threshold: 1000,
|
|
52
|
+
},
|
|
53
|
+
}
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
// Add with approximate trim (more efficient)
|
|
57
|
+
await redis.xadd(
|
|
58
|
+
"events",
|
|
59
|
+
"*",
|
|
60
|
+
{ event: "test" },
|
|
61
|
+
{
|
|
62
|
+
trim: {
|
|
63
|
+
type: "MAXLEN",
|
|
64
|
+
comparison: "~",
|
|
65
|
+
threshold: 1000,
|
|
66
|
+
},
|
|
67
|
+
}
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
// Get stream length
|
|
71
|
+
const length = await redis.xlen("events");
|
|
72
|
+
|
|
73
|
+
// Read entries from stream
|
|
74
|
+
const entries = await redis.xread("events", "0", { count: 10 });
|
|
75
|
+
// Returns: [{ name: "events", messages: [{ id: "...", message: {...} }] }]
|
|
76
|
+
|
|
77
|
+
// Read latest entries
|
|
78
|
+
const latest = await redis.xread("events", "$"); // $ means new entries only
|
|
79
|
+
|
|
80
|
+
// Read from multiple streams
|
|
81
|
+
const multi = await redis.xread(["stream1", "stream2"], ["0", "0"]);
|
|
82
|
+
|
|
83
|
+
// Note: Blocking (BLOCK option) is not yet supported in Upstash Redis
|
|
84
|
+
|
|
85
|
+
// Get range of entries by ID
|
|
86
|
+
const range = await redis.xrange("events", "-", "+"); // All entries
|
|
87
|
+
const specific = await redis.xrange("events", "1642424242424-0", "1642424242424-1");
|
|
88
|
+
const last10 = await redis.xrevrange("events", "+", "-", 10); // Last 10 in reverse
|
|
89
|
+
|
|
90
|
+
// Create consumer group
|
|
91
|
+
await redis.xgroup("events", {
|
|
92
|
+
type: "CREATE",
|
|
93
|
+
group: "processors",
|
|
94
|
+
id: "0",
|
|
95
|
+
options: { MKSTREAM: true },
|
|
96
|
+
});
|
|
97
|
+
// Creates group "processors" starting from beginning
|
|
98
|
+
|
|
99
|
+
// Read as consumer group member
|
|
100
|
+
const groupEntries = await redis.xreadgroup(
|
|
101
|
+
"processors", // group name
|
|
102
|
+
"consumer1", // consumer name
|
|
103
|
+
"events", // stream key
|
|
104
|
+
">", // > means undelivered messages
|
|
105
|
+
{ count: 5 }
|
|
106
|
+
);
|
|
107
|
+
|
|
108
|
+
// Acknowledge processed messages
|
|
109
|
+
if (groupEntries && groupEntries[0]) {
|
|
110
|
+
const messages = (groupEntries[0] as any)[1] as Array<{ 0: string; 1: any }>;
|
|
111
|
+
if (messages && messages.length > 0) {
|
|
112
|
+
const messageIds = messages.map((m) => m[0]);
|
|
113
|
+
await redis.xack("events", "processors", messageIds);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Get pending messages (delivered but not acknowledged)
|
|
118
|
+
const pending = await redis.xpending("events", "processors", "-", "+", 10);
|
|
119
|
+
// Returns pending entry details
|
|
120
|
+
|
|
121
|
+
// Get detailed pending info for specific consumer
|
|
122
|
+
const pendingDetails = await redis.xpending(
|
|
123
|
+
"events", // stream key
|
|
124
|
+
"processors", // group
|
|
125
|
+
"-", // start
|
|
126
|
+
"_+", // end
|
|
127
|
+
10, // count
|
|
128
|
+
{ consumer: "consumer1" } // optional: specific consumer
|
|
129
|
+
);
|
|
130
|
+
|
|
131
|
+
// Claim pending messages (take over from another consumer)
|
|
132
|
+
const claimed = await redis.xclaim(
|
|
133
|
+
"events", // stream key
|
|
134
|
+
"processors", // group
|
|
135
|
+
"consumer2", // new owner (consumer)
|
|
136
|
+
3600000, // min idle time (ms)
|
|
137
|
+
"1642424242424-0" // message ID(s) to claim
|
|
138
|
+
);
|
|
139
|
+
|
|
140
|
+
// Delete messages
|
|
141
|
+
await redis.xdel("events", [id1, id2]);
|
|
142
|
+
|
|
143
|
+
// Trim stream to maximum length
|
|
144
|
+
await redis.xtrim("events", { strategy: "MAXLEN", threshold: 1000, exactness: "=" });
|
|
145
|
+
await redis.xtrim("events", { strategy: "MAXLEN", threshold: 1000, exactness: "~" }); // Approximate (more efficient)
|
|
146
|
+
|
|
147
|
+
// Get consumer group info
|
|
148
|
+
const groups = await redis.xinfo("events", { type: "GROUPS" });
|
|
149
|
+
// Returns list of consumer groups
|
|
150
|
+
|
|
151
|
+
// Get consumers in group
|
|
152
|
+
const consumers = await redis.xinfo("events", { type: "CONSUMERS", group: "processors" });
|
|
153
|
+
// Returns list of consumers and their stats
|
|
154
|
+
|
|
155
|
+
// Delete consumer from group
|
|
156
|
+
await redis.xgroup("events", {
|
|
157
|
+
type: "DELCONSUMER",
|
|
158
|
+
group: "processors",
|
|
159
|
+
consumer: "consumer1",
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
// Delete consumer group
|
|
163
|
+
await redis.xgroup("events", { type: "DESTROY", group: "processors" });
|
|
164
|
+
|
|
165
|
+
// Practical example: Event log with processing
|
|
166
|
+
await redis.xadd("orders", "*", {
|
|
167
|
+
orderId: "order-123",
|
|
168
|
+
status: "pending",
|
|
169
|
+
amount: 99.99,
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
// Create processor group
|
|
173
|
+
await redis.xgroup("orders", {
|
|
174
|
+
type: "CREATE",
|
|
175
|
+
group: "order-processors",
|
|
176
|
+
id: "0",
|
|
177
|
+
options: { MKSTREAM: true },
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
// Worker reads and processes
|
|
181
|
+
const orders = await redis.xreadgroup("order-processors", "worker-1", "orders", ">", {
|
|
182
|
+
count: 1,
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
if (orders && orders[0]) {
|
|
186
|
+
const messages = (orders[0] as any)[1] as Array<{ 0: string; 1: any }>;
|
|
187
|
+
if (messages && messages.length > 0) {
|
|
188
|
+
const order = messages[0];
|
|
189
|
+
// Process order...
|
|
190
|
+
console.log("Processing:", order[1]);
|
|
191
|
+
|
|
192
|
+
// Acknowledge when done
|
|
193
|
+
await redis.xack("orders", "order-processors", order[0]);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
```
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# Strings
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Strings are the most basic Redis data structure. They store a single value and support atomic operations like increment/decrement.
|
|
6
|
+
|
|
7
|
+
## Good For
|
|
8
|
+
|
|
9
|
+
- Caching simple values (strings, numbers, booleans, objects)
|
|
10
|
+
- Counters (page views, likes, inventory)
|
|
11
|
+
- Feature flags
|
|
12
|
+
- Session tokens
|
|
13
|
+
|
|
14
|
+
## Limitations
|
|
15
|
+
|
|
16
|
+
- Maximum value size: 512 MB
|
|
17
|
+
- No built-in list or set operations on a single key
|
|
18
|
+
- Increment/decrement only work on values that can be parsed as integers
|
|
19
|
+
|
|
20
|
+
## Examples
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
import { Redis } from "@upstash/redis";
|
|
24
|
+
|
|
25
|
+
const redis = Redis.fromEnv();
|
|
26
|
+
|
|
27
|
+
// Set and get strings
|
|
28
|
+
await redis.set("greeting", "Hello World");
|
|
29
|
+
const greeting = await redis.get("greeting"); // "Hello World"
|
|
30
|
+
|
|
31
|
+
// Set and get numbers (automatic serialization)
|
|
32
|
+
await redis.set("views", 100);
|
|
33
|
+
const views = await redis.get("views"); // 100 (as number, not string)
|
|
34
|
+
|
|
35
|
+
// Set and get objects (automatic JSON serialization)
|
|
36
|
+
await redis.set("user", { name: "Alice", age: 30 });
|
|
37
|
+
const user = await redis.get("user"); // { name: "Alice", age: 30 }
|
|
38
|
+
|
|
39
|
+
// Set with expiration (TTL in seconds)
|
|
40
|
+
await redis.setex("session", 3600, { userId: "123" });
|
|
41
|
+
|
|
42
|
+
// Set only if key doesn't exist
|
|
43
|
+
await redis.setnx("lock", "process-1"); // Returns 1 if set, 0 if already exists
|
|
44
|
+
|
|
45
|
+
// Increment and decrement counters
|
|
46
|
+
await redis.incr("views"); // 101
|
|
47
|
+
await redis.decr("views"); // 100
|
|
48
|
+
await redis.incrby("views", 10); // 110
|
|
49
|
+
await redis.decrby("views", 5); // 105
|
|
50
|
+
|
|
51
|
+
// Append to string
|
|
52
|
+
await redis.set("name", "Alice");
|
|
53
|
+
await redis.append("name", " Smith"); // "Alice Smith"
|
|
54
|
+
|
|
55
|
+
// Get and set atomically
|
|
56
|
+
const oldValue = await redis.getset("counter", 0);
|
|
57
|
+
|
|
58
|
+
// Multiple get/set (batch operations)
|
|
59
|
+
await redis.mset({ key1: "value1", key2: "value2", key3: 123 });
|
|
60
|
+
const values = await redis.mget("key1", "key2", "key3"); // ["value1", "value2", 123]
|
|
61
|
+
|
|
62
|
+
// Check if key exists
|
|
63
|
+
const exists = await redis.exists("greeting"); // 1 if exists, 0 if not
|
|
64
|
+
|
|
65
|
+
// Delete key
|
|
66
|
+
await redis.del("greeting");
|
|
67
|
+
|
|
68
|
+
// Get TTL (time to live in seconds)
|
|
69
|
+
await redis.ttl("session"); // seconds remaining, -1 if no expiry, -2 if doesn't exist
|
|
70
|
+
|
|
71
|
+
// Set expiration on existing key
|
|
72
|
+
await redis.expire("key1", 60); // expires in 60 seconds
|
|
73
|
+
```
|