当前位置: 首页 > ops >正文

libmemcached库api接口讲解二

我们来学一下怎么存数据



📘 libmemcached 数据写入函数详解(set / add / replace


✅ 一、三个函数的作用与区别

函数作用key 存在时key 不存在时常见用途
memcached_set()写入(新增或覆盖)✅ 覆盖✅ 创建默认推荐
memcached_add()仅在 key 不存在时写入❌ 返回错误✅ 创建初始化数据
memcached_replace()仅在 key 存在时替换✅ 替换❌ 返回错误更新已有数据

🧩 二、函数原型

memcached_return_t memcached_set(memcached_st *ptr,const char *key, size_t key_length,const char *value, size_t value_length,time_t expiration, uint32_t flags);

add()replace()set() 参数一致,仅行为不同。

参数说明:

  • ptrmemcached_st* 客户端实例
  • key:要存储的键
  • value:要存储的值
  • expiration:过期时间(单位秒,0 表示永不过期)
  • flags:可选的自定义标记(通常为 0

🔧 三、完整示例代码

#include <libmemcached/memcached.h>
#include <stdio.h>
#include <string.h>int main() {memcached_st *memc;memcached_return rc;const char *key = "example";const char *val1 = "hello";const char *val2 = "world";// 创建客户端memc = memcached_create(NULL);memcached_server_add(memc, "127.0.0.1", 11211);// 使用 memcached_add(仅在 key 不存在时成功)rc = memcached_add(memc, key, strlen(key), val1, strlen(val1), 0, 0);printf("Add: %s\n", memcached_strerror(memc, rc));// 使用 memcached_replace(仅在 key 存在时成功)rc = memcached_replace(memc, key, strlen(key), val2, strlen(val2), 0, 0);printf("Replace: %s\n", memcached_strerror(memc, rc));// 使用 memcached_set(总是写入,无论 key 是否存在)rc = memcached_set(memc, key, strlen(key), "overwrite", 9, 0, 0);printf("Set: %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);printf("Get: %s (rc=%s)\n", got, memcached_strerror(memc, rc));free(got);memcached_free(memc);return 0;
}

⚠️ 注意事项

  • add() 在 key 已存在时返回 MEMCACHED_NOTSTORED
  • replace() 在 key 不存在时返回 MEMCACHED_NOTSTORED
  • 所有函数都返回 memcached_return_t 类型,用 memcached_strerror() 可打印解释
  • 遇到值过大、网络异常、权限问题等也会失败,检查返回值很重要

🔄 使用场景建议

需求推荐函数
写入或更新都可以memcached_set()
只希望写入一次,防止覆盖已有数据memcached_add()
确保数据存在才更新(防止误写)memcached_replace()

注意我们memcached_free(memc)
只释放你程序中 memc 这个客户端实例的内存

并不会清除你通过 memcached_set()memcached_add() 存到 Memcached 服务器里的 key

http://www.xdnf.cn/news/6183.html

相关文章:

  • 股指期货套期保值怎么操作?
  • 【Linux】shell内置命令fg,bg和jobs
  • tensorflow安装及简单例程学习
  • 字符田字格绘制
  • Java的多线程笔记
  • 企业报表平台如何实现降本增效
  • requestAnimationFrame 与 requestIdleCallback 对比
  • JavaScript中执行上下文和执行栈是什么?
  • Linux `whoami` 命令深度解析与高阶应用指南
  • 【USRP】在linux下安装python API调用
  • 保姆级!MeloTTS部署 且支持流式接口
  • Vue3在使用渲染函数h时候使用v-loading
  • 最小二乘拟合曲线
  • C#强类型枚举的入门理解
  • C++矩阵操作:正交矩阵(旋转矩阵)
  • 级联与端到端对话系统架构解析:以Moshi为例
  • 材料×工艺×AI:猎板PCB重构汽车电子四层板技术逻辑
  • 基于大模型的TIA诊疗全流程智能决策系统技术方案
  • 经典还原反应解析:Wolff-Kishner机制与黄鸣龙改进法
  • DeepSeek部署中常见的问题及解决方案
  • 在 Android 的`Handler` 和 `Binder
  • 学前数学思维:等量代换
  • 多因子线性回归实战
  • fiftyone-dataset使用基础
  • 零基础学Java——终章:核心知识点与面试总结
  • Vue百日学习计划Day4-8——Gemini版
  • 从 Vue3 回望 Vue2:逻辑复用新思维——从 Mixins 到 Composables
  • 基于EFISH-SCB-RK3576/SAIL-RK3576的智能零售柜技术方案
  • 「数学::博弈论」Nim游戏(尼姆游戏)/ Luogu P2197(C++)
  • 高压启动电路--学习记录