stackexchange redis,读取大文件=超时

时间:2016-09-20 16:16:30

标签: azure redis stackexchange.redis

我有一个使用大内存文件的应用程序(低于2GB)。

我正在尝试使用redis列表(在Azure中)作为存储(vs SQL)。在redis中构建列表非常快,我可以在大约5分钟内加载redis列表但是我需要从列表中读取应用程序。

这非常慢,我尝试增加线程,扩展synctimeout等无济于事。

ThreadPool.SetMinThreads(200, 200);   

我正在使用我在网上发现的redis列表的C#实现,我将它传递给通过foreach循环构建内存集合的代码。这就是它处理数据的方式(我省略了其余的类)

    public class RedisList<T> : IList<T>
{
    private static ConnectionMultiplexer _cnn;
    private readonly string _key;

    private static readonly Lazy<ConnectionMultiplexer> LazyConnection = new Lazy<ConnectionMultiplexer>(() => ConnectionMultiplexer.Connect(ConfigurationManager.AppSettings["AzureRedisCacheUrl"]));

    public ConnectionMultiplexer Connection => LazyConnection.Value;
    public RedisList(string key)
    {
        this._key = key;
        _cnn = Connection;
    }

    public IEnumerator<T> GetEnumerator()
    {
        for (var i = 0; i < this.Count; i++)
        {
            yield return Deserialize<T>(GetRedisDb().ListGetByIndex(_key, i).ToString());
        }
    }
}

是否有更有效的数据读取方式?我这样做是疯了吗? :D谢谢

1 个答案:

答案 0 :(得分:2)

  

我这样做是疯了吗?

绝对。 Redis不是为存储大型二进制数据而设计的,例如&lt; 2GB 文件(甚至100MB文件)。

Redis是关于索引小块数据,以便在CPU和内存方面以非常优化和有效的方式检索它们。请记住,Redis是一个内存数据库,将其数据快照到磁盘(例如在RDB文件中)这一事实并不意味着数据源是您的RAM内存。

不要将这些大型二进制数据存储在Redis上,只需使用Redis作为文件索引,并利用其数据结构轻而易举地回复它们。

OP在一些评论中说:

  

嗨Matias,redis列表是各个文件的集合   从几kb到大约5mb。我正在处理的遗留应用程序   应用程序启动时将所有这些加载到一个巨大的静态对象中(我知道,   可怕)。原始版本是从SQL加载的内存文件,   移动到天蓝色时,这被证明太慢,所以我们需要更快   中间存储数据

无论如何,Redis并不是设计用于内存文件存储。

我想说你应该看看memory-mapped files,你甚至可以将所有文件加载到内存映射文件中,并使用索引获取它们(例如,从字节0到243843,是file1,等等)。这应该可以提高整体性能,并且您不需要使用错误的工具来完成工作。