libMemcached 库下载记录
前言:简单记录一下libMemcached下载使用的一些问题
下载地址
先从上面下载一个压缩包,然后解压
tar -zxvf libmemcached-1.0.18.tar.gz
cd libmemcached-1.0.18# 编译安装
./configure --prefix=/usr/local
make && sudo make install
具体分析一下./configure --prefix=/usr/local
,这样我们刚刚下载的ibmemcached-1.0.18就可以删除了
- ./configure 的核心功能
检查系统环境:脚本会检测当前系统的编译器(如 gcc/g++)、依赖库(如 zlib、sasl)、头文件等是否存在,确保编译环境完整。
生成 Makefile:根据检查结果和用户参数(如 --prefix),生成适合当前系统的 Makefile,后者定义了编译规则和安装路径。 - –prefix=/usr/local 的作用
指定安装根目录:–prefix 参数告诉 configure 脚本将软件安装到 /usr/local 目录下。具体来说:
可执行文件:安装到 /usr/local/bin
库文件:安装到 /usr/local/lib
头文件:安装到 /usr/local/include
配置文件:安装到 /usr/local/etc
为何选择 /usr/local:这是 Linux/macOS 系统中用户级软件的标准安装位置,与系统自带的 /usr 目录分离,避免覆盖系统文件,方便管理。
执行make指令的时候,出现了报错
clients/memflush.cc: In function ‘int main(int, char**)’:
clients/memflush.cc:42:19: error: ISO C++ forbids comparison between pointer and integer [-fpermissive]42 | if (opt_servers == false)| ~~~~~~~~~~~~^~~~~~~~
clients/memflush.cc:51:21: error: ISO C++ forbids comparison between pointer and integer [-fpermissive]51 | if (opt_servers == false)| ~~~~~~~~~~~~^~~~~~~~
make[1]: *** [Makefile:5832: clients/memflush.o] Error 1
make[1]: Leaving directory '/home/echash_go/libmemcached-1.0.18'
make: *** [Makefile:3700: all] Error 2
表明在memflush.cc文件中存在指针与布尔值比较的类型不匹配问题,大致原因就是我现在的g++版本太高了,所以得修改 上面的false为null
后面再次执行make的时候,就只出现一些编译的警告了
./libtest/thread.hpp: In destructor ‘libtest::thread::Mutex::~Mutex()’:
./libtest/thread.hpp:59:7: warning: ‘throw’ will always call ‘terminate’ [-Wterminate]59 | throw libtest::fatal(LIBYATL_DEFAULT_PARAM, "pthread_cond_destroy: %s", strerror(_err));| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./libtest/thread.hpp:59:7: note: in C++11 destructors default to ‘noexcept’
./libtest/thread.hpp: In destructor ‘libtest::thread::ScopedLock::~ScopedLock()’:
./libtest/thread.hpp:92:7: warning: ‘throw’ will always call ‘terminate’ [-Wterminate]92 | throw libtest::fatal(LIBYATL_DEFAULT_PARAM, "pthread_mutex_unlock: %s", strerror(err));| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./libtest/thread.hpp:92:7: note: in C++11 destructors default to ‘noexcept’
./libtest/thread.hpp: In destructor ‘libtest::thread::Condition::~Condition()’:
./libtest/thread.hpp:132:7: warning: ‘throw’ will always call ‘terminate’ [-Wterminate]132 | throw libtest::fatal(LIBYATL_DEFAULT_PARAM, "pthread_cond_destroy: %s", strerror(err));
然后我们需要确保已安装 libMemcached 开发库
sudo apt install libmemcached-dev
后面我们开始写一个简单的测试代码
#include <iostream>
#include <cstdlib>
#include <libmemcached/memcached.h>int main() {// 初始化客户端memcached_st* memc = memcached_create(nullptr);// 配置服务器(可添加多个服务器形成集群)memcached_server_st* server = memcached_server_list_append(nullptr, "localhost", 11211, nullptr); // 最后一个参数应为nullptr// 添加服务器列表到客户端memcached_return_t rc = memcached_server_push(memc, server);if (rc != MEMCACHED_SUCCESS) {std::cerr << "Failed to add server: " << memcached_strerror(memc, rc) << std::endl;memcached_server_list_free(server);memcached_free(memc);return 1;}memcached_server_list_free(server); // 释放临时服务器列表// 设置键值对(有效期3600秒)const char* key = "test_key";const char* value = "Hello, Memcached!";size_t value_len = strlen(value);time_t expiration = 3600; // 1小时后过期rc = memcached_set(memc, key, strlen(key), value, value_len, expiration, 0);if (rc != MEMCACHED_SUCCESS) {std::cerr << "Failed to set value: " << memcached_strerror(memc, rc) << std::endl;memcached_free(memc);return 1;}// 获取键值对char* retrieved_value;size_t retrieved_length;uint32_t flags;retrieved_value = memcached_get(memc, key, strlen(key), &retrieved_length, &flags, &rc);if (rc == MEMCACHED_SUCCESS && retrieved_value) {std::cout << "Retrieved value: " << retrieved_value << std::endl;free(retrieved_value); // 必须手动释放内存} else {std::cerr << "Failed to get value: " << memcached_strerror(memc, rc) << std::endl;}// 删除键rc = memcached_delete(memc, key, strlen(key), 0);if (rc != MEMCACHED_SUCCESS) {std::cerr << "Failed to delete key: " << memcached_strerror(memc, rc) << std::endl;}// 释放资源memcached_free(memc);return 0;
}
然后生成可执行文件
g++ -o memcached_test memcached_test.cpp -lmemcached
然后我们需要先启动我们的memcached服务器
memcached -p 11211 -d # 后台运行,监听 11211 端口
如果没下载的可能还得下载一下
root@gc-hashchain-001:/home/echash_go# memcached -p 11211 -d
can't run as root without the -u switch
又报错了,这是因为我们不能用root权限运行
我们得创建一个新的用户
使用以下命令创建一个新用户,例如名为 memuser:
adduser memuser
按照提示设置该用户的密码及其他信息。
将新用户添加到需要的组中,例如 sudo 组(如果希望该用户有一定的管理权限):
我的密码是12345678
usermod -aG sudo memuser
切换用户运行 Memcached
切换到新创建的用户:memuser是我们创建的用户名
su - memuser
切换到新用户下后我们进入项目,接着
运行
memcached -p 11211 -d # 后台运行,监听 11211 端口
然后运行你的测试程序:
./memcached_test
出现下面的内容就是正确运行了
Retrieved value: Hello, Memcached!
如果创建了新用户但是不想切换新用户来启动服务器,可以用下面的代码
memcached -u memuser -p 11211 -d
我们来了解一下mamecached的更多命令
- 查看 Memcached 运行状态
ps -ef | grep memcached # 查看进程是否存在