Memcached-win64-1.4.24-alpha 发布

该文章根据 CC-BY-4.0 协议发表,转载请遵循该协议。
本文地址:https://fenying.net/post/2015/07/10/announcing-of-memcached-win64-1.4.24-alpha/

Overview

目前网络上流行的 memcached-win32 都是 1.2.x 版本,过于古老。后来在网上找到一个 1.4.5 版本的 memcached-win32 服务端程序。于是尝试自己编译一个适用于 Windows 的 memcached-1.4.24 最新版本。

参考了多篇文章,并对源代码做了许多适应修改。尝试了一个晚上,总算编译成功,不得不吐槽下,在 Windows 下编译 memcached 一点儿也不是件快乐的事情。目前已经发布到 GitHub,需要的朋友可以自己去查看下:GitHub/memcached-win64(包含编译好的 memcached-win64-1.4.24a.exe 以及运行库、依赖包等)。

如果想使用编译好的可执行文件

» memcached-win64-1.4.24.tar.gz(包含运行库)

如果想尝试自行编译

先说说需要哪些东西:

然后按照如下步骤编译:

  1. 在 Windows 下安装 msys 1.0.11,然后配置 MinGW-w64,确保 gcc 可用。

  2. 从 GitHub 里把当前源代码完整拖下来,放到(msys shell 环境) 根目录 /memcached-win64 下。

  3. 将其中 deps/1.4.24/libevent-2.0.11-stable-for-memcached-w64.tar.gz 解压到 /memcached-win64/libevent-2.0.11-stable

  4. 将其中 deps/1.4.24/pthreads-w32_64-dll-2-9-1-release.zip 解压到 /memcached-win64/pthreads-w32_64-dll-2-9-1-release

  5. 执行如下语句:

     1cd /memcached-win64
     2make clean -C libevent-2.0.11-stable
     3make -C libevent-2.0.11-stable
     4
     5make clean -C memcached-win64
     6make -C memcached-win64
     7
     8mkdir binary
     9cp memcached-win64/memcached-win64-1.4.24a.exe binary/memcached-win64-1.4.24a.exe
    10cp pthreads-w32_64-dll-2-9-1-release/dll/x64/pthreadGC2.dll binary/pthreadGC2.dll
    

就可以得到编译好的 memcached.exe 了。

安装服务

在 Windows 下,启动管理员命令行执行以下命令:

1set MEMCACHED_HOME=C:\DevEnv\Memcached
2sc create Memcached binPath= "%MEMCACHED_HOME%\memcached.exe -d runservice -m 128" start= demand DisplayName= "Memcached Server"

移植过程

我尝试移植时,参考的是 memcached-win32-1.4.5 的代码,因此和 memcached-1.4.24 有较大的区别。具体需要修改的内容如下:

头文件引用

去掉 Linux 专有的 SDK 头文件。

关于连接管理机制(Connections Management)

memcached-1.4.24 内的 conns 连接池采用大数组,下标即为 socket fd,按需分配。其中使用 dup(1) 来确定 max socket fds。而在 Windows 下 dup(1) 法无效,会导致 sfd 远远超过 max_sfd,而出现 ASSERT 异常。因此将链接管理机制用 1.4.5 的替代掉。

64位移植问题

64 位系统中 GCC 使用 %llu 格式化字符串会出错,需要用 PRIu64 修正。

缺少 Linux 专有函数

编译时另外的报错是 strtok_r 和 getsubopt 两个函数,这两个函数在 Windows 中不存在,因此需要到别的地方寻找。最后在 glibc 里找到了 strtok_r,在 sals 里找到了 getsubopt 。

此外凡是 Linux 特有的系统调用,比如信号机制,都要遮蔽掉。

参数命名报错

server_socket 的第一个参数名为 interface,gcc 报错,改为 sInterface 即可。

添加 Deamonization

添加 Windows 下的 deamonization。

关闭 SALS

SALS 在 Windows 下工作不正常,因此不启用它。

参考文献

comments powered by Disqus