【发布时间】:2015-08-31 13:30:59
【问题描述】:
我对 erlang 有点陌生,这是一次冒险。我想实现一个速率限制器,并在密钥生成方面遇到了一些问题。不久前,我曾尝试过实施限制器……可能是一年。我想把它清理一下......
(这是一个更大项目中的一小部分。现在我认真对待它)
我只是想我的应用程序是成功的,我每秒收到数万个请求。当我第一次编写代码时,这里是一个 sn-p:
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>>,
可能吗?
【问题讨论】:
-
它是如何失败的?你得到任何有用的错误信息吗?例如
eredis:q(R,["set",R,R]).对我有用,假设R是一个有效的 redis 连接。 -
可能是我使用的 erlang 版本。你在用什么?我按照 Pascal 的回答得到了和以前一样的结果:异常退出
-
我正在使用 Erlang R17 和 Eredis 1.0.8。
-
谢谢...想通了。我花了很长时间才回复,因为我不断收到错误。没有做 {ok,R} = eredis:start_link() 只是 R=... 和其他类似的错误。