API 兼容性
Garnet 是一个缓存存储,具有全新的线程可扩展系统架构。Garnet 的网络、处理和存储(内存和磁盘/云)层都是从头开始设计的。鉴于 RESP API 在社区中的广泛采用,我们选择它只是为了方便。Garnet 并非旨在 100% 完美地替代 Redis,而应将其视为一个足够接近的起点,以确保您关注的功能的兼容性。Garnet 可以与许多 Redis 客户端无修改地协同工作(我们特别测试了 Garnet 与 StackExchange.Redis
的良好配合),因此入门非常容易。
Garnet 目前支持的 API 调用列表在此维护。下面我们重点介绍可能不兼容的特定非 API 相关选择。此列表并非详尽无遗,它旨在作为您在使用 Garnet 时可能遇到的差异的广泛指导。
- Garnet 是多线程的,因此
MSET
不是原子的。对于原子版本的MSET
,您需要将其表示为事务(存储过程)。这很容易修复,类似于此处的MSETNX
,如果您希望MSET
默认具有原子语义,请在问题中告知我们。 - Garnet 不支持 Redis 模块。相反,它有自己基于 C# 的可扩展性机制,这些机制经过优化,可实现极高的性能、线程可扩展性、安全性和易用性。
- Garnet 现在完全支持高效的 Lua 脚本。您可以使用
--lua
开关启用 Lua。 - Garnet 遵循请求-响应的 FIFO 顺序。但是,当与大于内存的数据一起使用时,如果您选择使用 IO 的分散-收集版本(使用
EnableScatterGatherGet [--sg-get]
选项)以提高磁盘性能,那么即使结果仍然以 FIFO 顺序返回,读取操作也可能与同一输入操作序列中较早的写入操作乱序执行。 - 当 Garnet 与启用仅追加文件 (AOF) 一起使用时,默认情况下服务器在向用户返回成功之前不会等待提交。这可以使用
WaitForCommit [--aof-commit-wait]
选项进行调整,而提交频率可以使用CommitFrequencyMs [--aof-commit-freq]
选项进行调整。 - 如果您的工作负载只包含原始字符串操作,您可以使用
DisableObjects [--no-obj]
选项禁用对象存储。存储层默认禁用,您可以使用EnableStorageTier [--storage-tier]
启用它。您可以使用DisablePubSub [--no-pubsub]
选项禁用发布-订阅功能。