关于 swift-valkey
swift-valkey 是面向 Swift 开发者的 Valkey/Redis 客户端库,提供 async/await 接口,可连接单个服务或集群。它涵盖常见数据结构操作,并支持发布订阅、事务、流水线和集群路由。
主要功能
- 01Swift async/await 客户端
- 02连接单节点或集群
- 03支持字符串、哈希、列表及集合
- 04发布订阅消息
- 05事务与流水线执行
- 06按键槽自动路由集群命令
适用场景
- 01在 Swift 应用中读写 Valkey 或 Redis 数据
- 02通过集群模式访问分片数据
- 03使用发布订阅传递通知
- 04批量执行命令或事务操作
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ wendylabsinc/ claude-skills --skill swift-valkey安装后在 Claude Code 中输入/swift-valkey确认已加载。
附带文件references/valkey-patterns.md
详细介绍
Valkey / Redis
Valkey 是一款开源、高性能的键值存储(Redis 的分支)。valkey-swift 库提供 Swift 客户端,全面支持 async/await、集群路由和发布/订阅。
快速开始
安装
添加到 Package.swift:
dependencies: [
.package(url: "https://github.com/valkey-io/valkey-swift.git", from: "1.0.0")
]
基本用法
import Valkey
// Connect to single server
let client = try await ValkeyClient.connect(to: .init(host: "localhost", port: 6379))
// Basic operations
try await client.set("key", "value")
let value = try await client.get("key") // Optional<String>
// With expiration
try await client.set("session", sessionData, expiration: .seconds(3600))
// Delete
try await client.del("key")
集群模式
// Connect to cluster
let client = try await ValkeyClient.connect(
to: .cluster([
.init(host: "node1.redis.local", port: 6379),
.init(host: "node2.redis.local", port: 6379),
.init(host: "node3.redis.local", port: 6379)
])
)
// Commands automatically route to correct shard
try await client.set("user:123", userData)
命令
字符串
// SET with options
try await client.set("key", "value", condition: .nx) // Only if not exists
try await client.set("key", "value", condition: .xx) // Only if exists
try await client.set("key", "value", expiration: .milliseconds(5000))
// GET
let value = try await client.get("key")
// INCR/DECR
let newValue = try await client.incr("counter")
let decreased = try await client.decr("counter")
try await client.incrBy("counter", 10)
哈希
try await client.hset("user:123", field: "name", value: "Alice")
try await client.hset("user:123", fields: ["name": "Alice", "email": "[email protected]"])
let name = try await client.hget("user:123", field: "name")
let user = try await client.hgetall("user:123") // [String: String]
列表
try await client.lpush("queue", "item1", "item2")
try await client.rpush("queue", "item3")
let item = try await client.lpop("queue")
let items = try await client.lrange("queue", start: 0, stop: -1)
集合
try await client.sadd("tags", "swift", "redis", "backend")
let isMember = try await client.sismember("tags", "swift")
let members = try await client.smembers("tags")
有序集合
try await client.zadd("leaderboard", score: 100, member: "player1")
try await client.zadd("leaderboard", members: [("player2", 200), ("player3", 150)])
let top10 = try await client.zrange("leaderboard", start: 0, stop: 9, withScores: true)
let rank = try await client.zrank("leaderboard", member: "player1")
发布/订阅
// Subscribe to channels
let subscription = try await client.subscribe(to: ["notifications", "updates"])
// Process messages
for try await message in subscription {
switch message {
case .message(let channel, let payload):
print("Received on \(channel): \(payload)")
case .subscribe(let channel, let count):
print("Subscribed to \(channel)")
}
}
// Publish
try await client.publish("notifications", message: "Hello subscribers!")
// Pattern subscribe
let patternSub = try await client.psubscribe(to: ["user:*", "event:*"])
事务
// MULTI/EXEC transaction
let results = try await client.transaction(
SET("key1", "value1"),
SET("key2", "value2"),
GET("key1")
)
// Results is tuple: (Result<String?, Error>, Result<String?, Error>, Result<String?, Error>)
流水线
// Execute multiple commands in single round-trip
let (setResult, getResult, incrResult) = try await client.execute(
SET("key", "value"),
GET("key"),
INCR("counter")
)
集群路由
系统会根据键的哈希槽自动将命令路由到正确的分片:
// Keys with same hash tag go to same shard
try await client.set("{user:123}:profile", profileData)
try await client.set("{user:123}:settings", settingsData)
// Both keys route to same shard due to {user:123} hash tag
连接配置
let config = ValkeyClient.Configuration(
endpoints: .single(.init(host: "localhost", port: 6379)),
password: "secret",
database: 0,
connectionTimeout: .seconds(5),
commandTimeout: .seconds(30),
tls: .require(.makeClientConfiguration())
)
let client = try await ValkeyClient.connect(configuration: config)
错误处理
do {
let value = try await client.get("key")
} catch let error as ValkeyClientError {
switch error {
case .connectionClosed:
// Reconnect logic
case .timeout:
// Retry logic
case .serverError(let message):
print("Server error: \(message)")
}
}
参考文件
根据需要加载以下文件,了解特定主题:
references/valkey-patterns.md- 命令协议模式、RESP 编码/解码、基于哈希槽的集群路由、订阅管理、事务模式、连接池集成、模块扩展
评论
支持 Markdown