前言:简单记录一下libMemcached下载使用的一些问题
先从上面下载一个压缩包,然后解压
tar -zxvf libmemcached-1.0.18.tar.gz
cd libmemcached-1.0.18
# 编译安装
./configure --prefix=/usr/local。 // 其实可以换成 sh configure,之前那个还得修改执行的权限
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 # 查看进程是否存在