An introduction to pmemobj (part 1) - accessing the persistent memory

本文介绍使用C语言进行持久内存编程的基础知识,涵盖pmemobj库的主要API,如pmemobj_creat、pmemobj_open等,及如何创建、操作持久化内存池。通过示例代码演示如何将数据持久化存储。

参考链接:https://pmem.io/2015/06/13/accessing-pmem.html

这篇文章主要还是纯C语言有关

全文API函数:

pmemobj_creat() //创建持久化内存池

pmemobj_open() //打开已创建的持久化内存池

pmemobj_close() //释放内存池

pmemobj_check() //验证内存池元数据一致性

pmemobj_direct() //将持久性指针转化为结构指针

pmemobj_root() //获取持久化内存池的根节点

pmemobj_persist() //确保变量持久化存储

 

在 pmemobj_creat() 时需要添加一个编程前就写好的 layout 命名,是要通过这个 layout 来将你指定的内存池传递给 pmemobj_open() 进行匹配。

持久指针 pmemoid 的结构体:

typedef struct pmemoid {
	uint64_t pool_uuid_lo;
	uint64_t off;
} PMEMoid;

例程:

/*
 * layout.h -- example from introduction part 1
 */


#define LAYOUT_NAME "intro_1" //这就是开始的layout命名
#define MAX_BUF_LEN 10        //缓存区大小

struct my_root {
	size_t len;
	char buf[MAX_BUF_LEN];
};
/*
 * writer.c -- example from introduction part 1
 */

#include <stdio.h>
#include <string.h>
#include <libpmemobj.h> // PMDK提供的库

#include "layout.h"

int main(int argc, char *argv[])
{
	

//这一段if()是要保证在执行时输入正确的命名方式
    if (argc != 2) {                        
		printf("usage: %s file-name\n", argv[0]);
		return 1;
	}


//创建持久化内存池
	PMEMobjpool *pop = pmemobj_create(argv[1], LAYOUT_NAME,
				PMEMOBJ_MIN_POOL, 0666);

	if (pop == NULL) {
		perror("pmemobj_create"); //perror用来将上一个函数发生错误的原因输出到标准设备
		return 1;
	}


//获取持久化内存的根节点并转化为可用的指针
	PMEMoid root = pmemobj_root(pop, sizeof(struct my_root));
	struct my_root *rootp = pmemobj_direct(root);


//缓存空间初始化,并接收九个字符
	char buf[MAX_BUF_LEN] = {0};
	if (scanf("%9s", buf) == EOF) {
		fprintf(stderr, "EOF\n");
		return 1;
	}


//将接收到字符串的缓存区转入持久性内存,实现本文要求的持久化
	rootp->len = strlen(buf);
	pmemobj_persist(pop, &rootp->len, sizeof(rootp->len));

	pmemobj_memcpy_persist(pop, rootp->buf, buf, rootp->len);

	pmemobj_close(pop);

	return 0;
}

然后 reader.c 中的代码同理,在此不注释。

这是输出结果:

 

 

 

 

 

 

 

### 获取用于访问API的认证密钥 #### 使用跨集群API密钥进行身份验证 对于某些特定环境下的API访问,如本地集群向远程集群发起请求时,可以采用跨集群API密钥来进行安全的身份验证。这种情况下,API密钥需由远程集群管理员预先创建好。之后,在每次从本地集群发送至远程集群的请求里都应附带该API密钥以便完成必要的鉴权流程[^1]。 #### 创建API Keys的具体操作路径 为了获得API keys,用户可以通过指定平台上的相应界面来实现这一目标。具体而言,可以在页面左侧菜单找到名为“API keys”的选项卡(亦可通过直接输入网址`https://platform.deepseek.com/api_keys`进入),随后点击界面上提供的“创建 API key”按钮即可启动新密钥的生成过程[^2]。 #### Python环境下利用Session维持会话状态 当涉及到基于Python的应用程序与外部API交互时,除了简单的单次请求外,还经常需要保持一段时间内的连续访问权限。此时可借助于requests库中的Session对象,它允许开发者在一个持续的时间窗口内重复使用相同的认证凭证而无需每次都重新提交完整的授权信息。一旦检测到服务器返回的状态码为401且错误原因指向令牌失效,则表明当前使用的OAuth token已过期,应当立即采取措施更新token以恢复正常的API调用能力[^3]。 #### 实施API签名机制增强安全性 针对那些对数据传输有着更高安全保障需求的服务接口来说,仅依靠单一形式的API key可能不足以完全抵御潜在的安全威胁。因此引入了一种更为严谨的做法——即所谓的API签名认证方式。在此模式下,客户端不仅要在每一次HTTP请求中携带一对公私钥组合(通常称为AK/SK),而且还要按照既定算法计算出本次请求的数据摘要作为附加参数一同传递给服务端。如此一来即使中途有人截获了网络包也无法轻易伪造合法的请求,从而大大提高了整个系统的抗攻击性能[^4]。 ```python import hmac import hashlib from datetime import datetime, timedelta import requests def create_api_signature(access_key_id, secret_access_key, method, endpoint, params=None): timestamp = (datetime.utcnow() + timedelta(seconds=60)).isoformat() string_to_sign = f"{method}\n{endpoint}\n{timestamp}" if params is not None: sorted_params = "&".join([f"{k}={v}" for k, v in sorted(params.items())]) string_to_sign += f"\n{sorted_params}" signature = hmac.new( bytes(secret_access_key, "utf-8"), msg=bytes(string_to_sign, "utf-8"), digestmod=hashlib.sha256, ).hexdigest() headers = { "X-API-Key": access_key_id, "X-Signature": signature, "Date": timestamp, } return headers access_key_id_example = "<your-access-key-id>" secret_access_key_example = "<your-secret-access-key>" headers = create_api_signature( access_key_id_example, secret_access_key_example, "GET", "/example-endpoint" ) response = requests.get("http://api.example.com/example-endpoint", headers=headers) print(response.text) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值