我有一个使用大内存文件的应用程序(低于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谢谢
答案 0 :(得分:2)
我这样做是疯了吗?
绝对。 Redis不是为存储大型二进制数据而设计的,例如&lt; 2GB 文件(甚至100MB文件)。
Redis是关于索引小块数据,以便在CPU和内存方面以非常优化和有效的方式检索它们。请记住,Redis是一个内存数据库,将其数据快照到磁盘(例如在RDB文件中)这一事实并不意味着数据源是您的RAM内存。
不要将这些大型二进制数据存储在Redis上,只需使用Redis作为文件索引,并利用其数据结构轻而易举地回复它们。
嗨Matias,redis列表是各个文件的集合 从几kb到大约5mb。我正在处理的遗留应用程序 应用程序启动时将所有这些加载到一个巨大的静态对象中(我知道, 可怕)。原始版本是从SQL加载的内存文件, 移动到天蓝色时,这被证明太慢,所以我们需要更快 中间存储数据
无论如何,Redis并不是设计用于内存文件存储。
我想说你应该看看memory-mapped files,你甚至可以将所有文件加载到内存映射文件中,并使用索引获取它们(例如,从字节0到243843,是file1,等等)。这应该可以提高整体性能,并且您不需要使用错误的工具来完成工作。