diff --git a/docs/zh/Tools/Cloud/_menu.md b/docs/zh/Tools/Cloud/_menu.md index b9abd3f5b03476036d78b1f489b1ac7426406ce2..6bf6206d835a15bbc9ffd542bb0a236e3c1979ae 100644 --- a/docs/zh/Tools/Cloud/_menu.md +++ b/docs/zh/Tools/Cloud/_menu.md @@ -4,4 +4,5 @@ children: - reference: './CTinspector/_menu.md' - reference: './CPDS/_menu.md' - reference: './PilotGo/_menu.md' + - reference: './openAMDC/_menu.md' --- diff --git a/docs/zh/Tools/Cloud/openAMDC/_menu.md b/docs/zh/Tools/Cloud/openAMDC/_menu.md new file mode 100644 index 0000000000000000000000000000000000000000..f0aeca3ed1555dfa02f68a267d7b7b6e232ad998 --- /dev/null +++ b/docs/zh/Tools/Cloud/openAMDC/_menu.md @@ -0,0 +1,12 @@ +--- +label: 'openAMDC用户指南' +ismanual: 'Y' +description: 'openAMDC 分布式缓存' +children: + - label: 'openAMDC介绍' + href: './openamdc-introduction.md' + - label: '安装与部署' + href: './installation-and-deployment.md' + - label: '使用方法' + href: './userguide.md’ +--- diff --git a/docs/zh/Tools/Cloud/openAMDC/figures/.gitkeep b/docs/zh/Tools/Cloud/openAMDC/figures/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/docs/zh/Tools/Cloud/openAMDC/figures/architecture1.png b/docs/zh/Tools/Cloud/openAMDC/figures/architecture1.png new file mode 100644 index 0000000000000000000000000000000000000000..e8cfc33d42967ac45e1588b68cf22afee8dbb0e7 Binary files /dev/null and b/docs/zh/Tools/Cloud/openAMDC/figures/architecture1.png differ diff --git a/docs/zh/Tools/Cloud/openAMDC/figures/architecture2.png b/docs/zh/Tools/Cloud/openAMDC/figures/architecture2.png new file mode 100644 index 0000000000000000000000000000000000000000..df83d6466824f92b06ae391561c5c93cb1a75aab Binary files /dev/null and b/docs/zh/Tools/Cloud/openAMDC/figures/architecture2.png differ diff --git a/docs/zh/Tools/Cloud/openAMDC/figures/image.png b/docs/zh/Tools/Cloud/openAMDC/figures/image.png new file mode 100644 index 0000000000000000000000000000000000000000..1f8c15e6ed27a6ad0e2ae98805ae369fb0e88110 Binary files /dev/null and b/docs/zh/Tools/Cloud/openAMDC/figures/image.png differ diff --git a/docs/zh/Tools/Cloud/openAMDC/figures/image1.png b/docs/zh/Tools/Cloud/openAMDC/figures/image1.png new file mode 100644 index 0000000000000000000000000000000000000000..fb36aa93a578662c639c384ea5f230ddc9ed1401 Binary files /dev/null and b/docs/zh/Tools/Cloud/openAMDC/figures/image1.png differ diff --git a/docs/zh/Tools/Cloud/openAMDC/figures/image10.png b/docs/zh/Tools/Cloud/openAMDC/figures/image10.png new file mode 100644 index 0000000000000000000000000000000000000000..4991c93f241d4c0a72ffca5adddcb2a618bf1759 Binary files /dev/null and b/docs/zh/Tools/Cloud/openAMDC/figures/image10.png differ diff --git a/docs/zh/Tools/Cloud/openAMDC/figures/image11.png b/docs/zh/Tools/Cloud/openAMDC/figures/image11.png new file mode 100644 index 0000000000000000000000000000000000000000..c4761f79ba058da0727828403d2151df19866ba5 Binary files /dev/null and b/docs/zh/Tools/Cloud/openAMDC/figures/image11.png differ diff --git a/docs/zh/Tools/Cloud/openAMDC/figures/image2.png b/docs/zh/Tools/Cloud/openAMDC/figures/image2.png new file mode 100644 index 0000000000000000000000000000000000000000..5a8c2d60848ab2ce049704b580b2b1ebc2c0fa6c Binary files /dev/null and b/docs/zh/Tools/Cloud/openAMDC/figures/image2.png differ diff --git a/docs/zh/Tools/Cloud/openAMDC/figures/image3.png b/docs/zh/Tools/Cloud/openAMDC/figures/image3.png new file mode 100644 index 0000000000000000000000000000000000000000..bca0d10aee06076d67a355762e3a15c5a56ec55c Binary files /dev/null and b/docs/zh/Tools/Cloud/openAMDC/figures/image3.png differ diff --git a/docs/zh/Tools/Cloud/openAMDC/figures/image4.png b/docs/zh/Tools/Cloud/openAMDC/figures/image4.png new file mode 100644 index 0000000000000000000000000000000000000000..3b1d61e52f17f826a20c3214ac0afd0154df2d89 Binary files /dev/null and b/docs/zh/Tools/Cloud/openAMDC/figures/image4.png differ diff --git a/docs/zh/Tools/Cloud/openAMDC/figures/image5.png b/docs/zh/Tools/Cloud/openAMDC/figures/image5.png new file mode 100644 index 0000000000000000000000000000000000000000..3b83d5831bffe7f93e7ce9b9456b47ffa613eec7 Binary files /dev/null and b/docs/zh/Tools/Cloud/openAMDC/figures/image5.png differ diff --git a/docs/zh/Tools/Cloud/openAMDC/figures/image6.png b/docs/zh/Tools/Cloud/openAMDC/figures/image6.png new file mode 100644 index 0000000000000000000000000000000000000000..6c05b1361ee60f5b6b0c3adb2b06df37dc821b4f Binary files /dev/null and b/docs/zh/Tools/Cloud/openAMDC/figures/image6.png differ diff --git a/docs/zh/Tools/Cloud/openAMDC/figures/image7.png b/docs/zh/Tools/Cloud/openAMDC/figures/image7.png new file mode 100644 index 0000000000000000000000000000000000000000..cb94b015908b4564f21ba9b6b65becc9a2475ff5 Binary files /dev/null and b/docs/zh/Tools/Cloud/openAMDC/figures/image7.png differ diff --git a/docs/zh/Tools/Cloud/openAMDC/figures/image8.png b/docs/zh/Tools/Cloud/openAMDC/figures/image8.png new file mode 100644 index 0000000000000000000000000000000000000000..587ee5eefbefc026a76f1508bbcb34f64c306eeb Binary files /dev/null and b/docs/zh/Tools/Cloud/openAMDC/figures/image8.png differ diff --git a/docs/zh/Tools/Cloud/openAMDC/figures/image9.png b/docs/zh/Tools/Cloud/openAMDC/figures/image9.png new file mode 100644 index 0000000000000000000000000000000000000000..7e823694a198ab26343afab0f5ca4daa829dacc1 Binary files /dev/null and b/docs/zh/Tools/Cloud/openAMDC/figures/image9.png differ diff --git a/docs/zh/Tools/Cloud/openAMDC/installation-and-deployment.md b/docs/zh/Tools/Cloud/openAMDC/installation-and-deployment.md new file mode 100644 index 0000000000000000000000000000000000000000..d81c3a8f8f246c648f8b4caf8ba2f0a9a3b0ee1e --- /dev/null +++ b/docs/zh/Tools/Cloud/openAMDC/installation-and-deployment.md @@ -0,0 +1,183 @@ +# 安装与部署 + +## 构建openAMDC + +openAMDC可以在Linux、OSX、OpenBSD、NetBSD、FreeBSD上编译和使用,并支持大端序和小端序架构, +以及32位和64位系统。 + +可以使用以下命令编译openAMDC: + +```shell +make +``` + +如果构建时需要TLS支持,您将需要在系统中安装OpenSSL开发库(例如在 Debian/Ubuntu 上的 libssl-dev)并运行: + +```shell +make BUILD_TLS=yes +``` + +如果构建时需要systemd支持,您将需要在系统中安装systemd开发库(比如在 Debian/Ubuntu上的libsystemd-dev或者在 +CentOS上的systemd-devel)并运行: + +```shell +make USE_SYSTEMD=yes +``` + +要给openAMDC程序名添加一个后缀,使用: + +```shell +make PROG_SUFFIX="-alt" +``` + +您可以使用以下方式构建一个32位的openAMDC二进制文件: + +```shell +make 32bit +``` + +在构建openAMDC之后,使用以下方式对其进行测试: + +```shell +make test +``` + +如果构建时使用了TLS选项,测试时需启用TLS来运行测试(需要安装“tcl-tls”): + +```shell +./utils/gen-test-certs.sh +./runtest --tls +``` + +## 修复与依赖项或缓存构建选项相关的问题 + +openAMDC 有一些依赖项,它们包含在`deps`目录中,`make`不会自动重新构建依赖项,即使依赖项的源代码中有某些东西发生了变化。 + +当您使用`git pull`更新源代码,或依赖项内的代码以任何方式被修改时,确保使用以下命令来真正清理所有内容并从头开始重新构建: + +```shell +make distclean +``` + +这个命令将清理: jemalloc, lua, hiredis, linenoise. + +此外,如果您强制更新了某些构建选项,如32位目标、关闭C编译器优化(出于调试目的)以及其他类似的构建时间选项,这些选项会被无限期 +地缓存,直到您发出`make distclean`命令。 + +## 修复构建32位二进制文件问题 + +如果在以32位目标构建openAMDC之后,你需要以64位目标重新构建它,反过来也是一样的,您需要在openAMDC的根目录执行`make distclean`。 + +如果在尝试构建32位的openAMDC二进制文件出现构建错误时,请尝试以下步骤: + +* 安装软件包libc6-dev-i386(也可以尝试 g++-multilib)。 +* 尝试使用以下命令行来代替`make 32bit`: `make CFLAGS="-m32 -march=native" LDFLAGS="-m32`。 + +## 内存分配器 + +在构建openAMDC时选择非默认的内存分配器是通过设置`MALLOC`境变量来完成的。默认情况下,openAMDC是使用libc分配器进行编译和链接的, +但在Linux系统上,jemalloc是默认使用的。选择这个默认是因为jemalloc比libc分配器有更少的的内存碎片化问题。 + +要强制使用libc分配器进行编译,使用: + +```shell +make MALLOC=libc +``` + +要在Mac OSX系统上使用jemalloc进行编译,使用: + +```shell +make MALLOC=jemalloc +``` + +## 单调时钟 + +默认情况下,openAMDC将使用POSIX clock_gettime函数作为单调时钟源进行构建。在大多数现代系统中,可以使用内部处理器时钟来提高性能。 +注意事项可在此处找到: + +```shell + http://oliveryang.net/2015/09/pitfalls-of-TSC-usage/ +``` + +要构建以支持处理器的内部指令时钟,使用: + +```shell +make CFLAGS="-DUSE_PROCESSOR_CLOCK" +``` + +## 详细构建 + +openAMDC 默认会以用户友好的彩色输出进行构建。如果你想看到更详细的输出,使用以下方式: + +```shell +make V=1 +``` + +## 运行openAMDC + +要使用默认配置运行 openAMDC,只需输入: + +```shell +cd src +./openamdc-server +``` + +如果您想要使用您的openamdc.conf,您必须使用一个额外的参数(配置文件的路径)来运行它: + +```shell +cd src +./openamdc-server /path/to/openamdc.conf +``` + +可以通过在命令行上直接将参数作为选项传递来更改openAMDC配置。示例: + +```shell +./openamdc-server --port 9999 --replicaof 127.0.0.1 6379 +./openamdc-server /etc/openamdc/6379.conf --loglevel debug +``` + +openamdc.conf中的所有选项也都可以作为命令行选项,名称完全相同。 + +## 使用openAMDC + +您可以使用openamdc-cli来与openAMDC互动。启动一个openamdc-server实例,然后在另一个终端尝试以下操作: + +```shell +cd src +./openamdc-cli +openamdc> ping +PONG +openamdc> set foo bar +OK +openamdc> get foo +"bar" +openamdc> incr mycounter +(integer) 1 +openamdc> incr mycounter +(integer) 2 +openamdc> +``` + +## 安装openAMDC + +为了将openAMDC二进制文件安装到/usr/local/bin, 只需使用: + +```shell +make install +``` + +如果您希望安装到一个自定义路径,您可以使用`make PREFIX=/some/other/directory install`。 + +`make install`只会在你的系统中安装二进制文件,但不会在适当位置配置初始化脚本和配置文件。如果您只是想简单试用一下openAMDC, +这是不需要的,但如果你要以正确的方式为生产系统进行安装,我们有一个针对Ubuntu和Debian系统的脚本可以做到这一点: + +```shell +cd utils +./install_server.sh +``` + +注意:`install_server.sh`在Mac OSX上不起作用;它仅为 Linux 构建。 + +该脚本会问你几个问题,并将设置好您需要的一切,以便将openAMDC正确地作为一个后台守护进程运行,该进程会在系统重启时再次启动。 + +您将能够使用名为/etc/init.d/openamdc_\的脚本停止和启动openAMDC,例如/etc/init.d/openamdc_6379。 diff --git a/docs/zh/Tools/Cloud/openAMDC/openamdc-introduction.md b/docs/zh/Tools/Cloud/openAMDC/openamdc-introduction.md new file mode 100644 index 0000000000000000000000000000000000000000..67ecf90567c78db041db7161f74a71ebb67919f0 --- /dev/null +++ b/docs/zh/Tools/Cloud/openAMDC/openamdc-introduction.md @@ -0,0 +1,46 @@ +# openAMDC介绍 + +## 概述 + +openAMDC分布式缓存软件(open Advanced In-Memory Data Cache,简称:oepnAMDC)是一款开源高性能、泛场景、大容量的分布式缓存系统,主要适用于高并发、分布式、高频数据存取等系统场景,为关键应用提供安全可靠的缓存支撑能力,并兼容Redis协议与持久化数据文件,能实现简单快捷平稳替换Redis。以下是openAMDC与Redis相比主要的改进: + +* 多线程架构:openAMDC采用多线程架构,支持多线程并发处理请求,相较于redis的多线程架构,openAMDC在并发性能上具备并发程度更高,吞吐量更大,延迟更低等特点。这些特性使 openAMDC能够更为充分地调用CPU资源,确保在高负载情况下,依然能够高效且稳定地处理各类请求,极大提升系统整体运行效率。 + +* 数据交换架构: Redis使用内存作为存储介质,具有良好的性能和低延迟,但其内存容量通常成为瓶颈,且内存价格较高,导致Redis使用成本较高。openAMDC在多线程架构的基础上扩展数据交换功能,实现openAMDC数据冷热多级存储,降低缓存的综合使用成本。 + +## 架构 + +### 功能架构 + +openAMDC内置高性能Key-Value数据库、权限控制功能、发布订阅模式,支持LUA脚本操作、数据持久化、三种高可用模式、冷热数据替换等功能. + +![Architecture](figures/architecture1.png) + +### 软件架构 + +openAMDC软件架构有以下五个特点: + +* 高性能:拥有高性能的数据存取能力,使用网络层多线程并发架构。 +* 高可靠性:提供了复制复制功能,提高容错率;集群节点支持自动发现、故障探测、自动故障切换、数据迁移等能力,极大降低运维成本。 +* 高安全性:支持ACL(访问控制列表),细化用户访问权限,严格限制用户可访问的数据与可使用功能,确保数据访问安全;支持TLS算法双向加密传输数据,保障数据安全。 +* 高兼容性:兼容redis协议与功能,兼容主流编程语言的redis客户端,迁移成本极低;支持JAVA/GO/Python/C/C++等多种编程语言的客户端。 +* 高存储容量:支持借助RocksDB将数据存储无缝扩展至存储器,显著提升缓存的可用容量,大幅降低缓存的综合使用成本,实现更为经济高效的存储方案。 + +![Architecture](figures/architecture2.png) + +## 特性 + +| 特性 | 特性说明 | +| ---- | ---------- | +| 数据类型 | 提供string、list、hash、set、sortedset、GEO、hyperloglog、stream的数据缓存类型支持 | +| 发布订阅 | 实现了发布订阅功能,增强系统功能性 | +| ACL权限管控 | 为服务提供了安全的访问机制,支持细粒度的访问权限控制 | +| 内存数据淘汰策略 | 提供多种数据淘汰策略,满足多种数据淘汰要求,提高内存利用率 | +| 持久化 | 为缓存核心提高可用性,防止在宕机时丢失数据 | +| Lua脚本支持 | 支持使用lua脚本操作缓存核心 | +| TLS支持 | 支持使用TLS加密通信 | +| 主从模式 | 支持主从备份 | +| 哨兵模式 | 为主从模式提供节点监控、自动故障转移、故障通知、配置传播功能 | +| 集群模式 | 支持弹性伸缩(内存的扩/缩容),并且同时具备了故障转移功能 | +| 多线程支持 | 支持多线程并发请求处理,提升系统吞吐量 | +| 冷热数据交换功能 | 支持利用rocksdb将数据扩展至DRAM容量之外,显著扩大存储容量,降低缓存综合使用成本 | diff --git a/docs/zh/Tools/Cloud/openAMDC/userguide.md b/docs/zh/Tools/Cloud/openAMDC/userguide.md new file mode 100644 index 0000000000000000000000000000000000000000..68636997db05bd0682a37b22436149a3cf9e2206 --- /dev/null +++ b/docs/zh/Tools/Cloud/openAMDC/userguide.md @@ -0,0 +1,1002 @@ +# openAMDC使用手册 + +## openAMDC核心使用介绍 + +| 命令 | 说明 | +| ---- | ---------- | +| ACL LOAD | 从配置的ACL文件中重新加载ACL | +| ACL SAVE | 在已配置的ACL文件中保存当前的ACL规则 | +| ACL LIST | 列出ACL配置文件格式的当前ACL规则 | +| ACL USERS | 列出所有已配置的ACL规则的用户名 | +| ACL GETUSER username | 获取特定ACL用户的规则 | +| ACL SETUSER username [rule [rule ...]] | 修改或创建特定ACL用户的规则 | +| ACL DELUSER username [username ...] | 删除指定的ACL用户和相关规则 | +| ACL CAT [categoryname] | 列出类别内的ACL类别或命令 | +| ACL GENPASS [bits] | 为ACL用户生成伪谐像安全密码 | +| ACL WHOAMI | 返回与当前连接关联的用户的名称 | +| ACL LOG [count or RESET] | 列出最新的ACL安全事件 | +| ACL HELP | 显示有关不同的子命令的有用文本 | +| APPEND key value | 将值附加到键 | +| ASKING | 在ask重定向后由群集客户端发送 | +| AUTH [username] password | 对服务器进行身份验证 | +| BGREWRITEAOF | 异步重写仅附加文件 | +| BGSAVE [SCHEDULE] | 异步将数据集保存到磁盘 | +| BITCOUNT key [start end [BYTE \| BIT]] | 计数字符串中的设置位 | +| BITFIELD key [GET encoding offset] [SET encoding offset value] [INCRBY encoding offset increment] [OVERFLOW WRAP\|SAT\|FAIL] | 在字符串上执行任意位字段整数操作 | +| BITFIELD_RO key GET encoding offset | 在字符串上执行任意位字段整数操作,禁区的只读变体 | +| BITOP operation destkey key [key ...] | 在字符串之间执行按位操作 | +| BITPOS key bit [start [end [BYTE\|BIT]]] | 在字符串中找到第一个位设置或清除 | +| BLPOP key [key ...] timeout | 阻塞式删除并返回第一个元素 | +| BRPOP key [key ...] timeout | 阻塞式删除并返回最后一个元素 | +| BRPOPLPUSH source target timeout | 从列表中取出最后一个元素,并插入到另外一个列表的头部; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 | +| BLMOVE source destination FROM-TOP\|FROM-BOTTOM TO-TOP \| TO-BOTTOM timeout | 阻塞式返回并删除存储在源列表的第一个或最后一个元素(头尾取决于wherefrom参数),并将该元素压入到存储目标列表的第一个或最后一个元素(头尾取决于whereto参数) | +| LMPOP numkeys key [key ...] LEFT\|RIGHT [COUNT count] | 从提供的键名列表中弹出第一个非空列表键中的一个或多个元素 | +| BLMPOP timeout numkeys key [key ...] LEFT\|RIGHT [COUNT count] | 阻塞式从提供的键名列表中弹出第一个非空列表键中的一个或多个元素;或阻塞连接直到另一个客户端推送到它或直到超时 | +| BZPOPMIN key [key ...] timeout | 阻塞式删除并将成员从一个或多个有序集中返回最低分数,或阻塞连接直到另一个客户端推送到它或直到超时 | +| BZPOPMAX key [key ...] timeout | 阻塞式删除并将成员从一个或多个有序集中返回最高分数,或阻塞连接直到另一个客户端推送到它或直到超时 | +| CLIENT CACHING YES\|NO | 指示服务器在下一个请求中跟踪或不键 | +| CLIENT ID | 返回当前连接的客户端ID | +| CLIENT INFO | 返回有关当前客户端连接的信息 | +| CLIENT KILL [ip:port] [ID client-id] [TYPE normal\|master\|slave\|pubsub] [USER username] [ADDR ip:port] [LADDR ip:port] [SKIPME yes/no] | 杀死客户的连接 | +| CLIENT LIST [TYPE normal\|master\|replica\|pubsub] [ID client-id [client-id ...]] | 获取客户端连接列表 | +| CLIENT GETNAME | 获取当前的连接名称 | +| CLIENT GETREDIR | 获取跟踪通知重定向客户端ID(如果有)| +| CLIENT UNPAUSE | 恢复暂停的客户的处理 | +| CLIENT PAUSE timeout [WRITE\|ALL] | 停止客户端的处理命令一段时间 | +| CLIENT REPLY ON\|OFF\|SKIP | 指示服务器是否回复命令 | +| CLIENT SETNAME connection-name | 设置当前连接名称 | +| CLIENT TRACKING ON\|OFF [REDIRECT client-id] [PREFIX prefix [PREFIX prefix ...]] [BCAST] [OPTION] [OPTOUT] [NOLOOP] | 启用或禁用服务器辅助客户端缓存支持 | +| CLIENT TRACKINGINFO | 返回关于当前连接的服务器辅助客户端缓存的信息 | +| CLIENT UNBLOCK client-id [TIMEOUT\|ERROR] | 取消阻止从不同连接中阻止阻止命令的客户端 | +| COMMAND | 获取openAMDC命令详细信息数组 | +| COMMAND COUNT | 获取命令的总数 | +| COMMAND GETKEYS | 给定完整的openAMDC命令提取键 | +| COMMAND INFO command-name [command-name ...] | 获取特定命令详细信息的数组 | +| CONFIG GET parameter [parameter ...] | 获取配置参数的值 | +| CONFIG REWRITE | 用内存配置重写配置文件 | +| CONFIG SET parameter value [parameter value ...] | 将配置参数设置为给定的值 | +| CONFIG RESETSTAT | 重置 INFO 返回的统计信息 | +| COPY source destination [DB destination-db] [REPLACE] | 复制一个键 | +| DBSIZE | 返回所选数据库中的键数 | +| DEBUG OBJECT key | 获取有关键的调试信息 | +| DEBUG SEGFAULT | 使服务器崩溃 | +| DECR key | 一个键的整数值减一 | +| DECRBY key decrement | 按给定的数字减少一个键的整数值 | +| DEL key [key ...] | 删除一个键 | +| DISCARD | 放弃在多次执行后发出的所有命令 | +| DUMP key | 返回存储在指定键中的值的序列化版本 | +| ECHO message | 回显给定的字符串 | +| EVAL script numkeys [key [key ...]] [arg [arg ...]] | 执行一个Lua脚本服务器端 | +| EVALSHA sha1 numkeys [key [key ...]] [arg [arg ...]] | 执行 Lua 脚本服务器端 | +| EXEC | 执行 MULTI | +| EXISTS key [key ...] | 判断key是否存在 | +| EXPIRE key seconds [NX\|XX\|GT\|LT] | 以秒为单位设置键的生存时间 | +| EXPIREAT key timestamp [NX\|XX\|GT\|LT] | 将键的到期时间设置为UNIX时间戳 | +| EXPIRETIME key | 获取键的到期 Unix 时间戳 | +| FAILOVER [TO host port [FORCE]] [ABORT] [TIMEOUT milliseconds] | 在此服务器与其副本之一之间启动协调故障转移 | +| FLUSHALL [ASYNC\|SYNC] | 从所有数据库中删除所有键 | +| FLUSHDB [ASYNC\|SYNC] | 从当前数据库中删除所有键 | +| GEOADD key [NX\|XX] [CH] longitude latitude member [longitude latitude member ...] | 在使用有序集表示的地理空间索引中添加一个或多个地理空间项目 | +| GEOHASH key member [member ...] | 将地理空间索引的成员作为标准geohash字符串返回 | +| GEOPOS key member [member ...] | 返回地理空间索引成员的经度和纬度 | +| GEODIST key member1 member2 [m\|km\|ft\|mi] | 返回地理空间索引的两个成员之间的距离 | +| GEORADIUS key longitude latitude radius m\|km\|ft\|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC\|DESC] [STORE key] [STOREDIST key] | 查询表示地理空间索引的有序集,以获取与点的给定最大距离匹配的成员 | +| GEORADIUSBYMEMBER key member radius m\|km\|ft\|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC\|DESC] [STORE key] [STOREDIST key] | 查询表示地理空间索引的有序集以获取与成员的给定最大距离匹配的成员 | +| GEOSEARCH key [FROMMEMBER member] [FROMLONLAT longitude latitude] [BYRADIUS radius m\|km\|ft\|mi] [BYBOX width height m\|km\|ft\|mi] [ASC\|DESC] [COUNT count [ANY]] [WITHCOORD] [WITHDIST] [WITHHASH] | 查询表示地理空间索引的有序集以获取框或圆区域内的成员 | +| GEOSEARCHSTORE destination source [FROMMEMBER member] [FROMLONLAT longitude latitude] [BYRADIUS radius m\|km\|ft\|mi] [BYBOX width height m\|km\|ft\|mi] [ASC\|DESC] [COUNT count [ANY]] [STOREDIST] | 查询表示地理空间索引的有序集以获取框或圆区域内的成员,并将结果存储在另一个键中 | +| GET key | 获取一个键的值 | +| GETBIT key offset | 返回存储在key | +| GETDEL key | 的字符串值中偏移量处的位值,获取某个key的值并删除key | +| GETRANGE key start end | 获取存储在键中的字符串的子字符串 | +| GETSET key value | 设置一个键的字符串值并返回它的旧值 | +| HDEL key field [field ...] | 删除一个或多个哈希字段 | +| HELLO [protover [AUTH username password] [SETNAME clientname]] | 与openAMDC握手 | +| HEXISTS key field | 判断一个hash字段是否存在 | +| HGET key field | 获取哈希字段的值 | +| HGETALL key | 获取哈希中的所有字段和值 | +| HINCRBY key field increment | 将散列字段的整数值增加给定的数字 | +| HINCRBYFLOAT key field increment | 将哈希字段的浮点值增加给定的数量 | +| HKEYS key | 获取散列中的所有字段 | +| HLEN key | 获取哈希中的字段数 | +| HMGET key field [field ...] | 获取所有给定哈希字段的值 | +| HMSET key field value [field value ...] | 将多个哈希字段设置为多个值 | +| HSET key field value [field value ...] | 设置一个哈希字段的字符串值 | +| HSETNX key field value | 设置一个哈希字段的值,仅当该字段不存在时 | +| HRANDFIELD key [count [WITHVALUES]] | 从散列中获取一个或多个随机字段 | +| HSTRLEN key field | 取哈希字段值的长度 | +| HVALS key | 获取散列中的所有值 | +| INCR key | 键的整数值加一 | +| INCRBY key increment | 将键的整数值增加给定的数量 | +| INCRBYFLOAT key increment | 将键的浮点值增加给定的数量 | +| INFO [section] | 获取有关服务器的信息和统计信息 | +| LOLWUT [VERSION version] | 展示一些计算机艺术和openAMDC版本 | +| KEYS pattern | 找到所有匹配给定模式的键 | +| LASTSAVE | 获取上次成功保存到磁盘的 UNIX 时间戳 | +| LINDEX key index | 通过索引从列表中获取元素 | +| LINSERT key BEFORE\|AFTER pivot element | 在列表中的另一个元素之前或之后插入一个元素 | +| LLEN key | 获取列表的长度 | +| LPOP key [count] | 删除并获取列表中的第一个元素 | +| LPOS key element [RANK rank] [COUNT num-matches] [MAXLEN len] | 返回列表中匹配元素的索引 | +| LPUSH key element [element ...] | 将一个或多个元素添加到列表中 | +| LPUSHX key element [element ...] | 将元素添加到列表中,仅当列表存在时 | +| LRANGE key start stop | 从列表中获取一系列元素 | +| LREM key count element | 从列表中删除元素 | +| LSET key index element | 通过索引设置列表中元素的值 | +| LTRIM key start stop | 将列表修剪到指定范围 | +| MEMORY DOCTOR | 输出内存问题报告 | +| MEMORY HELP | 显示有关不同子命令的有用文本 | +| MEMORY MALLOC-STATS | 显示分配器内部统计信息 | +| MEMORY PURGE | 要求分配器释放内存 | +| MGET key [key ...] | 获取所有给定键的值 | +| MIGRATE host port key\|destination-db timeout [COPY] [REPLACE] [AUTH password] [AUTH2 username password] [KEYS key [key ...]] | 以原子方式将键从openAMDC实例传输到另一个实例 | +| MONITOR | 实时监听服务器收到的所有请求 | +| MOVE key db | 移动一个键到另一个数据库 | +| MSET key value [key value ...] | 将多个键设置为多个值 | +| MSETNX key value [key value ...] | 仅当不存在任何键时才将多个键设置为多个值 | +| MULTI | 标记一个事务块的开始 | +| OBJECT ENCODING key | 检查openAMDC对象的内部编码 | +| OBJECT FREQ key | 获取Redis对象的对数访问频率计数器 | +| OBJECT IDLETIME key | 获取自上次访问openAMDC对象以来的时间 | +| OBJECT REFCOUNT key | 获取键值的引用次数 | +| OBJECT HELP | 显示有关不同子命令的有用文本 | +| PERSIST key | 从键中删除过期时间 | +| PEXPIRE key milliseconds [NX\|XX\|GT\|LT] | 以毫秒为单位设置键的生存时间 | +| PEXPIREAT key milliseconds-timestamp [NX\|XX\|GT\|LT] | 将键的到期时间设置为以毫秒为单位指定的UNIX时间戳 | +| PEXPIRETIME key | 以毫秒为单位获取键的到期Unix时间戳 | +| PFADD key [element [element ...]] | 将指定的元素添加到指定的HyperLogLog | +| PFCOUNT key [key ...] | 返回HyperLogLog在key(s)处观察到的集合的近似基数 | +| PFMERGE destkey sourcekey [sourcekey ...] | 将N个不同的HyperLogLog合并为一个 | +| PING [message] | Ping 服务器 | +| PSETEX key milliseconds value | 以毫秒为单位设置键值和过期时间 | +| PSUBSCRIBE pattern [pattern ...] | 侦听发布到与给定模式匹配的频道的消息 | +| PUBSUB CHANNELS [pattern] | 列出活动频道 | +| PUBSUB NUMPAT | 获取独特模式模式订阅的计数 | +| PUBSUB NUMSUB [channel [channel ...]] | 获取频道的订阅者数量 | +| PUBSUB HELP | 显示有用的文字输出不同的子命令 | +| PTTL key | 以毫秒为单位获取键的生存时间 | +| PUBLISH channel message | 向频道发布消息 | +| PUNSUBSCRIBE [pattern [pattern ...]] | 停止收听发布到与给定模式匹配的频道的消息 | +| QUIT | 关闭连接 | +| RANDOMKEY | 从键空间返回一个随机键 | +| READONLY | 启用对集群副本节点连接的读取查询 | +| READWRITE | 禁用对集群副本节点连接的读取查询 | +| RENAME key newkey | 重命名一个键 | +| RENAMENX key newkey | 重命名键,仅当新键不存在时 | +| RESET | 重置连接 | +| RESTORE key ttl serialized-value [REPLACE] [ABSTTL] [IDLETIME seconds] [FREQ frequency] | 使用提供的序列化值创建一个键,之前使用DUMP获得 | +| ROLE | 返回实例在复制上下文中的角色 | +| RPOP key [count] | 删除并获取列表中的最后一个元素 | +| RPOPLPUSH source destination | 删除列表中的最后一个元素,将其添加到另一个列表中并返回它 | +| LMOVE source destination LEFT\|RIGHT LEFT\|RIGHT | 从列表中弹出一个元素,将其推送到另一个列表并返回它 | +| RPUSH key element [element ...] | 将一个或多个元素附加到列表中 | +| RPUSHX key element [element ...] | 仅当列表存在时才将元素附加到列表中 | +| SADD key member [member ...] | 将一个或多个成员添加到集合中 | +| SAVE | 将数据集同步保存到磁盘 | +| SCARD key | 获取集合中的成员数量 | +| SCRIPT DEBUG YES\|SYNC\|NO | 为执行的脚本设置调试模式 | +| SCRIPT EXISTS sha1 [sha1 ...] | 检查脚本缓存中是否存在脚本 | +| SCRIPT FLUSH [ASYNC\|SYNC] | 从脚本缓存中删除所有脚本 | +| SCRIPT KILL | 终止当前正在执行的脚本 | +| SCRIPT LOAD script | 将指定的 Lua 脚本加载到脚本缓存中 | +| SDIFF key [key ...] | 减去多组 | +| SDIFFSTORE destination key [key ...] | 减去多个集合并将结果集合存储在一个键中 | +| SELECT index | 更改当前连接选择的数据库 | +| SET key value [EX seconds\|PX milliseconds\|EXACT timestamp\|PXAT milliseconds-timestamp\|KEEPTTL] [NX\|XX] [GET] | 设置一个键的字符串值 | +| SETBIT key offset value | 设置或清除存储在 key | +| SETEX key seconds value | 设置一个键的值和过期时间 | +| SETNX key value | 设置键的值,仅当键不存在时 | +| SETRANGE key offset value | 从指定的偏移量开始覆盖键处的部分字符串 | +| SHUTDOWN [NOSAVE\|SAVE] | 将数据集同步保存到磁盘,然后关闭服务器 | +| SINTER key [key ...] | 返回由所有给定集合的交集产生的集合的成员 | +| SINTERCARD numkeys key [key ...] [LIMIT limit] | 将多个集合相交并返回结果的基数 | +| SINTERSTORE destination key [key ...] | 将多个集合相交并将结果集存储在一个键中 | +| SISMEMBER key member [member ...] | 返回每个成员是否为存储在key处的集合的成员 | +| REPLICAOF host port | 使服务器成为另一个实例的副本,或将其提升为主服务器 | +| SLOWLOG GET [count] | 获取慢日志的条目 | +| SLOWLOG LEN | 获取慢日志的长度 | +| SLOWLOG RESET | 清除慢日志中的所有条目 | +| SLOWLOG HELP | 显示有关不同子命令的有用文本 | +| SMEMBERS key | 集齐所有成员 | +| SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC\|DESC] [ALPHA] [STORE destination] | 对列表、集合或有序集合中的元素进行排序 | +| SORT_RO key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC\|DESC] [ALPHA] | 对列表、集合或有序集合中的元素进行排序, SORT的只读变体 | +| SPOP key [count] | 从集合中删除并返回一个或多个随机成员 | +| SRANDMEMBER key [count] | 从集合中获取一个或多个随机成员 | +| STRLEN key | 获取存储在键中的值的长度 | +| SUBSCRIBE channel [channel ...] | 收听发布到给定频道的消息 | +| SUNION key [key ...] | 返回所有给定集合的并集所产生的集合的成员 | +| SUNIONSTORE destination key [key ...] | 返回所有给定集合的并集并存储到指定集合中 | +| SWAPDB index1 index2 | 交换两个数据库 | +| SYNC | 内部命令,从主站发起复制流 | +| PSYNC replicationid offset | 内部命令,从主站发起复制流 | +| TIME | 返回当前服务器时间 | +| TOUCH key [key ...] | 更改键的最后访问时间,返回指定的现有键的数量 | +| TTL key | 在几秒钟内获得一把钥匙的生存时间 | +| TYPE key | 确定存储在 key 的类型 | +| UNSUBSCRIBE [channel [channel ...]] | 停止收听发布到给定频道的消息 | +| UNLINK key [key ...] | 在另一个线程中异步删除一个键,否则它就像DEL一样,但非阻塞 | +| UNWATCH | 忘记所有观看过的钥匙吧 | +| WAIT numreplicas timeout | 等待同步复制当前连接上下文中发送的所有写命令 | +| WATCH key [key ...] | 观察给定的键以确定 MULTI/EXEC 块的执行 | +| ZADD key [NX\|XX] [GT\|LT] [CH] [INCR] score member [score member ...] | 将一个或多个成员添加到有序集中,或者如果它已经存在则更新其分数 | +| ZCARD key | 获取有序集合中的成员数量 | +| ZCOUNT key min max | 用给定值内的分数计算有序集中的成员 | +| ZDIFF numkeys key [key ...] [WITHSCORES] | 减去多个有序集 | +| ZDIFFSTORE destination numkeys key [key ...] | 减去多个有序集并将结果有序集存储在一个新键中 | +| ZINCRBY key increment member | 在有序集中增加成员的分数 | +| ZINTERCARD numkeys key [key ...] [LIMIT limit] | 将多个有序集合相交并返回结果的基数 | +| ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM\|MIN\|MAX] | 将多个有序集相交并将结果有序集存储在一个新键中 | +| ZLEXCOUNT key min max | 计算给定字典范围内有序集中的成员数量 | +| ZPOPMAX key [count] | 删除并返回有序集中得分最高的成员 | +| ZPOPMIN key [count] | 删除并返回有序集中得分最低的成员 | +| ZMPOP numkeys key [key ...] MIN\|MAX [COUNT count] | 删除并返回具有有序集中分数的成员 | +| ZRANDMEMBER key [count [WITHSCORES]] | 从有序集合中获取一个或多个随机元素 | +| ZRANGESTORE dst src min max [BYSCORE\|BYLEX] [REV] [LIMIT offset count] | 将有序集合中的一系列成员存储到另一个键中 | +| ZRANGE key min max [BYSCORE\|BYLEX] [REV] [LIMIT offset count] [WITHSCORES] | 返回有序集合中的一系列成员 | +| ZRANGEBYLEX key min max [LIMIT offset count] | 返回成员范围rs 在一个有序的集合中,按字典序排列 | +| ZREVRANGEBYLEX key max min [LIMIT offset count] | 返回有序集中的成员范围,按字典序范围,从高到低的字符串排序 | +| ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] | 按分数返回有序集中的一系列成员 | +| ZRANK key member | 确定有序集合中成员的索引 | +| ZREM key member [member ...] | 从有序集中删除一个或多个成员 | +| ZREMRANGEBYLEX key min max | 删除给定字典范围之间有序集中的所有成员 | +| ZREMRANGEBYRANK key start stop | 删除给定索引内有序集中的所有成员 | +| ZREMRANGEBYSCORE key min max | 删除给定分数内有序集中的所有成员 | +| ZREVRANGE key start stop [WITHSCORES] | 按索引返回有序集中的一系列成员,分数从高到低排序 | +| ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count] | 按分数返回有序集中的一系列成员,分数从高到低排序 | +| ZREVRANK key member | 确定一个有序集合中某个成员的索引,分数从高到低排序 | +| ZSCORE key member | 在有序集中获取与给定成员关联的分数 | +| ZMSCORE key member [member ...] | 获取与有序集中的给定成员相关联的分数 | +| ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM\|MIN\|MAX] | 添加多个有序集并将结果有序集存储在一个新键中 | +| SCAN cursor [MATCH pattern] [COUNT count] [TYPE type] | 增量迭代键空间 | +| SSCAN key cursor [MATCH pattern] [COUNT count] | 增量迭代Set元素 | +| HSCAN key cursor [MATCH pattern] [COUNT count] | 增量迭代哈希字段和关联值 | +| ZSCAN key cursor [MATCH pattern] [COUNT count] | 增量迭代已排序的集合元素和相关分数 | +| XINFO CONSUMERS key groupname | 列出消费者组中的消费者 | +| XINFO GROUPS key | 列出流的消费者组 | +| XINFO STREAM key [FULL [COUNT count]] | 获取有关流的信息 | +| XINFO HELP | 显示有关不同子命令的有用文本 | +| XADD key [NOMKSTREAM] [MAXLEN\|MINID [=\|~] threshold [LIMIT count]] *\|ID field value [field value ...] | 将新条目附加到流中 | +| XTRIM key MAXLEN\|MINID [=\|~] threshold [LIMIT count] | 将流修剪到(大约如果 '~' 被传递)特定大小 | +| XDEL key ID [ID ...] | 从流中删除指定的条目,返回实际删除的项目数,如果某些ID不存在,则可能与传递的ID数不同 | +| XRANGE key start end [COUNT count] | 返回流中的一系列元素,其ID与指定的ID间隔相匹配 | +| XREVRANGE key end start [COUNT count] | 与XRANGE相比,以相反的顺序(从较大到较小的 ID)返回流中的一系列元素,其中ID与指定的ID间隔匹配 | +| XLEN key | 返回流中的条目数 | +| XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...] | 返回多个流中从未见过的元素,其ID大于调用者为每个流报告的ID,可以屏蔽 | +| XGROUP CREATE key groupname id\|$ [MKSTREAM] | 创建一个消费者组 | +| XGROUP CREATECONSUMER key groupname consumername | 在消费者组中创建消费者 | +| XGROUP DELCONSUMER key groupname consumername | 从消费者组中删除消费者 | +| XGROUP DESTROY key groupname | 销毁一个消费组 | +| XGROUP SETID key groupname id\|$ | 将消费者组设置为任意最后交付的ID值 | +| XGROUP HELP | 显示有关不同子命令的有用文本 | +| XREADGROUP GROUP group consumer [COUNT count] [BLOCK milliseconds] [NOACK] STREAMS key [key ...] ID [ID ...] | 使用消费者组从流中返回新条目,或访问给定消费者的待处理条目的历史记录,可以屏蔽 | +| XACK key group ID [ID ...] | 将待处理消息标记为正确处理,有效地将其从消费者组的待处理条目列表中删除,该命令的返回值是成功确认的消息数,即我们在 PEL 中实际能够解析的ID | +| XCLAIM key group consumer min-idle-time ID [ID ...] [IDLE ms] [TIME ms-unix-time] [RETRYCOUNT count] [FORCE] [JUSTID] | 在流消费者组的上下文中,此命令更改挂起消息的所有权,以便新的所有者是作为命令参数指定的消费者 | +| XAUTOCLAIM key group consumer min-idle-time start [COUNT count] [JUSTID] | 在流消费者组的上下文中,此命令自动更改挂起消息的所有权,以便新的所有者是作为命令参数指定的消费者 | +| XPENDING key group [[IDLE min-idle-time] start end count [consumer]] | 从流消费者组待处理条目列表中返回信息和条目,即获取但从未确认的消息 | +| SWAP where key | swap-enabled模式下查询key所在位置 | +| SWAP in key | swap-enabled模式下将key从存储器写入内存 | +| SWAP out key | swap-enabled模式下将key从内存写入存储器 | + +## 配置项说明 + +| 参数名称 | 说明 | 默认值 | +| ----- | ------- |------| +| include | 在此处导入一个或多个其他配置文件 | /path/to/local.conf | +| loadmodule | 在启动时加载模块。如果服务器无法加载模块,将中止启动 | /path/to/my_module.so | +| bind | 指定服务器监听的IP地址,默认监听所有可用的网络接口 | 127.0.0.1 -::1 | +| port | 指定服务器监听的端口号,默认是6379 | 6379 | +| tcp-backlog | 用于设置TCP监听套接字的backlog大小 | 511 | +| timeout | 设置客户端超时时间 | 0 | +| tcp-keepalive | 用于控制TCP连接的保活机制,合理配置tcp-keepalive可以有效地管理连接资源,及时释放无效的连接,提高服务器的性能和资源利用率 | 300 | +| tls-port | 服务器用于接受安全TLS(Transport Layer Security)连接的端口 | 6379 | +| tls-cert-file | 服务器的TLS(Transport Layer Security)证书文件的路径 | openamdc.crt | +| tls-key-file | 服务器的私钥文件路径 | openamdc.key | +| tls-key-file-pass | 用于解密TLS密钥文件的密码 | secret | +| tls-client-cert-file | 客户端证书文件的路径 | client.crt | +| tls-client-key-file | 客户端私钥文件路径 | client.key | +| tls-client-key-file-pass | 客户端密钥文件的密码 | secret | +| tls-dh-params-file | 指定一个包含Diffie-Hellman参数的文件路径 | openamdc.dh | +| tls-ca-cert-file | 指定可信的证书颁发机构(CA)的证书文件路径 | ca.crt | +| tls-ca-cert-dir | 指定包含可信证书颁发机构(CA)证书的目录路径 | /etc/ssl/certs | +| tls-auth-clients | 用于控制客户端连接到服务器时是否需要进行客户端身份验证 | no | +| tls-replication | 用于控制主从复制过程中是否使用传输层安全性(TLS)加密通信 | yes | +| tls-cluster | 用于控制集群间通信过程中是否使用传输层安全性(TLS)加密通信 | yes | +| tls-protocols | 配置支持的TLS(Transport Layer Security)协议版本的配置项 | "TLSv1.2 TLSv1.3" | +| tls-ciphers | 用于指定在建立TLS(Transport Layer Security)连接时所支持的加密算法套件 | DEFAULT:!MEDIUM | +| tls-ciphersuites | 用于指定服务器支持的加密套件 | TLS_CHACHA20_POLY1305_SHA256 | +| tls-prefer-server-ciphers | 当该配置项设置为yes时,表示在TLS连接协商加密算法时,服务器更倾向于选择自己支持的加密算法套件,而不是完全由客户端决定。如果设置为no,则在加密算法套件的选择上可能会更多地考虑客户端的偏好 | yes | +| tls-session-caching | 用于控制TLS会话缓存的行为。启用会话缓存。这意味着服务器会缓存成功建立的TLS会话信息,当相同的客户端再次连接时,可以更快地恢复会话,减少重新进行TLS握手的开销,从而提高性能。禁用会话缓存,每次客户端连接都需要完整地进行 TLS 握手过程 | no | +| tls-session-cache-size | 用于设置TLS会话缓存的大小 | 5000 | +| tls-session-cache-timeout | 用于设置TLS会话缓存的超时时间 | 60 | +| daemonize | 服务器是否以守护进程的方式运行 | no | +| supervised | 用于指定进程的监督方式,这个配置项主要用于与特定的系统服务管理工具进行集成和协调,以确保进程能够正确地启动、停止和监控其运行状态 | auto | +| pidfile | 指定进程的PID文件路径 | /var/run/openamdc_6379.pid | +| loglevel | 设置日志级别,如 debug、verbose、notice、warning ,默认是 notice | notice | +| logfile | 指定日志文件的路径 | "" | +| syslog-enabled | 用于决定是否将服务器的日志输出发送到系统日志(syslog) | no | +| syslog-ident | 用于指定在将服务器日志消息发送到系统日志(syslog)时使用的标识符 | openAMDC | +| syslog-facility | 用于指定将服务器产生的日志发送到系统日志(syslog)时所使用的设施(facility) | local0 | +| crash-log-enabled | 用于控制是否启用崩溃日志记录功能 | no | +| crash-memcheck-enabled | 用于控制是否启用内存检查以帮助诊断可能的内存崩溃问题 | no | +| worker-threads | 服务器启动时,用于接收请求的线程数 | 1 | +| databases | 设置数据库的数量,默认是16个 | 16 | +| always-show-logo | 用于控制在服务器启动时是否总是显示标志(logo) | no | +| set-proc-title | 用于控制服务器是否设置进程标题 | yes | +| proc-title-template | 用于自定义进程在操作系统中的进程标题格式 | "{title} {listen-addr} {server-mode}" | +| swap-enabled | 是否启用数据交换功能 | yes | +| swap-flush-threads-num | 用于向RocksDB写入数据的后台线程数量。如果将其设置为0,那么向RocksDB写入数据的过程将以同步方式进行。这意味着工作线程会一直等待,直到写入操作完成后才会继续执行后续操作。另一方面,当该值大于0时,则会采用异步写入方式。在这种情况下,数据写入任务会被分配给指定数量的后台线程,这样主线程就可以在无需等待向RocksDB的写入操作完成的情况下,继续执行其他操作 | 0 | +| swap-data-entry-batch-size | 数据批量写入RocksDB的大小 | 4 | +| swap-hotmemory | 将热数据内存使用限制设置为指定的字节数。请注意,热数据内存不包括RocksDB所使用的内存。值为0表示永远不会使用热数据内存。值大于0表示可使用的热数据内存量。当达到热数据内存限制时,openAMDC将尝试把数据交换到RocksDB中 | \ | +| swap-hotmemory-samples | 数据交换算法采用最不经常使用(LFU)算法来统计访问频率。默认情况下,openAMDC会检查五个键,并挑选出最近使用频率最低的那个键。你可以使用以下配置指令来更改抽样数量 | 5 | +| swap-hotmemory-eviction-tenacity | 数据交换处理在默认设置下旨在能够良好运行。如果写入流量异常大,可能需要增大这个值。减小这个值或许可以降低延迟,但存在数据交换处理效果受影响的风险 | 10 | +| swap-cuckoofilter-size-for-level | 一层cuckoo过滤器的大小。过滤器容量越大,就能够容纳更多的元素,从而降低过早饱和的概率。这对于需要处理和存储大量数据的应用场景是有益的,通过提供更多的空间并有可能减少冲突,提高了诸如插入和查找等操作的效率 | 32mb | +| swap-cuckoofilter-bucket-size | 每个存储桶中的指纹槽数量。它直接影响过滤器的容量和性能。更大的存储桶大小能够存储更多的指纹,增加了容纳元素的能力,但随着每个存储桶内的搜索空间扩大,也可能会导致更多的误判(假阳性)情况。相反,较小的存储桶大小会限制每个存储桶中的指纹数量,在插入操作期间可能会导致更频繁的逐出操作,并且对于相同数量的元素可能需要更多的存储桶,不过由于搜索空间更加有限,它可能会减少误判(假阳性)的情况 | 4 | +| swap-purge-rocksdb-after-load | 从交换文件加载数据后是否清除RocksDB数据。这可能包括删除过时或冗余的数据、过期的条目,或者任何可能会影响数据库性能或占用其存储空间的残留数据 | no | +| rocksdb-dir | 指定RocksDB存储其数据的目录。建议为每个openAMDC实例使用单独的目录,以避免潜在的冲突 | rocksdb.dir | +| rocksdb-max-background-jobs | 指定RocksDB能够同时运行的后台任务(包括压缩、刷新等)的最大数量。这有助于控制后台操作的并行度,以平衡资源利用和整体性能 | 2 | +| rocksdb-max-background-compactions | 限制在后台能够同时运行的压缩任务的最大数量。压缩对于通过减少数据碎片化来维持数据库的存储效率而言至关重要 | 2 | +| rocksdb-max-subcompactions | 定义可以从单个压缩任务中拆分出的子压缩任务的最大数量。子压缩任务可以提高压缩过程的并行性和效率 | 1 | +| rocksdb-max-background-flushes | 设置能够在后台同时运行的写缓冲区刷新任务的最大数量。刷新操作会将数据从写缓冲区写入磁盘 | -1 | +| rocksdb-max-open-files | 指定RocksDB在任何给定时间可以打开的文件的最大数量。这对于管理文件描述符和系统资源很重要 | -1 | +| rocksdb-enable-pipelined-write | 启用或禁用流水线式写入操作。启用此功能后,通过使写入过程的不同阶段重叠,能够提高写入吞吐量 | yes | +| rocksdb-WAL-ttl-seconds | 定义预写式日志(WAL)的生存时间(以秒为单位)。在这段时间过去后,如果用于恢复的目的不再需要 WAL 段,那么这些段就可以安全地删除 | 18000 | +| rocksdb-WAL-size-limit-MB | 限制预写式日志(WAL)的大小(以兆字节为单位)。一旦 WAL 达到此大小,RocksDB 可能会采取诸如触发刷新或其他维护操作等措施 | 16384 | +| rocksdb-max-total-wal-size | 指定所有预写式日志(WAL)文件合并后的最大总大小。这有助于管理 WAL 所占用的总体磁盘空间 | 512mb | +| rocksdb-compression | 确定RocksDB用于压缩存储在数据库中的数据的压缩算法。选项可能包括不同的算法,如 Snappy、Zlib 等 | snappy | +| rocksdb-level0-slowdown-writes-trigger | 定义一个阈值(依据第0层的文件数量来衡量),当达到该阈值时,RocksDB 会开始减慢写入操作,以防止第0层增长得过大从而影响性能 | 20 | +| rocksdb-disable-auto-compactions | 当设置为 “true” 时,会禁用RocksDB中的自动压缩过程。在某些你希望手动控制压缩操作的场景中,这一设置会很有用 | no | +| rocksdb-enable-blob-files | 启用或禁用RocksDB中对大对象(blob)文件的使用。大对象文件用于将大值与键值元数据分开存储 | no | +| rocksdb-enable-blob-garbage-collection | 是否启用大对象(blob)垃圾回收功能。启用后,RocksDB 会定期清理未使用的大对象数据,以回收磁盘空间 | yes | +| rocksdb-min-blob-size | 指定要存储在大对象(blob)文件中的值的最小大小(以字节为单位)。小于此大小的值将与键值元数据一起存储 | 4096 | +| rocksdb-blob-file-size | 定义大对象(blob)文件的目标大小(以字节为单位)。当一个大对象文件达到这个大小时,RocksDB 可能会采取诸如创建一个新文件之类的操作 | 256mb | +| rocksdb-blob-garbage-collection-age-cutoff-percentage | 指定大对象(blob)在其生命周期中达到一定比例后,该大对象才有资格进行垃圾回收。这有助于管理大对象数据的保留和删除 | 5 | +| rocksdb-blob-garbage-collection-force-threshold-percentage | 定义由大对象(blob)垃圾所占用磁盘空间的阈值百分比。当达到这个百分比时,RocksDB 将强制进行更积极的垃圾回收处理 | 90 | +| rocksdb-max-write-buffer-number | 限制RocksDB能够维护的写缓冲区的最大数量。写缓冲区用于在数据刷新到磁盘之前暂存数据 | 4 | +| rocksdb-target-file-size-base | 定义RocksDB中文件的基本目标文件大小(以字节为单位)。这会影响在压缩过程中数据如何分组并存储到文件中 | 32mb | +| rocksdb-write-buffer-size | 指定每个单独的写缓冲区的大小(以字节为单位)。较大的写缓冲区可以提高写入性能,但也会消耗更多内存 | 64mb | +| rocksdb-max-bytes-for-level-base | 定义RocksDB中文件的基本目标文件大小(以字节为单位)。这会影响在压缩过程中数据如何分组并存储到文件中 | 512mb | +| rocksdb-max-bytes-for-level-multiplier | 指定用于计算RocksDB存储层级结构中每个后续层级的最大字节数的乘数 | 10 | +| rocksdb-compaction-dynamic-level-bytes | 启用或禁用在压缩过程中对层级字节数的动态计算。启用后,它可以根据实际的数据分布情况来调整各层级的大小 | no | +| rocksdb-block-size | 定义RocksDB中数据块的大小(以字节为单位)。这会影响在数据块层面上数据的读写方式,并且可能对性能产生影响 | 8192 | +| rocksdb-cache-index-and-filter-blocks | 索引块和过滤器块是否缓存在内存中。缓存这些块可以提高读取性能 | no | +| rocksdb-block-cache-size | 指定用于在内存中存储频繁访问的数据块的块缓存大小(以字节为单位)。更大的缓存可以提高读取性能,但会消耗更多内存 | 8mb | +| save | 用于指定在什么条件下触发自动的持久化操作,将数据以RDB格式保存到磁盘 | 3600 1 | +| stop-writes-on-bgsave-error | 用于决定在bgsave操作出错时是否停止接受写操作 | yes | +| rdbcompression | 用于控制在进行RDB持久化时是否对数据进行压缩 | yes | +| rdbchecksum | 用于控制在生成RDB持久化文件时是否计算和包含校验和 | yes | +| sanitize-dump-payload | 用于在生成RDB快照或进行数据持久化时处理敏感数据 | no | +| dbfilename | 配置项用于指定RDB文件名 | dump.rdb | +| rdb-del-sync-files | 主从进行全量同步时,通过传输RDB内存快照文件实现,没有开启RDB持久化的实例在同步完成后会删除该文件 | no | +| dir | 用于指定工作目录 | ./ | +| replicaof | 用于设置一个实例作为另一个实例的副本(从节点) | \ \ | +| masterauth | 设置中指定主节点的密码 | \ | +| masteruser | 用于指定主节点的用户名 | \ | +| replica-serve-stale-data | 用于控制从节点在与主节点失去连接或数据不同步时的行为的配置项,当该配置项设置为yes时,即使副本与主节点的连接中断或者数据不同步,副本仍然会响应客户端的读请求,但返回的数据可能是过时的。当设置为no时,如果副本与主节点失去连接或者数据不同步,它将拒绝处理客户端的读请求,以避免向客户端提供可能不准确的数据 | yes | +| replica-read-only | 用于控制从节点的读操作权限,默认情况下,replica-read-only的值为yes,这意味着副本节点是只读的,即不能在副本节点上直接执行写操作。如果将replica-read-only设置为no,则副本节点将允许进行读和写操作 | yes | +| repl-diskless-sync | 用于控制主从复制过程中数据同步的方式。当repl-diskless-sync被设置为yes时,在执行全量同步操作时,会尝试使用无盘(diskless)同步方式。当repl-diskless-sync被设置为no时(默认值),主从同步会使用传统的方式,即将RDB文件先写入磁盘,然后再由从节点获取 | no | +| repl-diskless-sync-delay | 用于控制在无盘复制模式下主从同步的延迟 | 5 | +| repl-diskless-load | 用于控制在主从复制过程中,从节点加载RDB文件的方式。默认值为disabled,表示从节点会采用传统的将接收到的RDB文件先写入磁盘然后再加载的方式,而不是使用无盘加载的方式。当repl-diskless-load值为on-empty-db时,表示只有在完全安全的情况下才使用无磁盘加载。当repl-diskless-load值为swapdb时,表示解析时在RAM中保留当前db内容的副本,直接从套接字获取数据 | disabled | +| repl-ping-replica-period | 用于设置主节点向从节点发送PING命令的时间间隔 | 10 | +| repl-timeout | 用于设置主从复制的超时时间 | 60 | +| repl-disable-tcp-nodelay | 用于控制主从复制中的TCP延迟策略。当设置为yes时,主节点在向从节点发送数据时不会启用TCP_NODELAY选项。当设置为no(默认值)时,启用TCP_NODELAY选项,主节点会尽快发送小的数据包,从而降低数据传输的延迟,但可能会导致更多的网络包数量 | no | +| repl-backlog-size | 它用于设置复制积压缓冲区的大小 | 1mb | +| repl-backlog-ttl | 用于设置复制积压缓冲区的生存时间 | 3600 | +| replica-priority | 用于设置从节点优先级的配置项。它的取值是一个整数,数值越小,优先级越高。在主节点故障需要进行故障转移,选择一个从节点提升为新的主节点时,实例会优先考虑优先级较高(数值较小)的从节点 | 100 | +| replica-announced | 默认情况下,sentinel会观测到所有从节点,而从节点可以被排除在sentinel的通告之外,replica-announced为no的从节点将被sentinel replicas \命令忽略,并且不会暴露给sentinel的客户端 | yes | +| min-replicas-to-write | 用于指定在执行写操作时要求至少连接的副本数量 | 3 | +| min-replicas-max-lag | 用于指定主节点在判断从节点是否可用时的一个延迟阈值 | 10 | +| replica-announce-ip | 用于指定从节点向sentinel通信时使用的IP地址 | 5.5.5.5 | +| replica-announce-port | 用于指定从节点向sentinel通信时使用的端口号 | 1234 | +| tracking-table-max-keys | 在使用了客户端缓存时配置要追踪的key的数量 | 1000000 | +| aclfile | 用于指定访问控制列表的配置文件路径 | /etc/openamdc/users.acl | +| requirepass | 用于设置访问服务器的密码 | foobared | +| acl-pubsub-default | 设置订阅发布通道权限 | resetchannels | +| rename-command | 用于重命名命令 | CONFIG "" | +| maxclients | 用于设置服务器同时可以处理的最大客户端连接数量 | 10000 | +| maxmemory | 用于限制服务器使用的最大内存量 | \ | +| maxmemory-policy | 用于指定当内存使用达到maxmemory限制时所采取的内存淘汰策略,常见的策略有:noeviction(默认策略,当达到内存限制并且尝试执行会导致使用更多内存的命令时(例如添加新数据),服务器会返回错误)、volatile-lru(从设置了过期时间的键中,使用LRU(Least Recently Used,最近最少使用)算法淘汰数据)、allkeys-lru(从所有键中,使用LRU算法淘汰数据)、volatile-random(从设置了过期时间的键中,随机淘汰数据)、allkeys-random(从所有键中,随机淘汰数据)、volatile-ttl(从设置了过期时间的键中,优先淘汰剩余生存时间(TTL)较短的键) | noeviction | +| maxmemory-samples | 在选择要淘汰的键时,服务器不会遍历所有的键来确定哪个是最近最少使用的,而是通过随机采样一定数量的键来估计哪些键是最少使用的 | 5 | +| maxmemory-eviction-tenacity | 用于控制在达到内存限制并需要进行内存淘汰时的重试策略,当服务器达到内存上限并且需要删除数据以释放内存时,它会尝试选择合适的数据进行删除(例如根据淘汰策略删除最久未使用的数据等) | 10 | +| replica-ignore-maxmemory | 从节点且开启了repl_slave_ignore_maxmemory不参与逐出 | yes | +| active-expire-effort | 用于控制服务器主动删除过期键的努力程度。它是一个整数值,数值越大,服务器用于删除过期键的努力就越多 | 1 | +| lazyfree-lazy-eviction | 用于控制在内存达到最大限制并需要进行数据淘汰时的行为。当设置为yes时,在进行数据淘汰时会采用惰性删除的方式,即只有在访问被淘汰的键时才真正删除它们,而不是立即删除。当设置为no(默认值)时,在进行数据淘汰时会立即删除被选中要淘汰的键 | no | +| lazyfree-lazy-expire | 用于控制在删除过期键时的行为。当设置为yes时,服务器在删除过期键时会采用惰性删除的方式。当设置为no(默认值)时,服务器会按照常规的方式主动扫描并删除过期键 | no | +| lazyfree-lazy-server-del | 用于控制在服务器删除客户端时的删除策略。当设置为yes时,服务器会采用惰性删除的方式,即在实际需要内存时才执行删除操作,而不是立即删除。当设置为no(默认值)时,服务器会立即执行删除操作 | no | +| replica-lazy-flush | 用于控制从节点在处理全量同步时清空数据的方式。当设置为yes时,从节点会采用惰性刷新的方式来清空数据。这意味着在接收完主节点的RDB文件并开始处理数据之前,不会立即清空本地数据库,而是在处理数据的过程中逐步进行清空操作,以减少对性能的影响。当设置为no(默认值)时,从节点会在接收主节点的RDB文件之前立即清空本地数据库 | no | +| lazyfree-lazy-user-del | 用于控制在执DEL命令删除键时的行为。当lazyfree-lazy-user-del配置项设置为yes时,服务器在删除键时会采用异步删除的方式,将删除操作放在后台线程中进行,避免阻塞主线程,从而提高服务器的响应性能。当设置为no(默认值)时,DEL命令会以同步方式立即执行删除操作,可能会在删除大量键或复杂数据结构时导致服务器短暂阻塞 | no | +| lazyfree-lazy-user-flush | 用于控制在执行FLUSHALL和FLUSHDB命令时的行为。当lazyfree-lazy-user-flush配置项设置为yes时,FLUSHALL和FLUSHDB命令会以惰性删除的方式来释放数据库中的键值对,而不是立即阻塞服务器来完成删除操作。这有助于减少这些命令执行时对服务器性能的影响,特别是在数据库较大的情况下。当设置为no(默认值)时,FLUSHALL和FLUSHDB命令会立即阻塞服务器来删除所有的键值对 | no | +| oom-score-adj | 用于调整进程在发生内存不足(Out Of Memory,OOM)时被内核终止的优先级 | no | +| oom-score-adj-values | oom-score-adj的取值范围通常是-1000到1000之间的整数。数值越低,进程在OOM时被终止的可能性就越小;数值越高,被终止的可能性就越大。通过设置这个配置项,可以根据系统的具体情况和需求,调整服务器在内存压力下的生存能力 | 0 200 800 | +| disable-thp | 是否禁用Transparent Huge Pages(透明大页),禁用透明大页是为了避免在某些系统环境中可能出现的性能不稳定或性能下降的问题 | yes | +| appendonly | 用于控制是否开启AOF(Append Only File)持久化模式 | no | +| appendfilename | 用于指定AOF持久化方式所使用的文件名 | "appendonly.aof" | +| appendfsync | 用于控制AOF持久化方式的配置项。它有以下几个可选值:always(每次执行写命令时都会将数据同步写入到AOF文件中,这种方式可以最大程度保证数据不丢失,但性能相对较差)、everysec(每秒将缓冲区中的数据写入AOF文件,并在后台对文件进行同步。在性能和数据安全性之间取得了平衡,是默认的配置)、no(由操作系统决定何时将缓冲区中的数据写入AOF文件,速度最快,但数据丢失的风险相对较高) | everysec | +| no-appendfsync-on-rewrite | 当这个配置项设置为yes时,在进行后台重写AOF操作时,服务器不会执行appendfsync操作。这意味着在重写期间,新的写入操作可能不会立即同步到磁盘,可能会有数据丢失的风险,但可以提高重写的性能。当设置为no(默认值)时,在后台重写AOF期间,服务器仍然会按照原来的appendfsync策略将新的写入操作同步到磁盘,以保证数据的安全性,但可能会对重写性能有一定影响 | no | +| auto-aof-rewrite-percentage | 用于指定当前AOF文件大小相对于上次重写后AOF文件大小的增长比例。当当前AOF文件的大小超过了上次重写后AOF文件大小的一定比例时,服务器会触发自动重写AOF文件,以去除其中的冗余命令,减小AOF文件的大小 | 100 | +| auto-aof-rewrite-min-size | 该配置项指定了触发自动AOF重写的文件最小大小。即使AOF文件的增长比例(由 auto-aof-rewrite-percentage 配置)达到了要求,但如果当前AOF文件的大小未达到auto-aof-rewrite-min-size设定的值,服务器也不会触发自动重写操作 | 64mb | +| aof-load-truncated | 用于处理在加载AOF持久化文件时遇到不完整或截断的情况。当aof-load-truncated配置项设置为yes时,如果服务器在加载AOF文件时检测到文件可能被截断或不完整,它仍然会尝试加载尽可能多的有效数据,以尽量恢复数据。当设置为no时,如果检测到 AOF文件不完整或截断,服务器将拒绝加载该文件并启动失败 | yes | +| aof-use-rdb-preamble | 用于控制在AOF持久化模式下是否使用 RDB格式的前缀。如果将aof-use-rdb-preamble配置为yes ,服务器在生成AOF文件时,会先以RDB格式写入一个数据快照,然后再在后面追加后续的命令操作。这样做的好处是可以在重放AOF文件进行数据恢复时,先快速加载RDB快照部分,然后再应用后续的命令,从而提高数据恢复的效率。如果配置为no,则AOF文件中不会包含RDB格式的前缀,只会记录命令操作 | yes | +| cluster-enabled | 用于启用或禁用集群模式 | yes | +| cluster-config-file | 用于指定集群的配置文件路径 | nodes-6379.conf | +| cluster-node-timeout | 指定节点不可达的超时时间 | 15000 | +| cluster-replica-validity-factor | 主节点下线后,所有的从节点都会请求申请为主节点,但是有些从节点可能与主节点断开事件过长,导致数据过于陈旧,这样的从节点不能被提升与主节点。cluster-replica-validity-factor参数的作用就是用来判断从节点与主断开的时间是否过长 | 10 | +| cluster-migration-barrier | 它用于控制主节点迁移的条件。其主要作用是指定一个主节点拥有的最少健康从节点数量,只有当主节点拥有的健康从节点数量大于等于这个配置的值时,该主节点才允许进行迁移操作 | 1 | +| cluster-allow-replica-migration | 默认情况下,集群全部的slot有节点负责,集群才能提供服务。设置为no,可以在slot没有全部分配的时候提供服务 | yes | +| cluster-require-full-coverage | 当它的值被设置为yes时,意味着在集群中,除非所有的键空间都能被节点覆盖,否则集群将停止接受写入操作。这可以保证数据的完整性和一致性,但在某些节点故障导致部分键空间无法覆盖时,可能会影响服务的可用性;当设置为no时,即使部分键空间没有被节点覆盖,集群仍然允许写入操作。这样可以在一定程度上提高集群的可用性,但可能会导致数据分布不均匀或部分数据暂时无法访问的情况 | yes | +| cluster-replica-no-failover | 当设置为yes时,此选项将阻止复制程序尝试故障转移,但是仍然可以执行手动故障切换(如果强制执行) | no | +| cluster-allow-reads-when-down | 当集群处于部分节点下线的状态时,决定是否允许对仍然正常工作的节点进行读操作。如果将其设置为yes,则在集群部分节点下线的情况下,允许对可用节点进行读操作。如果设置为no,则在集群有节点下线时,禁止对任何节点进行读操作 | no | +| cluster-announce-ip | 其主要作用是指定的节点在向集群中的其他节点通告自身信息时所使用的IP地址,在某些网络环境中,节点实际使用的IP地址可能与其他节点用于访问它的IP地址不同。通过设置cluster-announce-ip ,可以确保集群中的其他节点能够准确地获取到用于与该节点进行通信的正确IP地址,从而保证集群内节点之间的通信正常进行 | 10.1.1.5 | +| cluster-announce-tls-port | 用于指定的节点在向集群中的其他节点通告自身信息时所使用的TLS端口号 | 6379 | +| cluster-announce-port | 用于指定的节点在向集群中的其他节点通告自身信息时所使用的端口号 | 0 | +| cluster-announce-bus-port | 用于指定的节点在向集群中的其他节点通告自身信息时所使用的集群总线端口号 | 6380 | +| slowlog-log-slower-than | 用于设置慢查询日志的记录阈值 | 10000 | +| slowlog-max-len | 用于设置慢查询日志的最大长度 | 128 | +| notify-keyspace-events | 用于控制服务器发送键空间通知(Keyspace Notifications)的类型和事件 | "" | +| gopher-enabled | 是否开启gopher功能 | no | +| hash-max-ziplist-entries | 用于控制哈希(Hash)数据结构在使用压缩列表(ziplist)存储时,哈希中键值对的最大数量 | 512 | +| hash-max-ziplist-value | 用于控制哈希(Hash)数据结构在使用压缩列表(ziplist)存储时,单个字段值的最大字节长度 | 64 | +| list-max-ziplist-size | 用于控制列表(List)数据结构在使用压缩列表(ziplist)存储时的最大长度,取负值表示按照占用字节数来限定每个quicklist节点上的ziplist长度。此时,该值只能取-1到-5这五个值(-5:每个quicklist节点上的ziplist大小不能超过64Kb(注:1kb = 1024 bytes);-4:每个quicklist节点上的ziplist大小不能超过32Kb;-3:每个quicklist节点上的ziplist大小不能超过16Kb;-2:每个quicklist节点上的ziplist大小不能超过8Kb;-1:每个quicklist节点上的ziplist大小不能超过4 Kb) | -2 | +| list-compress-depth | list-compress-depth 用于指定在列表的两端(头和尾)保留多少个元素不进行压缩 | 0 | +| set-max-intset-entries | 用于设置整数集合(intset)能够容纳的最大元素数量 | 512 | +| zset-max-ziplist-entries | 用于设置有序集合(Sorted Set)在使用压缩列表(ziplist)数据结构存储时,每个压缩列表中最多包含的元素数量 | 128 | +| zset-max-ziplist-value | 用于设置有序集合(Sorted Set)在使用压缩列表(ziplist)数据结构存储时,元素成员的最大长度 | 64 | +| hll-sparse-max-bytes | 用于控制HyperLogLog数据结构在稀疏存储模式下所占用的最大内存字节数 | 3000 | +| stream-node-max-bytes | 用于设置Stream中单个节点(Listpack)所允许的最大字节数 | 4096 | +| stream-node-max-entries | 用于设定Stream中单个节点(Listpack)所允许包含的最大条目数量 | 100 | +| activerehashing | 当activerehashing被设置为yes时(默认值),服务器会在后台渐进地对哈希表进行重新哈希(rehashing)操作,以扩展或收缩哈希表的大小,从而优化内存使用和性能。如果将其设置为 o ,则不会自动进行后台的重新哈希操作,只有在执行相关命令(如增加或删除键值对)时才会触发重新哈希。但这样可能会导致在某些情况下性能下降或内存使用不够优化 | yes | +| client-output-buffer-limit | 配置的格式通常为:client-output-buffer-limit \ \ \ \。\:客户端的类型,可以是 normal(普通客户端)、slave(从节点客户端)、pubsub(发布/订阅客户端);\:缓冲区的硬限制大小,达到这个限制后,openAMDC会立即关闭客户端连接;\:缓冲区的软限制大小;\:如果客户端输出缓冲区的使用量超过了软限制,并且持续的时间超过了指定的秒数,服务器会开始采取相应的措施(如关闭客户端连接) | normal 0 0 0 | +| client-query-buffer-limit | 用于限制客户端查询缓冲区的大小。其主要作用是防止客户端发送过大的查询请求,从而避免可能导致的内存占用过高或性能问题 | 1gb | +| proto-max-bulk-len | 用于限制单个请求中批量回复数据的最大长度 | 512mb | +| dynamic-hz | 启用动态hz时,实际配置的hz将用作基线,一旦连接更多客户端,会根据实际需要使用配置的HZ值的倍数。空闲实例使用较少CPU时间,繁忙实例更具响应性 | yes | +| aof-rewrite-incremental-fsync | 设置为yes时,AOF重写过程中对新生成的AOF文件进行增量的fsync操作,按频率或数据量间隔同步以提高性能;设置为no时,每次写入数据都立即完整同步,确保强一致性但可能影响性能,尤其在写入频繁时 | yes | +| rdb-save-incremental-fsync | 控制RDB持久化时增量写入数据到磁盘的同步方式。设置为yes时,对增量写入数据单独进行fsync操作确保持久性和一致性;设置为no时,依赖操作系统默认文件同步机制 | yes | +| lfu-log-factor | LFU策略用于内存不足淘汰数据时选择删除的键,lfu-log-factor用于调整LFU计数器的增长速度 | 10 | +| lfu-decay-time | 控制LFU计数器值的衰减时间 | 1 | +| activedefrag | 控制主动碎片整理的行为,服务器运行中删除或修改数据可能产生内存碎片,影响内存使用效率和性能 | no | +| active-defrag-ignore-bytes | 控制主动碎片整理行为,指定字节数阈值,若未释放的内存碎片小于该阈值,openADMC忽略主动碎片整理操作 | 100mb | +| active-defrag-threshold-lower | 控制主动碎片整理的触发阈值下限,当服务器内存碎片比例低于此阈值时,主动碎片整理操作停止 | 10 | +| active-defrag-threshold-upper | 控制主动碎片整理的触发阈值上限,当服务器使用的内存超过此阈值时,可能触发主动碎片整理操作以提高内存使用效率和性能 | 100 | +| active-defrag-cycle-min | 设置主动内存碎片整理过程中每次循环的最小CPU时间使用量(毫秒),值小可能导致碎片整理不充分,值大可能影响服务器其他操作性能,需根据负载和内存使用情况调整 | 1 | +| active-defrag-cycle-max | 设置主动内存碎片整理过程中每次循环的最大CPU时间使用量(毫秒) | 25 | +| active-defrag-max-scan-fields | 限制在主动碎片整理过程中一次扫描的最大字段数量 | 1000 | +| jemalloc-bg-thread | 设置为yes时,启用jemalloc的后台线程,执行与内存管理相关的后台任务,如内存碎片整理等 | yes | +| server_cpulist | 将服务器server线程绑定到指定CPU内核列表 | 0 - 7:2 | +| bio_cpulist | 将服务器I/O线程绑定到指定CPU内核,可将后台I/O任务绑定到特定CPU核心,实现更好的性能隔离和资源分配 | 1,3 | +| aof_rewrite_cpulist | 将用于AOF重写子进程绑定到指定CPU核心列表 | 8 - 11 | +| bgsave_cpulist | 将用于后台保存(BGSAVE)操作线程绑定到指定CPU核心列表 | 1,10 - 11 | +| ignore-warnings | 执行openAMDC命令时忽略警告信息,在执行可能产生警告但不影响数据状态的命令时有用 | ARM64-COW-BUG | + +## ACL权限管控 + +openAMDC的ACL(Access Control List,访问控制列表)权限控制功能允许你对不同用户进行细粒度的权限管理,以下是该功能的详细使用方法: + +### 启用 ACL + +在openAMDC配置文件(通常是 openamdc.conf)中启用ACL功能,将aclfile参数设置为ACL配置文件的路径。如果没有指定,openAMDC会使用内置的默认ACL配置。 + +```shell +aclfile /etc/openamdc/users.acl +``` + +### 基本ACL语法 + +在ACL配置文件中,每个用户的配置以user关键字开头,后面跟着用户名,然后是一系列的权限设置。例如: + +```shell +user alice on +@all ~* >password123 +``` + +可以使用 + 和 - 来授予或撤销单个命令的权限。例如: + +```shell +user bob on +get +set -flushall ~* >password456 +``` + +### 在命令行中管理ACL + +可以使用ACL SETUSER命令在openAMDC命令行中创建或修改用户。例如: + +```shell +ACL SETUSER charlie on +@read ~* >newpassword +``` + +这个命令创建了一个名为 charlie 的用户,启用该用户,授予只读命令组的权限,允许访问所有键,并设置密码为 newpassword。 + +使用 ACL LIST 命令可以查看当前所有用户的 ACL 配置: + +```shell +ACL LIST +``` + +使用ACL DELUSER命令删除指定用户: + +```shell +ACL DELUSER charlie +``` + +### 常用命令组和命令列表 + +* 命令组: + * @all:所有命令。 + * @read:只读命令,如 GET、HGET 等。 + * @write:写命令,如 SET、HSET 等。 + * @admin:管理命令,如 CONFIG、SHUTDOWN 等。 + * @fast:快速命令,通常是执行速度较快的命令。 + * @slow:慢速命令,如 SORT 等。 +* 单个命令:可以直接使用命令名来授予或撤销权限,如 +get、-set 等。 + +通过以上步骤,你可以灵活地使用openAMDC的ACL权限控制功能,对不同用户进行精细的权限管理。 + +## 内存数据淘汰策略 + +### 配置最大内存 + +首先,你要设置openAMDC实例可以使用的最大内存。这可以通过修改openAMDC配置文件(openamdc.conf)或者使用CONFIG SET命令来完成。 + +当内存使用达到上限时,为了继续提供服务,就需要淘汰一部分数据。下面详细介绍openAMDC数据淘汰功能的使用方法。 + +* 修改配置文件 + +打开 openamdc.conf 文件,找到并修改 maxmemory 参数,例如将最大内存设置为 100MB: + +```shell +maxmemory 100mb +``` + +修改完成后,重启openAMDC服务使配置生效。 + +* 使用CONFIG SET命令 + +在openAMDC命令行中,使用CONFIG SET命令动态设置最大内存: + +```shell +CONFIG SET maxmemory 100mb +``` + +### 选择内存淘汰策略 + +openAMDC提供了多种内存淘汰策略,你可以根据业务需求选择合适的策略。同样,你可以通过修改配置文件或者使用CONFIG SET命令来设置。 + +可用的淘汰策略: + +* noeviction:默认策略,当内存不足时,对于写操作(如 SET、LPUSH 等)会返回错误,但读操作仍可正常执行。 +* allkeys-lru:从所有键中,使用 LRU(Least Recently Used,最近最少使用)算法淘汰最久未使用的键。 +* allkeys-random:从所有键中随机淘汰键。 +* volatile-lru:从设置了过期时间的键中,使用 LRU 算法淘汰最久未使用的键。 +* volatile-random:从设置了过期时间的键中随机淘汰键。 +* volatile-ttl:从设置了过期时间的键中,优先淘汰 TTL(Time To Live,剩余生存时间)最短的键。 +* allkeys-lfu:从所有键中,使用 LFU(Least Frequently Used,最不经常使用)算法淘汰最不经常使用的键。 +* volatile-lfu:从设置了过期时间的键中,使用 LFU 算法淘汰最不经常使用的键。 + +修改配置文件 + +在 openamdc.conf 文件中,找到并修改 maxmemory-policy 参数,例如选择 allkeys-lru 策略: + +```shell +maxmemory-policy allkeys-lru +``` + +使用CONFIG SET命令 + +在openAMDC命令行中,使用CONFIG SET命令动态设置淘汰策略: + +```shell +CONFIG SET maxmemory-policy allkeys-lru +``` + +修改完成后,重启openAMDC服务使配置生效。 + +## 持久化 + +openAMDC为用户提供了RDB、AOF两种持久化方式,在操作命令中也有相关的操作方式,在此将展开两种持久方式的使用以及相关的工具。 + +### RDB + +RDB持久化方式,会将amdc中的数据以RDB格式存储到硬盘中。 + +生成RDB文件的方式有三种: + +1. 配置文件中进行Save配置RDB的生成条件,触发条件时系统自动使用bgsave生成RDB文件; +2. 使用save命令,使用该命令后将会阻塞所有请求,在RDB文件生成后,恢复请求处理; +3. 使用bgsave命令,该命令不会阻塞请求,但是生成RDB文件的速度会比save慢。 + +RDB恢复数据的方式有两种: + +1. 使用RDB数据迁移工具; +2. 将一个或多个RDB文件放到缓存的配置文件Dir中指定的目录下,启动openAMDC将会自动加载RDB数据。 + +### AOF + +AOF持久化方式,会将amdc中的数据以aof格式写入到文本文件中,存储到appendonlydir文件夹下,并且amdc将会以追加的方式将新的请求追加到文本中。 + +1. 生成AOF文件的方式:在配置文件中将appendonly改为“yes”即可。 + +2. AOF数据恢复方式:将一个或多个AOF文件或整个appendonlydir文件夹放到缓存的配置文件Dir中指定的目录下,启动amdc将会自动加载AOF数据。 + +3. 恢复损坏的AOF文件:openAMDC提供AOF文件修复工具,但是此工具使用的前提是,必须是最后一个追加文件损坏才能修复。这么设计的原因是,若是base文件就已经损坏,就意味着大部分的数据都已经丢失,没有修复的必要。使用方式: + +```shell +./openamdc-server --check-aof --fix [filename.aof|filename.manifest] +``` + +## Lua脚本支持 + +### 基本语法与规则 + +* redis.call和redis.pcall:在Lua脚本里,可以借助redis.call或者redis.pcall来调用openAMDC命令。redis.call若执行命令时出错,会直接抛出错误;而redis.pcall出错时会返回一个包含错误信息的Lua表,不会终止脚本执行。 + +示例: + +```shell +-- 使用 redis.call 调用SET命令 +redis.call('SET', 'key', 'value') +-- 使用 redis.pcall 调用GET命令 +local result = redis.pcall('GET', 'key') +``` + +* 参数传递:脚本能够接收键名参数(KEYS数组)和额外参数(ARGV数组) + +```shell +-- 获取第一个键名 +local key = KEYS[1] +-- 获取第一个额外参数 +local value = ARGV[1] +redis.call('SET', key, value) +``` + +### 在openAMDC命令行中使用Lua脚本 + +可以通过EVAL或者EVALSHA命令在openAMDC命令行执行Lua脚本。 + +* EVAL命令:该命令用于直接执行Lua脚本,语法如下: + +```shell +EVAL script numkeys key [key ...] arg [arg ...] +``` + +示例: + +```shell +EVAL "return redis.call('GET', KEYS[1])" 1 mykey +``` + +* EVALSHA 命令:先使用SCRIPT LOAD命令将Lua脚本加载到openAMDC服务器,得到一个SHA1哈希值,之后使用EVALSHA命令通过该哈希值执行脚本,语法如下: + +```shell +EVALSHA sha1 numkeys key [key ...] arg [arg ...] +``` + +示例: + +```shell +127.0.0.1:6379> SCRIPT LOAD "return redis.call('GET', KEYS[1])" +"49d909000d61f8e5a1c5b2e0d8be43f0a0a52bda" +127.0.0.1:6379> EVALSHA 49d909000d61f8e5a1c5b2e0d8be43f0a0a52bda 1 mykey +``` + +## TLS支持 + +TLS是openAMDC内置的加密通讯协议,启动TLS即可实现与客户端的SSL双向认证加密通讯,可以使用OPENSSL生成相应的证书和密钥文件。 + +TLS配置在openamdc.conf和sentinel.conf中都存在,使用方式一致,具体配置解析可参考缓存配置文件章节或如下: + +### TLS配置项 + +| 参数名称 | 说明 | 默认值 | +| ----- | ------- |------| +| tls-port | 服务器用于接受安全TLS连接的端口 | 6379 | +| tls-cert-file | 务器的TLS证书文件的路径 | tls-cert-file openamdc.crt | +| tls-key-file | 服务器的私钥文件路径 | tls-key-file openamdc.key | +| tls-key-file-pass | 用于解密TLS密钥文件的密码 | secret | +| tls-client-cert-file | 客户端证书文件的路径 | client.crt | +| tls-client-key-file | 客户端私钥文件路径 | client.key | +| tls-client-key-file-pass | 客户端密钥文件的密码 | secret | +| tls-dh-params-file | 指定一个包含Diffie-Hellman参数的文件路径 | openamdc.dh | +| tls-ca-cert-file | 指定可信的证书颁发机构(CA)的证书文件路径 | ca.crt | +| tls-ca-cert-dir | 指定包含可信证书颁发机构(CA)证书的目录路径 | /etc/ssl/certs | +| tls-auth-clients | 用于控制客户端连接到服务器时是否需要进行客户端身份验证 | no | +| tls-replication | 用于控制主从复制过程中是否使用传输层安全性(TLS)加密通信 | yes | +| tls-cluster | 用于控制集群间通信过程中是否使用传输层安全性(TLS)加密通信 | yes | +| tls-protocols | 配置支持的TLS(Transport Layer Security)协议版本的配置项 | TLSv1.2 TLSv1.3 | +| tls-ciphers | 用于指定在建立TLS(Transport Layer Security)连接时所支持的加密算法套件 | DEFAULT:!MEDIUM | +| tls-ciphersuites | 用于指定服务器支持的加密套件 | TLS_CHACHA20_POLY1305_SHA256 | +| tls-prefer-server-ciphers | 当该配置项设置为yes时,表示在TLS连接协商加密算法时,服务器更倾向于选择自己支持的加密算法套件,而不是完全由客户端决定。如果设置为no,则在加密算法套件的选择上可能会更多地考虑客户端的偏好 | yes | +| tls-session-caching | 用于控制TLS会话缓存的行为。启用会话缓存。这意味着服务器会缓存成功建立的TLS会话信息,当相同的客户端再次连接时,可以更快地恢复会话,减少重新进行TLS握手的开销,从而提高性能。禁用会话缓存,每次客户端连接都需要完整地进行 TLS 握手过程 | no | +| tls-session-cache-size | 用于设置TLS会话缓存的大小 | 5000 | +| tls-session-cache-timeout | 用于设置TLS会话缓存的超时时间 | 60 | + +### 通过OPENSSL生成证书 + +可以使用其他方法获得所需的证书,只要合法可用即可。 + +对于SSL双向认证: + +* 服务器需要CA证书、server证书、server私钥; + +* 客户端需要CA证书,client证书、client私钥。 + +步骤: + +* 下载安装openssl,官网/source/index.html (openssl.org) + +* 执行./utils/gen-test-certs.sh脚本,生成证书和密钥: + +```shell +./src/openamdc-server --tls-port 6379 --port 0 \ + --tls-cert-file ./tests/tls/openamdc.crt \ + --tls-key-file ./tests/tls/openamdc.key \ + --tls-ca-cert-file ./tests/tls/ca.crt +``` + +* 使用 openamdc-cli 连接到这个 openamdc 服务器: + +```shell +./src/openamdc-cli --tls \ + --cert ./tests/tls/openamdc.crt \ + --key ./tests/tls/openamdc.key \ + --cacert ./tests/tls/ca.crt +``` + +## 主从模式 + +1. 上传openAMDC缓存核心安装包至目标服务器的安装目录下(如:/opt目录下),至少需要2个节点,组成1主1从,也可以部署更多从节点形成1主n从 +2. 进入解压后的文件夹: cd openAMDC +3. 若该节点为主节点,执行启动命令启动openAMDC缓存核心: ./openamdc-server openamdc.conf +4. 若该节点是从节点,在openamdc.conf文件中replication部分的replicaof配置项中,配置主节点的"ip port",然后启动从节点 + +### 主从部署图 + +![master-slave](figures/image.png) + +### 相关配置项 + +| 参数名称 | 解析 | 使用 | +| ----- | ------- |------| +| bind | 可以指定客户端访问缓存的ip地址,除绑定地址外无法连接。如:127.0.0.1,仅本机可访问;0.0.0.0表示所示可通过本机所有IP皆可访问 | 监听的ip地址,默认值0.0.0.0时不需要也不可以绑定其他地址;此外可以绑定多个地址,建议添加本地访问IP及远程访问IP,bind 127.0.0.1 -::1 | +| port | 缓存核心的端口号 | port 6379 | +| requirepass | 设置密码,可以为空。从节点密码建议与主节点密码保持一直,以保证主从切换之后能够正常连接使用。 | auth密码,在users.acl存在的情况下,server优先使用users.acl中的密码,eg: requirepass 123456 | +| replicaof | 指定主节点的ip和端口 | 设置启动服务器为指定服务器的从节点,eg: replicaof 127.0.0.1 6378 | +| masterauth | 主节点的密码,若主节点无密码则不需要填 | masterauth 123456 | + +### 测试 + +```shell +./openamdc-cli -h ip -p 6379 -a password info replication +``` + +若信息中的slave(主节点)/replicaof(从节点)指向正确的IP:port,即为正常. + +![master-info-replication](figures/image1.png) + +![slave-info-replication](figures/image2.png) + +### 主从命令 + +1. 转变为某个节点的从节点:Replicaof [ip] [port](Replicaof NO ONE 将使从节点转变为主节点) + +## 哨兵模式 + +1. 搭建一个可用主从模式集群,并将哨兵可执行文件openamdc-server与哨兵配置文件sentinel.conf放置到目标服务器路径下; + +2. 配置哨兵sentinel.conf文件,bind绑定访问哨兵的IP,port是哨兵应用的端口,其中sentinel monitor项必须指定为主节点。 + +3. 执行启动命令启动openAMDC哨兵。 + +![sentinel-conf](figures/image3.png) + +![sentinel-conf](figures/image4.png) + +启动命令: + +```shell +./openamdc-server --sentinel sentinel.conf +``` + +### 哨兵模式部署图 + +![sentinel](figures/image5.png) + +### 相关配置项 + +| 参数名称 | 解析 | 使用 | +| ----- | ------- |------| +| bind | 可以指定客户端访问哨兵的ip地址,除绑定地址外无法连接。默认127.0.0.1,仅本机可访问。 | 监听的ip地址,可以绑定多个地址,建议添加本地访问IP及远程访问IP,如:bind 127.0.0.1 -::1 | +| port | 缓存核心的端口号 | port 6379 | +| sentinel | 哨兵的具体配置 | 其他配置可以按需求改动过,但是monitor一定要设置为主节点的ip和端口 "sentinel monitor mymaster 127.0.0.1 6379 1" 若主节点有密码,则加上密码校验参数 "sentinel auth-pass mymaster 123456" | + +### 测试 + +```shell +./openamdc-cli -h ip -p 26379 -a password info sentinel +``` + +若信息中显示正常的主节点、从节点以及其他sentinel信息,即为正常,如下图中的master0。 + +![sentinel-info](figures/image6.png) + +### 哨兵命令 + +1. 查看sentinel的状态命令:info +2. 获取sentinel中监控的所有master的节点命令:sentinel masters +3. 获取master-name主节点的状态信息命令:sentinel master [master-name] +4. 获取master-name节点下所有的slaves的状态信息命令:sentinel slaves [master-name] +5. 通过sentinel中节点名获取ip地址命令:sentinel get-master-addr-by-name [master-name] +6. 添加节点命令:sentinel monitor [name] [ip] [port] [quorum] +7. 重置master-name匹配指定的状态命令:sentinel reset [master-name] +8. 删除节点命令:sentinel remove [master-name] +9. 强制节点主观下线命令:sentinel failover + +## 集群模式 + +### 集群部署图 + +![cluster](figures/image7.png) + +### 相关配置项 + +| 参数名称 | 解析 | 使用 | +| ----- | ------- |------| +| bind | 可以指定客户端访问缓存的ip地址,除绑定地址外无法连接。默认127.0.0.1,仅本机可访问。 | 监听的ip地址,可以绑定多个地址,建议添加本地访问IP及远程访问IP,如: bind 127.0.0.1 -::1| +| port | 缓存核心的端口号 | port 6379 | +| requirepass | 设置密码,所有节点的密码必须一致,可以为空。 | auth密码,在users.acl存在的情况下,server优先使用users.acl中的密码,eg: requirepass 123456 | +| masterauth | 主节点的密码,若主节点无密码则不需要填,若有密码,不分主从所有节点都需要填写该参数。 | masterauth: 123456 | +| cluster-enabled | 是否开启集群模式 | yes / no,eg: cluster-enabled: yes | +| cluster-config-file | 每个集群节点配置文件名称,节点自动生成与更新,生成后不可重名,不可手动编辑 | cluster-config-file:./node.conf | + +### 测试 + +```shell +./openamdc-cli -h ip -p 7000 -a password cluster info +``` + +若信息中显示cluster_state:ok,即为正常。 + +![cluster-info](figures/image8.png) + +### 启动方式与表现 + +openamdc命令行启动缓存核心。 + +#### 启动方式 + +* 前台启动openAMDC缓存核心命令: + +```shell +./openamdc-server openamdc.conf +``` + +#### 启动表现 + +启动命令: + +```shell +./src/openamdc-server openamdc.conf +``` + +启动成功: + +![start](figures/image9.png) + +停止openAMDC缓存核心 + +openAMDC缓存核心的停止方式有以下三种方式: + +1. 客户端命令方式:通过客户端向openAMDC发送shutdown命令 +2. 强制结束进程的方式:通过终端命令强行终止openAMDC缓存核心进程 + +考虑到AMDC缓存核心有可能正在将内存中的数据同步到硬盘中,强行终止openAMDC缓存核心的进程有可能导致数据丢失,正确停止openAMDC缓存核心的方式是通过客户端向openAMDC缓存核心发送shutdown命令,关闭AMDC缓存核心。 + +* 方法1:客户端停止openAMDC缓存核心:通过客户端向openAMDC缓存核心发送shutdown命令./openamdc-cli -h ip -p port -a password shutdown。 +* 方法2:客户端链接正常情况下输入shutdown命令,当openAMDC缓存核心收到shutdown命令后,会断开所有的客户端连接,然后根据配置执行持久化,最后退出。 + +### 集群命令 + +1. 为接收节点分配新的哈希插槽:CLUSTER ADDSLOTS slot [slot ...] +2. 为接收节点分配新的哈希插槽:CLUSTER ADDSLOTSRANGE start-slot end-slot [start-slot end-slot ...] +3. 命令从连接的节点触发群集配置年龄的增量。如果节点的配置年龄为零,或者小于群集的最大年龄,则该年龄将递增:CLUSTER BUMPEPOCH +4. 返回为给定节点处于活动的故障报告的数量:CLUSTER COUNT-FAILURE-REPORTS node-id +5. 返回指定哈希插槽中的本地键数:CLUSTER COUNTKEYSINSLOT slot +6. 将哈希插槽设置为接收节点中的未绑定:CLUSTER DELSLOTS slot [slot ...] +7. 将哈希插槽设置为接收节点中的未绑定:CLUSTER DELSLOTSRANGE start-slot end-slot [start-slot end-slot ...] +8. 强制副本执行其主站的手动故障转移:CLUSTER FAILOVER [FORCE|TAKEOVER] +9. 删除节点自己的插槽信息:CLUSTER FLUSHSLOTS +10. 从节点表中删除节点:CLUSTER FORGET node-id +11. 在指定的哈希插槽中返回本地键名称:CLUSTER GETKEYSINSLOT slot count +12. 提供有关Cluster节点状态的信息:CLUSTER INFO +13. 返回指定键的哈希槽:CLUSTER KEYSLOT key +14. 强制一个节点集群与另一个节点握手:CLUSTER MEET ip port +15. 返回节点 id:CLUSTER MYID +16. 获取节点的集群配置:CLUSTER NODES + +## 多线程模式 + +openAMDC在启动时会初始化多个worker线程,每个worker线程中会启动一个事件循环用于监听事件,为每个listen监听设置SO_REUSEPORT选项,启用网络连接内核负载均衡,允许多个线程绑定相同的端口号,相当于每个线程拥有队里的listen socket完成队列,避免了共享listen socket的资源争抢,提升了并发吞吐,内核通过负载均衡算法,将新链接相对均匀的分配给每个开启了SO_REUSEPORT属性的线程。 + +### 相关配置项 + +| 参数名称 | 说明 | 默认值 | +| ----- | ------- |------| +| worker-threads | 此配置项用于设置openAMDC的工作线程数量。通过增加工作线程的数量,可以提升openAMDC服务器的并发处理能力,从而增强整体性能。通过性能测试和调优来确定最佳的线程数量配置。可以逐步增加线程数量,观察性能变化,找到最佳的线程数量。 | 1 | +| bind | 可以指定客户端访问缓存的ip地址,除绑定地址外无法连接。如:127.0.0.1,仅本机可访问;0.0.0.0表示所有可通过本机所有IP皆可访问 | 127.0.0.1 -::1 | +| port | 端口号 | 6379 | +| requirepass | 设置密码 | "" | + +### 启动服务器 + +执行启动命令启动openAMDC服务:./openamdc-server --worker-threads 1 + +### 测试 + +```shell +./openamdc-cli -h 127.0.0.1 -p 6379 -a password info server +``` + +![info](figures/image11.png) + +## 冷热数据交换功能 + +冷热数据功能实现了数据存储向存储器的无缝扩展,这一功能显著提升了缓存的可用容量,有效避免因缓存不足导致的性能问题,热数据快速响应,冷数据合理迁移。同时,它还大幅降低了缓存的综合使用成本,企业可依据数据冷热特性,灵活选用不同成本的存储器。该功能让数据存储更经济高效,在不牺牲性能和安全性的前提下,为企业提供了坚实的数据存储保障,助力企业在数字化浪潮中降本增效,稳健前行。 + +### 相关配置项 + +| 参数名称 | 说明 | 默认值 | +| ----- | ------- |------| +| swap-enabled | 是否启用数据交换功能 | no | +| swap-flush-threads-num | 用于向RocksDB写入数据的后台线程数量。如果将其设置为0,那么向RocksDB写入数据的过程将以同步方式进行。这意味着工作线程会一直等待,直到写入操作完成后才会继续执行后续操作。另一方面,当该值大于0时,则会采用异步写入方式。在这种情况下,数据写入任务会被分配给指定数量的后台线程,这样主线程就可以在无需等待向RocksDB的写入操作完成的情况下,继续执行其他操作 | 0 | +| swap-data-entry-batch-size | 数据批量写入RocksDB的大小 | 4 | +| swap-hotmemory | 将热数据内存使用限制设置为指定的字节数。请注意,热数据内存不包括RocksDB所使用的内存。值为0表示永远不会使用热数据内存。值大于0表示可使用的热数据内存量。当达到热数据内存限制时,openAMDC 将尝试把数据交换到RocksDB中 | 0 | +| swap-hotmemory-samples | 数据交换算法采用最不经常使用(LFU)算法来统计访问频率。默认情况下,openAMDC会检查五个键,并挑选出最近使用频率最低的那个键。你可以使用以下配置指令来更改抽样数量 | 5 | +| swap-hotmemory-eviction-tenacity | 数据交换处理在默认设置下旨在能够良好运行。如果写入流量异常大,可能需要增大这个值。减小这个值或许可以降低延迟,但存在数据交换处理效果受影响的风险 | 10 | +| swap-cuckoofilter-size-for-level | 一层cuckoo过滤器的大小。过滤器容量越大,就能够容纳更多的元素,从而降低过早饱和的概率。这对于需要处理和存储大量数据的应用场景是有益的,通过提供更多的空间并有可能减少冲突,提高了诸如插入和查找等操作的效率 | 32mb | +| swap-cuckoofilter-bucket-size | 每个存储桶中的指纹槽数量。它直接影响过滤器的容量和性能。更大的存储桶大小能够存储更多的指纹,增加了容纳元素的能力,但随着每个存储桶内的搜索空间扩大,也可能会导致更多的误判(假阳性)情况。相反,较小的存储桶大小会限制每个存储桶中的指纹数量,在插入操作期间可能会导致更频繁的逐出操作,并且对于相同数量的元素可能需要更多的存储桶,不过由于搜索空间更加有限,它可能会减少误判(假阳性)的情况 | 4 | +| swap-purge-rocksdb-after-load | 从交换文件加载数据后是否清除RocksDB数据。这可能包括删除过时或冗余的数据、过期的条目,或者任何可能会影响数据库性能或占用其存储空间的残留数据 | no | +| rocksdb-dir | 指定RocksDB存储其数据的目录。建议为每个 openAMDC 实例使用单独的目录,以避免潜在的冲突 | rocksdb-dir | +| rocksdb-max-background-jobs | 指定RocksDB能够同时运行的后台任务(包括压缩、刷新等)的最大数量。这有助于控制后台操作的并行度,以平衡资源利用和整体性能 | 2 | +| rocksdb-max-background-compactions | 限制在后台能够同时运行的压缩任务的最大数量。压缩对于通过减少数据碎片化来维持数据库的存储效率而言至关重要 | 2 | +| rocksdb-max-subcompactions | 定义可以从单个压缩任务中拆分出的子压缩任务的最大数量。子压缩任务可以提高压缩过程的并行性和效率 | 2 | +| rocksdb-max-background-flushes | 设置能够在后台同时运行的写缓冲区刷新任务的最大数量。刷新操作会将数据从写缓冲区写入磁盘 | -1 | +| rocksdb-max-open-files | 指定RocksDB在任何给定时间可以打开的文件的最大数量。这对于管理文件描述符和系统资源很重要 | -1 | +| rocksdb-enable-pipelined-write | 启用或禁用流水线式写入操作。启用此功能后,通过使写入过程的不同阶段重叠,能够提高写入吞吐量 | yes | +| rocksdb-WAL-ttl-seconds | 定义预写式日志(WAL)的生存时间(以秒为单位)。在这段时间过去后,如果用于恢复的目的不再需要WAL段,那么这些段就可以安全地删除 | 10000 | +| rocksdb-WAL-size-limit-MB | 限制预写式日志(WAL)的大小(以兆字节为单位)。一旦WAL达到此大小,RocksDB可能会采取诸如触发刷新或其他维护操作等措施 | 16384 | +| rocksdb-max-total-wal-size | 指定所有预写式日志(WAL)文件合并后的最大总大小。这有助于管理WAL所占用的总体磁盘空间 | 512mb | +| rocksdb-compression | 确定RocksDB用于压缩存储在数据库中的数据的压缩算法。选项可能包括不同的算法,如Snappy、Zlib等 | snappy | +| rocksdb-level0-slowdown-writes-trigger | 定义一个阈值(依据第0层的文件数量来衡量),当达到该阈值时,RocksDB会开始减慢写入操作,以防止第0层增长得过大从而影响性能 | 20 | +| rocksdb-disable-auto-compactions | 当设置为 “true” 时,会禁用RocksDB中的自动压缩过程。在某些你希望手动控制压缩操作的场景中,这一设置会很有用 | no | +| rocksdb-enable-blob-files | 启用或禁用RocksDB中对大对象(blob)文件的使用。大对象文件用于将大值与键值元数据分开存储 | no | +| rocksdb-enable-blob-garbage-collection | 是否启用大对象(blob)垃圾回收功能。启用后,RocksDB会定期清理未使用的大对象数据,以回收磁盘空间 | yes | +| rocksdb-min-blob-size | 指定要存储在大对象(blob)文件中的值的最小大小(以字节为单位)。小于此大小的值将与键值元数据一起存储 | 4096 | +| rocksdb-blob-file-size | 定义大对象(blob)文件的目标大小(以字节为单位)。当一个大对象文件达到这个大小时,RocksDB 可能会采取诸如创建一个新文件之类的操作 | 256mb | +| rocksdb-blob-garbage-collection-age-cutoff-percentage | 指定大对象(blob)在其生命周期中达到一定比例后,该大对象才有资格进行垃圾回收。这有助于管理大对象数据的保留和删除 | 5 | +| rocksdb-blob-garbage-collection-force-threshold-percentage | 定义由大对象(blob)垃圾所占用磁盘空间的阈值百分比。当达到这个百分比时,RocksDB 将强制进行更积极的垃圾回收处理 | 90 | +| rocksdb-max-write-buffer-number | 限制RocksDB能够维护的写缓冲区的最大数量。写缓冲区用于在数据刷新到磁盘之前暂存数据 | 4 | +| rocksdb-target-file-size-base | 定义RocksDB中文件的基本目标文件大小(以字节为单位)。这会影响在压缩过程中数据如何分组并存储到文件中 | 32mb | +| rocksdb-write-buffer-size | 指定每个单独的写缓冲区的大小(以字节为单位)。较大的写缓冲区可以提高写入性能,但也会消耗更多内存 | 64mb | +| rocksdb-max-bytes-for-level-base | 定义RocksDB存储层级结构中某一层所能容纳的字节数的基本最大值。这用于计算不同层级的大小限制 | 512mb | +| rocksdb-max-bytes-for-level-multiplier | 指定用于计算RocksDB存储层级结构中每个后续层级的最大字节数的乘数 | 10 | +| rocksdb-compaction-dynamic-level-bytes | 启用或禁用在压缩过程中对层级字节数的动态计算。启用后,它可以根据实际的数据分布情况来调整各层级的大小 | no | +| rocksdb-block-size | 定义RocksDB中数据块的大小(以字节为单位)。这会影响在数据块层面上数据的读写方式,并且可能对性能产生影响 | 8192 | +| rocksdb-cache-index-and-filter-blocks | 索引块和过滤器块是否缓存在内存中。缓存这些块可以提高读取性能 | no | +| rocksdb-block-cache-size | 指定用于在内存中存储频繁访问的数据块的块缓存大小(以字节为单位)。更大的缓存可以提高读取性能,但会消耗更多内存 | 8mb | + +### 启动服务器 + +执行启动命令启动openAMDC服务: + +```shell +./openamdc-server --swap-enabled yes --swap-flush-threads-num 0 --swap-data-entry-batch-size 4 --swap-hotmemory 0 +``` + +### 测试 + +```shell +-- 设置mykey +set mykey 'hello,apusic' +-- mykey存储在磁盘上 +swap where mykey +-- 获取mykey +get mykey +-- mykey被读入内存中 +swap where mykey +``` + +![swap](figures/image10.png)