Redis + Swift. Red 是 Swift。Swift 是一只鸟。Redbird。
尝试从原始协议规范实现 Redis 客户端的纯 Swift 实现。
Redis 通信协议规范: https://redis.ac.cn/topics/protocol
当我为我的应用编写服务器时,我通常使用 1) Linux 服务器,2) Redis 作为我的数据库/缓存。现在我也要用 Swift 编写一切。我查阅了现有的 Swift Redis 封装器,不幸的是,它们都只是封装了一个需要外部安装的 C 库(真讨厌)。因此,我决定把它们都扔掉,回到 Redis 协议规范,并构建一个没有依赖的 Swift 客户端,这样它就可以通过添加 Swift 包管理器条目在 OS X 和 Linux 上使用,而无需安装任何其他东西。
这意味着我从裸 TCP 套接字开始编写。仅使用 Glibc
和 Darwin
头文件,以及标准 Swift 库。无依赖项。
.Package(url: "https://github.com/czechboy0/Redbird.git", majorVersion: 0)
创建一个 Redbird 实例,该实例打开到指定 Redis 服务器的套接字。然后在该实例上调用所需的命令,它会同步返回响应。该响应可以是以下支持类型中的任何一种: SimpleString
、BulkString
、Integer
、Error
、RespArray
、NullBulkString
、NullArray
,它们都继承自协议 RespObject
,该协议有一个 RespType
,用于通信你要获取的类型。
do {
let client = try Redbird(address: "127.0.0.1", port: 6379)
try client.auth(password: "mypass1") // call .auth once after creation if your Redis requires a password
let response = try client.command("SET", params: ["mykey", "hello_redis"]).toString() //"OK"
} catch {
print("Redis error: \(error)")
}
直接处理 RespObject
类型时,您还可以使用以下便利转换器,它们将尝试将您的 RespObject
转换为指定的类型
.toString() -> String
.toMaybeString() -> String?
.toArray() -> [RespObject]
`.toMaybeArray()` -> [RespObject]?
`.toInt()` -> Int
`.toBool()` -> Bool
`.toError()` -> ErrorType
支持命令 pipelining。只需请求一个 Pipeline
对象,在该对象上 enqueue
命令,然后调用 execute()
将命令发送到服务器。您将收到一个响应对象数组,这些对象按您的命令入队顺序排列。
let responses = try client.pipeline()
.enqueue("PING")
.enqueue("SET", params: ["test", "Me_llamo_test"])
.enqueue("GET", params: ["test"])
.enqueue("PING")
.execute()
// responses: [RespObject]
上述转换器在用于不兼容的类型(例如在 Integer
上调用 toArray()
)时会抛出错误。
目前 Redbird 的设计理念是提供一个无依赖、最少功能的 Swift Redis 客户端。例如,易于使用的标准命令的包装器(如 transactions)的功能目前不在路线图上(除了 AUTH
,这是非常常见的,所以做出了简化)。我想确保 Redbird 可以 允许 您使用 所有 Redis 的功能。然而,目标不是让它变得 简单,而是让它变得 简单。
话虽如此,如果 Redbird 不支持 您想使用的某项基本功能,请创建一个问题,我将尽力添加它。感谢您的帮助!
请创建一个描述您问题的 issue,或者提交一个修正的 pull request。
MIT
Honza Dvorsky - http://honzadvorsky.com, @czechboy0