Erlang:我如何在eredis中使用二进制密钥/数据?

时间:2015-08-31 13:31:00

标签: redis erlang

我是二郎的新手,这是一次冒险。我想实现一个速率限制器,并在密钥生成方面遇到了一些问题。我不久前修改了限制器...可能是一年。我想清理一下......

(这是一个更大的项目中的一小部分。现在我认真对待它)

我只是想象我的应用程序是成功的,我每秒都会收到数万个请求。当我第一次编写代码时,这是一个片段:

getClientIP(Socket) ->
    {ok, {ClientIP, _ }} = inet:peername(Socket),
    TplC = tuple_to_list(ClientIP),
    {iolist_to_binary(TplC), lists:flatten(io_lib:format("~p",[TplC]))}.

makeRedisRLKeys(ClientIPStr,TimeShort,TimeLong) ->
    RKeyPrefix =  ClientIPStr ++ ":",
    {ClientIPStr, RKeyPrefix ++ integer_to_list(TimeShort) ++ ":16s", RKeyPrefix ++ integer_to_list(TimeLong) ++ ":36h"}.

所有这些代码......一遍又一遍地运行。我很好奇redis是否可以存储二进制数据。我做了一些搜索,答案是(假设是)是......编程,作为键和值。所以我在shell中尝试了它:

eredis:q(R,["set",R,R]).

R扩展为27字节二进制文件,但失败了。然后我将杂项字节分配给两个变量并插入它们......结果相同。

我刚刚开始在erlang端重写我的限制器:

rate_limit(PartialKey) ->
    { M, S, _ } = now(),
    Time = M*1000000 + S,
    TimeLong = Time band 16#fffffffffffff000,

我知道下面的内容在语法上是不正确的,但我正在尝试做类似的事情:

BucketShort = <<ClientIP, Time>>,
BucketLong = <<ClientIP, TimeLong>>,

可能的?

1 个答案:

答案 0 :(得分:1)

eredis查询的语法很奇怪:eredis:q(R,["set",R,R])。除非R是你的eredis申请的pid,否则将失败。

“set”命令的语法是eredis:q(Pid,["set",Key,Value]).,其中Pid是eredis应用程序的pid:{ok, Pid} = eredis:start_link(),Key和Value是您要存储的键/值,表示为io_list(a列表和二进制文件的嵌套列表。)

我不明白你想要存储的是什么,假设你要为每个ClientIP 2记录存储,一个用Time,一个用TimeLong。你可以用代码来实现这个目的:

{ok, Pid} = eredis:start_link(),
eredis:q(Pid,["set",term_to_binary([ClientIP,short]),term_to_binary(Time)]),
eredis:q(Pid,["set",term_to_binary([ClientIP,long]),term_to_binary(TimeLong)]),

或者如果你想要1条单曲:

eredis:q(Pid,["set",term_to_binary(ClientIP),term_to_binary([Time,TimeLong])]),