valkey-io/valkey

GitHub: valkey-io/valkey

Valkey 是从 Redis 分叉的高性能分布式键值数据库,提供完全兼容的 API 和更开放的开源许可证。

Stars: 24999 | Forks: 1044

[![codecov](https://codecov.io/gh/valkey-io/valkey/graph/badge.svg?token=KYYSJAYC5F)](https://codecov.io/gh/valkey-io/valkey) [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/valkey-io/valkey/badge)](https://securityscorecards.dev/viewer/?uri=github.com/valkey-io/valkey) 本项目是在开源 Redis 项目过渡到其新的源代码可用许可证之前,从该项目分叉而来的。 本 README 仅是一份快速*入门*文档。更多详情请见 [valkey.io](https://valkey.io/) # 什么是 Valkey? Valkey 是一个高性能的数据结构服务器,主要服务于键/值(key/value)工作负载。 它支持多种原生结构,并提供可扩展的插件系统,用于添加新的数据结构和访问模式。 # 使用 `Makefile` 构建 Valkey Valkey 可以在 Linux、macOS、OpenBSD、NetBSD、FreeBSD 上编译和使用。 我们支持大端序和小端序架构,同时支持 32 位和 64 位系统。 它可能可以在 Solaris 衍生系统(例如 SmartOS)上编译,但我们对该平台的支持仅是*尽力而为*,不保证 Valkey 能像在 Linux、macOS 和 *BSD 上那样正常运行。 操作非常简单: ``` % make ``` 要构建支持 TLS 的版本,你需要 OpenSSL 开发库(例如 Debian/Ubuntu 上的 libssl-dev)。 要将 TLS 支持构建为 Valkey 内置功能: ``` % make BUILD_TLS=yes ``` 要将 TLS 构建为 Valkey 模块: ``` % make BUILD_TLS=module ``` 请注意,sentinel 模式不支持 TLS 模块。 要构建带有实验性 RDMA 支持的版本,你需要 RDMA 开发库(例如 Debian/Ubuntu 上的 librdmacm-dev 和 libibverbs-dev)。 要将 RDMA 支持构建为 Valkey 内置功能: ``` % make BUILD_RDMA=yes ``` 要将 RDMA 构建为 Valkey 模块: ``` % make BUILD_RDMA=module ``` 要构建支持 systemd 的版本,你需要 systemd 开发库(例如 Debian/Ubuntu 上的 libsystemd-dev 或 CentOS 上的 systemd-devel)并运行: ``` % make USE_SYSTEMD=yes ``` 自 Valkey 8.1 版本起,引入了 `fast_float` 作为可选依赖项,它可以加速有序集合(sorted sets)以及其他使用 double 数据类型的命令。要构建支持 `fast_float` 的版本,你需要一个 C++ 编译器并运行: ``` % make USE_FAST_FLOAT=yes ``` 要构建包含文件名和行号(针对所有函数,包括静态函数)的增强堆栈跟踪信息,请使用 libbacktrace: ``` % make USE_LIBBACKTRACE=yes ``` 要构建不带 Lua 引擎的 Valkey: ``` % make BUILD_LUA=no ``` 要为 Valkey 程序名称添加后缀,请使用: ``` % make PROG_SUFFIX="-alt" ``` 你可以使用以下命令构建 32 位的 Valkey 二进制文件: ``` % make 32bit ``` 构建 Valkey 后,建议使用以下命令进行测试: ``` % make test ``` 上述命令运行主要的集成测试。附加测试可以通过以下方式启动: ``` % make test-unit # Unit tests % make test-modules # Tests of the module API % make test-sentinel # Valkey Sentinel integration tests % make test-cluster # Valkey Cluster integration tests ``` 关于运行集成测试的更多信息可以在 [tests/README.md](tests/README.md) 中找到;关于单元测试,请参见 [src/unit/README.md](src/unit/README.md)。 ## 性能监控 Valkey 性能仪表板提供了跨版本吞吐量趋势的综合视图,帮助贡献者快速验证改进并识别回归。 - [性能概览](https://valkey.io/performance/) - 比较不同 Valkey 版本的吞吐量 - [Unstable 分支仪表板](https://perf-dashboard.valkey.io/public-dashboards/3e45bf8ded3043edaa941331cd1a94e2) - 追踪 unstable 分支中所有提交的性能 ## 解决依赖项或缓存构建选项导致的构建问题 Valkey 包含一些依赖项,它们位于 `deps` 目录中。 即使依赖项的源代码发生变化,`make` 也不会自动重新构建依赖项。 当你使用 `git pull` 更新源代码,或者依赖项树中的代码以其他方式被修改时,请确保使用以下命令来彻底清理所有内容并从头开始重新构建: ``` % make distclean ``` 这将清理:jemalloc、lua、libvalkey、linenoise 及其他依赖项。 此外,如果你强制指定了某些构建选项,如 32 位目标、禁用 C 编译器优化(用于调试目的)以及其他类似的构建时选项,这些选项将被无限期缓存,直到你执行 `make distclean` 命令。 ## 解决构建 32 位二进制文件的问题 如果你在构建了 32 位目标的 Valkey 之后需要重新构建 64 位目标,或者反之,你需要在 Valkey 发行版的根目录下执行 `make distclean`。 如果在尝试构建 32 位 Valkey 二进制文件时遇到构建错误,请尝试以下步骤: * 安装 libc6-dev-i386 包(也可以尝试 g++-multilib)。 * 尝试使用以下命令行代替 `make 32bit`: `make CFLAGS="-m32 -march=native" LDFLAGS="-m32"` ## 内存分配器 在构建 Valkey 时选择非默认的内存分配器可以通过设置 `MALLOC` 环境变量来完成。默认情况下,Valkey 使用 libc malloc 进行编译和链接,但在 Linux 系统上例外,jemalloc 是默认选项。选择此默认值是因为事实证明 jemalloc 的内存碎片问题比 libc malloc 更少。 要强制使用 libc malloc 进行编译,请使用: ``` % make MALLOC=libc ``` 要在 Mac OS X 系统上针对 jemalloc 进行编译,请使用: ``` % make MALLOC=jemalloc ``` ## 单调时钟 默认情况下,Valkey 使用处理器的内部指令时钟(x86 上的 TSC,ARM 上的 CNTVCT)进行单调时间跟踪,这比 POSIX clock_gettime 提供的时间访问速度快约 3 倍(约 10-30ns 对比约 100ns)。 这在支持的架构(x86_64 Linux 和 aarch64)上默认启用,并在不支持的系统上自动回退到 POSIX clock_gettime。 有关处理器时钟用法的更多信息,请参见: http://oliveryang.net/2015/09/pitfalls-of-TSC-usage/ 要禁用处理器时钟并强制使用 POSIX clock_gettime,请使用: ``` % make CFLAGS="-DNO_PROCESSOR_CLOCK" ``` ## 详细构建 默认情况下,Valkey 构建时会显示用户友好的彩色输出。 如果你想查看更详细的输出,请使用以下命令: ``` % make V=1 ``` # 运行 Valkey 要使用默认配置运行 Valkey,只需输入: ``` % cd src % ./valkey-server ``` 如果你想提供自定义的 valkey.conf,你需要使用额外的参数(配置文件的路径)来运行它: ``` % cd src % ./valkey-server /path/to/valkey.conf ``` 可以通过在命令行中直接传递参数作为选项来更改 Valkey 配置。示例: ``` % ./valkey-server --port 9999 --replicaof 127.0.0.1 6379 % ./valkey-server /etc/valkey/6379.conf --loglevel debug ``` valkey.conf 中的所有选项也支持作为命令行选项使用,名称完全相同。 # 使用 TLS 运行 Valkey: ## 手动运行 要手动运行处于 TLS 模式的 Valkey 服务器(假设已调用 `./utils/gen-test-certs.sh`,因此有示例证书/密钥可用): * TLS 内置模式: ./src/valkey-server --tls-port 6379 --port 0 \ --tls-cert-file ./tests/tls/valkey.crt \ --tls-key-file ./tests/tls/valkey.key \ --tls-ca-cert-file ./tests/tls/ca.crt * TLS 模块模式: ./src/valkey-server --tls-port 6379 --port 0 \ --tls-cert-file ./tests/tls/valkey.crt \ --tls-key-file ./tests/tls/valkey.key \ --tls-ca-cert-file ./tests/tls/ca.crt \ --loadmodule src/valkey-tls.so 请注意,你可以通过显式指定 `--port 0` 来禁用 TCP。 同时启用 TCP 和 TLS 也是可能的,但你必须分配不同的端口。 使用 `valkey-cli` 连接到 Valkey 服务器: ``` ./src/valkey-cli --tls \ --cert ./tests/tls/valkey.crt \ --key ./tests/tls/valkey.key \ --cacert ./tests/tls/ca.crt ``` 指定 `--tls-replication yes` 可使副本(replica)连接到主节点(primary)。 使用 `--tls-cluster yes` 可使 Valkey Cluster 在节点间使用 TLS。 # 使用 RDMA 运行 Valkey: 请注意,Valkey Over RDMA 是一项实验性功能。 它可能会在任何次要或主要版本中被更改或移除。 目前,它仅在 Linux 上受支持。 * RDMA 内置模式: ./src/valkey-server --protected-mode no \ --rdma-bind 192.168.122.100 --rdma-port 6379 * RDMA 模块模式: ./src/valkey-server --protected-mode no \ --loadmodule src/valkey-rdma.so --rdma-bind 192.168.122.100 --rdma-port 6379 可以通过运行时命令更改 RDMA 的绑定地址/端口: ``` 192.168.122.100:6379> CONFIG SET rdma-port 6380 ``` RDMA 和 TCP 也可以同时可用,TCP(6379) 和 RDMA(6379) 之间没有冲突,例如: ``` % ./src/valkey-server --protected-mode no \ --loadmodule src/valkey-rdma.so --rdma-bind 192.168.122.100 --rdma-port 6379 \ --port 6379 ``` 请注意,网卡(本例中的 192.168.122.100)应支持 RDMA。要测试服务器是否支持 RDMA: ``` % rdma res show (a new version iproute2 package) ``` 或者: ``` % ibv_devices ``` # 体验 Valkey 你可以使用 valkey-cli 来体验 Valkey。启动一个 valkey-server 实例,然后在另一个终端中尝试以下操作: ``` % cd src % ./valkey-cli valkey> ping PONG valkey> set foo bar OK valkey> get foo "bar" valkey> incr mycounter (integer) 1 valkey> incr mycounter (integer) 2 valkey> ``` # 安装 Valkey 要将 Valkey 二进制文件安装到 /usr/local/bin,只需使用: ``` % make install ``` 如果你想使用不同的目标路径,可以使用 `make PREFIX=/some/other/directory install`。 *注意*:为了与 Redis 兼容,我们会创建从 Redis 名称(`redis-server`、`redis-cli` 等)到 `make install` 安装的 Valkey 二进制文件的符号链接。 这些符号链接创建在 Valkey 二进制文件所在的同一目录中。 使用 `make uninstall` 时会删除这些符号链接。 可以通过设置 makefile 变量 `USE_REDIS_SYMLINKS=no` 来跳过创建符号链接。 `make install` 只会在你的系统中安装二进制文件,但不会在适当的位置配置 init 脚本和配置文件。如果你只是想稍微试用一下 Valkey,这不需要,但如果你要在生产系统上正确安装它,我们提供了一个脚本,可以为 Ubuntu 和 Debian 系统完成此操作: ``` % cd utils % ./install_server.sh ``` *注意*:`install_server.sh` 无法在 macOS 上运行;它专为 Linux 设计。 该脚本会问你几个问题,并设置好运行 Valkey 所需的一切,使其作为后台守护进程运行,并在系统重启时再次启动。 你将能够使用名为 `/etc/init.d/valkey_<端口号>` 的脚本停止和启动 Valkey,例如 `/etc/init.d/valkey_6379`。 # 使用 `CMake` 构建 除了传统的 `Makefile` 构建外,Valkey 还支持使用 `CMake` 的替代**实验性**构建系统。 要在 `Release` 模式(优化构建)下构建并安装 `Valkey`,请在终端中输入: ``` mkdir build-release cd $_ cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/opt/valkey sudo make install # Valkey 现已安装在 /opt/valkey 下 ``` Valkey 的 `CMake` 构建系统支持的其他选项: ## 特殊构建标志 - `-DBUILD_TLS=` 为 Valkey 启用 TLS 构建。默认值:`no` - `-DBUILD_RDMA=` 启用 RDMA 模块构建(仅支持模块模式)。默认值:`no` - `-DBUILD_MALLOC=` 选择要使用的分配器。Linux 上默认值:`jemalloc`,其他操作系统:`libc` - `-DBUILD_SANITIZER=` 在启用地址消毒剂的情况下构建。默认值:禁用(无消毒剂) - `-DBUILD_UNIT_GTESTS=[yes|no]` 设置后,构建将生成单元测试可执行文件 `valkey-unit-gtests`。默认值:`no` - `-DBUILD_TEST_MODULES=[yes|no]` 设置后,构建将包含位于 `tests/modules` 文件夹下的模块。默认值:`no` - `-DBUILD_EXAMPLE_MODULES=[yes|no]` 设置后,构建将包含位于 `src/modules` 文件夹下的示例模块。默认值:`no` ## 通用标志 - `-DCMAKE_BUILD_TYPE=` 定义构建类型,更多详情请参见 CMake 手册 - `-DCMAKE_INSTALL_PREFIX=/installation/path` 覆盖此值以定义自定义安装前缀。默认值:`/usr/local` - `-G""` 为 "Generator Name" 生成构建文件。默认情况下,CMake 将生成 `Makefile`。 ## 详细构建 `CMake` 默认生成用户友好的彩色输出。 如果你想查看更详细的输出,请使用以下命令: ``` make VERBOSE=1 ``` ## 故障排除 在 `CMake` 阶段,`CMake` 会将变量缓存在名为 `CMakeCache.txt` 的本地文件中。Valkey 生成的所有变量在使用后都会从缓存中移除(这是通过调用 `unset(VAR-NAME CACHE)` 完成的)。然而,有些变量(如编译器路径)会保留在缓存中。要开始全新的构建,可以从构建文件夹中删除缓存文件 `CMakeCache.txt`,或者完全删除构建文件夹。 **在添加新源文件时重新运行 `CMake` 非常重要。** ## IDE 集成 在构建的 `CMake` 阶段,`CMake` 会生成一个名为 `compile_commands.json` 的 JSON 文件,并将其放置在构建文件夹下。文件被许多 IDE 和文本编辑器用于提供代码补全(通过 `clangd`)。 一个小问题是,这些工具会在 Valkey 的顶层文件夹下查找 `compile_commands.json`。 一个常见的解决方法是创建一个指向它的符号链接: ``` cd /path/to/valkey/ # 我们在此假设您的构建文件夹是 `build-release` ln -sf $(pwd)/build-release/compile_commands.json $(pwd)/compile_commands.json ``` 重启你的 IDE 即可。 # 代码贡献 请参阅 [CONTRIBUTING.md][2]。关于安全漏洞和弱点,请参阅 [SECURITY.md][3]。 # Valkey 是 LF Projects 下的开放社区项目 Valkey a Series of LF Projects, LLC 2810 N Church St, PMB 57274 Wilmington, Delaware 19802-4447
标签:Bash脚本, BSD, HTTP工具, RDMA支持, Redis替代, rizin, Sentinel, Systemd, TLS加密, Valkey, 中间件, 主从复制, 内存数据库, 分布式键值数据库, 后端开发, 大数据, 实时数据处理, 客户端加密, 底层编程, 开源, 数据挖掘, 数据结构服务器, 服务端, 目录扫描, 缓存, 网络安全审计, 键值存储