libmemcached库api接口讲解三
前言:讲解一下如何删除数据
🗑️ libmemcached 删除键操作教程:memcached_delete()
/ memcached_delete_by_key()
📘 1. 函数作用
用于从 Memcached 中删除指定的 key,包括:
memcached_delete()
:删除普通 keymemcached_delete_by_key()
:删除属于特定“命名空间”下的 key(更适合分布式一致性哈希中的高级用法)
🧩 2. 函数原型
memcached_return_t memcached_delete(memcached_st *ptr,const char *key,size_t key_length,time_t expiration
);memcached_return_t memcached_delete_by_key(memcached_st *ptr,const char *group_key,size_t group_key_length,const char *key,size_t key_length,time_t expiration
);
📌 3. 参数说明
参数 | 说明 |
---|---|
ptr | 客户端句柄 (memcached_st* ) |
key | 要删除的键名 |
key_length | 键名的长度(不包括结尾的 \0 ) |
group_key | 用于一致性哈希定位的命名空间键(仅限 *_by_key 版本) |
expiration | 过期延迟(1.4版本之后已废弃,直接传 0 ) |
⚙️ 4. 实际效果
- 立即删除 key:调用后,使用
memcached_get()
将无法再取到这个 key。 - 删除进入“删除队列”机制(老版本):早期 memcached 实际上是延迟删除;1.4 后已废弃。
- 调用
add()
/replace()
可能仍失败,除非 key 真正被清理掉。
✅ 5. 返回值说明
返回类型为 memcached_return_t
,常见返回值如下:
返回值 | 含义 |
---|---|
MEMCACHED_SUCCESS | 删除成功 |
MEMCACHED_NOTFOUND | key 不存在 |
MEMCACHED_CONNECTION_FAILURE | 与服务器连接失败 |
MEMCACHED_FAILURE | 其他错误 |
使用 memcached_strerror(ptr, rc)
转换为可读字符串。
🧪 6. 使用示例代码
#include <libmemcached/memcached.h>
#include <stdio.h>
#include <string.h>int main() {memcached_st *memc;memcached_return rc;const char *key = "sample_key";const char *value = "some data";// 初始化客户端并添加服务器memc = memcached_create(NULL);memcached_server_add(memc, "127.0.0.1", 11211);// 写入数据rc = memcached_set(memc, key, strlen(key), value, strlen(value), 0, 0);printf("Set: %s\n", memcached_strerror(memc, rc));// 删除 keyrc = memcached_delete(memc, key, strlen(key), 0);printf("Delete: %s\n", memcached_strerror(memc, rc));// 再次尝试读取size_t val_len;uint32_t flags;char *got = memcached_get(memc, key, strlen(key), &val_len, &flags, &rc);if (got) {printf("Unexpected Get: %s\n", got);free(got);} else {printf("Get after delete: %s\n", memcached_strerror(memc, rc));}memcached_free(memc);return 0;
}
🚫 7. 常见误区与注意事项
误区 | 真相 |
---|---|
memcached_free() 会删除 key | ❌ 不会,它只释放客户端对象 |
expiration 可延迟删除 | ❌ 1.4+ 版本已无效,直接忽略或传 0 |
delete() 后立刻可 add() 成功 | ✅ 通常可以,但极端高并发下也可能因为延迟删除失败(不常见) |
delete_by_key() 是强制删除 | ❌ 实际上只是在一致性哈希中提供分布选择,行为一样 |
🔄 8. 使用场景建议
场景 | 推荐函数 |
---|---|
删除普通 key | memcached_delete() |
基于 group_key 删除(hash ring 粒度控制) | memcached_delete_by_key() |
程序退出不保留缓存 | 可批量 delete 或使用过期控制 |