libMemcached 库下载记录

前言:简单记录一下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就可以删除了

  1. ./configure 的核心功能
    检查系统环境:脚本会检测当前系统的编译器(如 gcc/g++)、依赖库(如 zlib、sasl)、头文件等是否存在,确保编译环境完整。
    生成 Makefile:根据检查结果和用户参数(如 --prefix),生成适合当前系统的 Makefile,后者定义了编译规则和安装路径。
  2. –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  # 查看进程是否存在
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wniuniu_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值