当前位置: 首页 > 面试题库 >

Erlang和Redis:读取性能

阮桐
2023-03-14
问题内容

尝试从Redis排序集中读取1M记录时突然遇到性能问题。我使用ZSCAN的光标和批处理大小为5K。

代码是在托管Redis的同一台计算机上使用Erlang R14执行的。批量接收5K元素大约需要1秒。不幸的是,我无法在这台机器上编译Erlang
R16,但是我认为这没有关系。

为了进行比较,带有node_redis(hiredis解析器)的Node.js代码在2秒内达到了1M。Python和PHP的结果相同。

也许我做错了什么?

提前致谢。

这是我的Erlang代码:

-module(redis_bench).
-export([run/0]).

-define(COUNT, 5000).

run() ->
    {_,Conn} = connect_to_redis(),
    read_from_redis(Conn).

connect_to_redis() ->
    eredis:start_link("host", 6379, 0, "pass").

read_from_redis(_Conn, 0) ->
    ok;
read_from_redis(Conn, Cursor) ->
    {ok, [Cursor1|_]} = eredis:q(Conn, ["ZSCAN", "if:push:sset:test", Cursor, "COUNT", ?COUNT]),
    io:format("Batch~n"),
    read_from_redis(Conn, Cursor1).

read_from_redis(Conn) ->
    {ok, [Cursor|_]} = eredis:q(Conn, ["ZSCAN", "if:push:sset:test", 0, "COUNT", ?COUNT]),
    read_from_redis(Conn, Cursor).

问题答案:

切换到redis-erl可以将1M键的读取时间减少到16秒。不快,但是可以接受。

这是新代码:

-module(redis_bench2).
-export([run/0]).

-define(COUNT, 200000).

run() ->
    io:format("Start~n"),
    redis:connect([{ip, "host"}, {port, 6379}, {db, 0}, {pass, "pass"}]),
    read_from_redis().

read_from_redis(<<"0">>) ->
    ok;
read_from_redis(Cursor) ->
    [{ok, Cursor1}|_] = redis:q(["ZSCAN", "if:push:sset:test", Cursor, "COUNT", ?COUNT]),
    io:format("Batch~n"),
    read_from_redis(Cursor1).

read_from_redis() ->
    [{ok, Cursor}|_] = redis:q(["ZSCAN", "if:push:sset:test", 0, "COUNT", ?COUNT]),
    read_from_redis(Cursor).


 类似资料:
  • 我安装了Redis来评估是否可以使用它来缓存对象集合;每个密钥包含一个更新的时间序列,每个更新是一个字节[5000]。我对我运行的一个简单测试的结果感到惊讶--我插入了1000个数组;每个都是一个字节[5000]。在本地读取计算机上运行LRANGE的完整列表需要20秒才能完成。我通过改变我检索到的Byte[5000]对象的数量进行了测试,并且检索的时间与所请求的数据大小成比例o(n),正如预期的那

  • Redis 服务器是 logstash 官方推荐的 broker 选择。Broker 角色也就意味着会同时存在输入和输出俩个插件。这里我们先学习输入插件。 LogStash::Inputs::Redis 支持三种 data_type(实际上是redis_type),不同的数据类型会导致实际采用不同的 Redis 命令操作: list => BLPOP channel => SUBSCRIBE pa

  • 本文向大家介绍python读取excel表格生成erlang数据,包括了python读取excel表格生成erlang数据的使用技巧和注意事项,需要的朋友参考一下 为了将excel数据自动转换成所需要的erlang数据,听同事说使用python会很方便简单,就自学了两天python,写了一个比较粗糙的python脚本,不过能用,有什么优化的地方请指教 代码如下: 以上就是本文的全部内容,希望对大家

  • 假设我想存储用户首选项...简单的如下所示: 在redis缓存中存储这些内容的最佳、性能最好的方法是什么(针对读取进行了优化)? 层次结构(值的哈希) 还有一个相关的问题...有什么理由不把用户偏好存储在redis vs域sql数据库中吗? 还有一个相关的问题……将所有用户存储在一个名为“用户”的根键下是不是一个坏主意?

  • 我一直在试图找到一个连接器,将数据从Redis读取到Flink。Flink的文档中包含了要写入Redis的连接器的描述。在我的Flink工作中,我需要从Redis读取数据。在使用ApacheFlink进行数据流传输时,Fabian提到可以从Redis读取数据。可用于此目的的接头是什么?

  • 问题内容: 如果您在同一文件描述符中的两个不同线程中调用(或,或两者兼有)会发生什么情况(让我们说我们对本地文件感兴趣,而这是套接字文件描述符),而没有显式使用同步机制? 读取和写入是系统调用,因此,在一个单核CPU上,不幸的是两次读取将“同时”执行。但是有多个核心… linux内核会做什么? 让我们更笼统一点:其他内核(例如BSD)的行为是否总是相同? 编辑:根据密切的文档,我们应该确保文件描述