Redis抛出异常“System.OutOfMemoryException”

时间:2015-01-02 05:59:47

标签: asp.net caching redis servicestack servicestack.redis

我有一个包含15个属性的对象。对象存储在自己类型的List中,但列表有点大(330.000对象)。我确实将对象设置为存储在Redis中并且一切正常。我遇到的问题是从Redis获取列表时,我收到System.OutOfMemoryException(请记住我有足够的内存和磁盘空间)。下面是异常的堆栈跟踪

  at System.String.CreateStringFromEncoding(Byte* bytes, Int32 byteLength, Encoding encoding)
   at System.Text.UTF8Encoding.GetString(Byte[] bytes, Int32 index, Int32 count)
   at ServiceStack.StringExtensions.FromUtf8Bytes(Byte[] bytes)
   at ServiceStack.Redis.RedisClient.GetValue(String key)
   at ServiceStack.Redis.RedisClient.<>c__DisplayClass1c`1.<Get>b__1b(RedisClient r)
   at ServiceStack.Redis.RedisClient.Exec[T](Func`2 action)
   at ServiceStack.Redis.RedisClient.Get[T](String key)
   at KaysisClientCache.RedisCacheProvider.GetCache[T](CacheNames key, Func`2 query) in d:\BBProjects\BBSunucu\KaysisClientCache\RedisCacheProvider.cs:line 32

及以下是我设置缓存的方式

redisClient.Set(cacheOb.Name, cacheItem, DateTime.Now.AddMinutes(cacheOb.TimeoutInMin));

以下是获取缓存的方式

return query != null ? redisClient.Get<List<T>>(key.ToString()).Where(query).ToList() : redisClient.Get<List<T>>(key.ToString()).ToList();

任何帮助表示赞赏 顺便说一下Am使用ServiceStack.Redis ver。 4.0.35.0

1 个答案:

答案 0 :(得分:1)

首先,您可能正在使用StackExchange.Redis,Service Stack有一些限制(免费版)。其次,您可以使用Binary:

    public static byte[] Serialize(object value)
    {
        if (value == null) return null;
        if (!value.GetType().IsSerializable) return null;
        byte[] result;
        using (var stream = new MemoryStream())
        {
            var formatter = new BinaryFormatter();
            formatter.Serialize(stream, value);
            result = stream.ToArray();
        }
        return result;
    }

    public static object Deserialize(byte[] value)
    {
        if (value == null) return null;
        object result;
        using (var stream = new MemoryStream(value))
        {
            var formatter = new BinaryFormatter();
            result = formatter.Deserialize(stream);
        }
        return result;
    }

你可以使用StackExchange.Redis客户端的StringSet和StringGet方法,无论你在redis上存储什么,如果你不打算用redis做一些关于该数据的操作(请求检查:排序集,{{3} })。您可以使用以下内容;

...
var data = redisDatabase.StringGet(key);
var result = Deserialize(data);
...
var data = (RedisValue)Serialize(value);
var result = redisDatabase.StringSet(key, data, expireTime);
...

重要提示:请确认您有64位环境,如果您正在使用asp.net进行开发,请确认您使用的是IIS Express x64(redis data types)。请从“任务管理器”中查看Windows 7 32位应用程序是否带有星号,对于Windows 8 32位应用程序显示为(32位)。

我希望它能为你效劳,尊重......