C GWAN键值持久化多存储
我想在持久模式下记录一个键值,但当我想使用2个或更多不同的存储时,它不起作用 这是我的剧本:C GWAN键值持久化多存储,c,key-value,g-wan,key-value-store,C,Key Value,G Wan,Key Value Store,我想在持久模式下记录一个键值,但当我想使用2个或更多不同的存储时,它不起作用 这是我的剧本: ... typedef struct{ kv_t *kv; char *name; } kv_data; int main(int argc, char *argv[]) { kv_data **data = (kv_data**)get_env(argv, US_SERVER_DATA); if(!d
...
typedef struct{
kv_t *kv;
char *name;
} kv_data;
int main(int argc, char *argv[])
{
kv_data **data = (kv_data**)get_env(argv, US_SERVER_DATA);
if(!data[0]){
data[0] = (kv_data*)calloc(1, sizeof(kv_data));
if(!data[0]){
return 500;
}
kv_t users;
kv_init(&users, "users", 10, 0, 0, 0);
data[0]->kv = &users;
kv_item item;
item.key = "pierre";
item.klen = sizeof("pierre") - 1;
item.val = "pierre@example.com";
item.flags = 0;
kv_add(data[0]->kv, &item);
data[0]->name = strdup("users");
}
...
此错误与kv_init()函数的第15行一致
例如,我希望使用数据[0]->kv读取并记录“用户”存储中的值,并使用数据[1]->kv读取并记录其他存储中的值…John
你的问题来自于在指针上玩指针的困难。我们可以修复此代码,但由于其复杂性,它可能会在以后的脚本中中断
从长远来看,应该使用更简单的解决方案来避免bug
附加到US\u服务器\u数据的结构可以简化:
typedef struct
{
char *name;
kv_t *kv_1;
kv_t *kv_2;
void *callback;
u32 current_time;
}
这就是方法:使用calloc(sizeof(my_struct))分配内存
,并将此结构附加到您的US\u服务器\u数据
指针
然后,如果您在G-WAN处理程序init()
调用中(或在gwan/main.c
维护脚本中,甚至在最近添加的gwan/init.c
脚本中)执行所有这些操作,您将拥有独占访问权限(一个线程正在进行初始化),并且您将能够攻击G-WAN KV存储(和其他对象)根据需要
如果以后G-WAN servlet或处理程序正在修改这些结构指针,则必须为指针本身使用锁、自旋锁等或原子变量
希望这能有所帮助。我只是将一个包含我需要的所有kv存储的kv存储附加到持久性指针上。G-WAN kv速度快,加上记录数量少,应该不会影响性能
xbuf_t *reply = get_reply(argv);
kv_t **kv_db = (kv_t **)get_env(argv, US_VHOST_DATA);
if (!kv_db[0])
{
kv_db[0] = (kv_t*) malloc(sizeof(kv_t));
if (!kv_db[0])
{
puts("Could not allocate memory for the v-host kv store");
return 500;
}
kv_init(kv_db[0], "kv_db", 10, 0, 0, 0);
}
kv_t *blog_db = (kv_t *) kv_get(kv_db[0], "blog_db", 7);
if (blog_db)
{
xbuf_cat(reply, "Blog already installed. GTFO.");
return 200;
}
blog_db = (kv_t *) malloc(sizeof(kv_t));
kv_init(blog_db, "blog_db", 0, 0, 0, 0);
if (!blog_db)
{
puts("Could not allocate memory for the blog kv store");
return 500;
}
_KV_ADD(kv_db[0], item, blog_db->name, blog_db, 0);
(_KV_ADD是一个自定义宏)您能澄清您遇到的错误吗?谢谢您的帮助,您的解决方案很有效。但是,您是否暗示它(从性能角度来看)不如下面Gil提出的解决方案优化?(顺便说一句,我没能做到这一点)因为我可能需要同时处理大量数据。关于。在我的解决方案中,每当我想访问我的博客时,我必须执行查找(*blog_db=(kv_t*)kv_get(kv_db[0],“blog_db”,7);
);在吉尔的解决方案中,他可以直接访问它,因为它只是结构中的一个字段。当然,我的解决方案没有那么优化。顺便说一句,在这种情况下,数据集的大小(每个kv存储的大小)是不相关的,因为在我的解决方案中,重要的是kv存储的数量。无论如何,如果你有太多的kv商店,你可能想重新考虑你的设计。考虑使用键前缀来合并kv存储(例如:“user_db:”user kv前缀,“blog_db:”posts前缀等)