2012-01-29 36 views
1

(编辑:我错过了一些声誉创造bitcask标签等等...)如何使用bitcask作为独立

TL;博士 => bitcask:获取/ 2不工作,引发bitcask_nifs中的badarg:keydir_get_int)

我想知道如何使用bitcask,而不用扯扯正确的方式。

首先,我是想这样的:

bitcask:put(Handle, 3, {this, is, data}). 
bitcask:get(Handle, 3). 

这两个电话提出同样的错误:使用Erlang badarg:尺寸/ 1

的问题是二郎:尺寸/ 1只接受二进制文件或元组。 所以我是想这样的:

bitcask:put(Handle, {thing, 3}, {this, is, data}). 
bitcask:get(Handle, {thing, 3}). 

新badarg错误,那么,使用Erlang:CRC32和价值我想商店。

所以现在我使用这段代码,bucket是注册gen_server的原子名称,它使句柄保持其状态。 cask_wrapper是geneseseries的代码。下面的代码是theese gen服务器的访问权限。

-module(sr_db). 
... 
get(Type, Key) when not is_binary(Key) -> 
    ?MODULE:get(Type, term_to_binary(Key)); 
get(Type, Key) -> 
    Bucket = type2bucket(Type), 
    cask_wrapper:get(Bucket, {get, Key}). 

put(Type, Key, Data) when not is_binary(Key) -> 
    ?MODULE:put(Type, term_to_binary(Key), Data); 

put(Type, Key, Data) when not is_binary(Data) -> 
    ?MODULE:put(Type, Key, term_to_binary(Data)); 

put(Type, Key, Data) -> 
    Bucket = type2bucket(Type), 
    cask_wrapper:put(Bucket, Key, Data), 
    ok. 
%% syncput(Type, Key, Data) -> call au lieu de cast 

type2bucket(user) -> users_cask. 

我用这个代码:

sr_db:get(user, 3). 
%% then a call is made to cask_wrapper:get(users_cask, {get, 3}). 

还有的cask_wrapper功能

get(Bucket, Key) -> 
    gen_server:call(Bucket, {get, Key}). 

handle_call({get, Key}, _From, State) -> 
    Fetch = bitcask:get(State#state.handle, Key), 
    {reply, Fetch, State}. 

我用认沽功能相同的机制。 (但是用gen_server:cast)

我的第一个问题是:正在做term_to_binary转换中每次调用 一个很好的做法,还是很慢?我将不得不将其转换回erlang 这个术语来表示我提取的值。

此刻,put操作返回'ok'。有用。但获得 操作不起作用。这是错误:

=ERROR REPORT==== 29-Jan-2012::20:21:24 === 
** Generic server users_cask terminating 
** Last message in was {get,{get,<<131,97,3>>}} 
** When Server state == {state,#Ref<0.0.0.353>} 
** Reason for termination == 
** {badarg,[{bitcask_nifs,keydir_get_int,[<<>>,{get,<<131,97,3>>}]}, 
      {bitcask_nifs,keydir_get,2}, 
      {bitcask,get,3}, 
      {cask_wrapper,handle_call,3}, 
      {gen_server,handle_msg,5}, 
      {proc_lib,init_p_do_apply,3}]} 
Bitcask dir : "/home/niahoo/src/skyraiders/priv/bitcasks/users" 
options : [read_write]** exception exit: {{badarg, 
         [{bitcask_nifs,keydir_get_int, 
          [<<>>,{get,<<131,97,3>>}]}, 
         {bitcask_nifs,keydir_get,2}, 
         {bitcask,get,3}, 
         {cask_wrapper,handle_call,3}, 
         {gen_server,handle_msg,5}, 
         {proc_lib,init_p_do_apply,3}]}, 
        {gen_server,call,[users_cask,{get,{get,<<131,97,3>>}}]}} 
    in function gen_server:call/2 

我不明白为什么它不工作,并希望得到一些帮助。

谢谢

+0

谢谢你的标签:) – niahoo 2012-01-31 15:25:12

回答

1

Bitcask预计键和值都为二进制文件(因为你已经注意到了)。 我真的不知道term_to_binary/binary_to_term的速度有多快,但是如果您想要在磁盘上存储条件,则真的没有办法绕过它。你当然可以推出你自己的代码来将你的密钥和值转换成二进制文件/从二进制文件转换为你的值,但我怀疑它会比内置函数快得多,当然也不那么灵活。 但是在一天结束时,您必须测量应用程序的配置文件,并决定term_to_binary/binary_to_term是否是整个系统中的热点。如果在任何需要将数据写入磁盘的实际应用程序中出现这种情况,我会感到非常惊讶。

现在调用sr_db时发生错误:get/2。你在{get,Key}元组中两次包含密钥,一次在sr_db:get/2中,另一次在cask_wrapper:get/2中,但是只通过cask_wrapper:handle_call/3中的匹配解开它。 您可以立即在这两行发现这个错误报告:

** Last message in was {get,{get,<<131,97,3>>}}

{gen_server,call,[users_cask,{get,{get,<<131,97,3>>}}]}}

+0

aaaaarf这是一个愚蠢的复制粘贴错误:)非常感谢您。关于二进制转换,我认为bitcask提供了他自己的方式来处理这个问题。所以我会坚持我的代码和简介。谢谢。 – niahoo 2012-01-31 16:20:45