Redis 抛出异常"System.OutOfMemoryException"
Redis throw exception "System.OutOfMemoryException"
我有一个包含 15 个属性的对象。对象存储在自己类型的列表中,但列表有点大(330.000 个对象)。我确实将对象设置为存储在 Redis 中并且一切正常。我遇到的问题是从 Redis 获取列表时,我收到 System.OutOfMemoryException(请记住我有足够的内存和磁盘 space)。下面是异常的堆栈跟踪
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();
感谢任何帮助
顺便说一句,我正在使用 ServiceStack.Redis 版本。 4.0.35.0
首先,您可以使用 StackExchange.Redis,Service Stack 有一些限制(免费版)。其次,您可以按如下方式使用二进制:
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 进行一些操作(请检查:排序集, redis data types)。您可以按以下方式使用;
...
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(How to force VS to run iis express 64 bit ).请从 "Task Manager" 检查 Windows 7 32 位应用程序以星号显示,对于 Windows 8 32 位应用程序显示为(32 位)。
我希望它对你有用,问候...
我有一个包含 15 个属性的对象。对象存储在自己类型的列表中,但列表有点大(330.000 个对象)。我确实将对象设置为存储在 Redis 中并且一切正常。我遇到的问题是从 Redis 获取列表时,我收到 System.OutOfMemoryException(请记住我有足够的内存和磁盘 space)。下面是异常的堆栈跟踪
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();
感谢任何帮助 顺便说一句,我正在使用 ServiceStack.Redis 版本。 4.0.35.0
首先,您可以使用 StackExchange.Redis,Service Stack 有一些限制(免费版)。其次,您可以按如下方式使用二进制:
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 进行一些操作(请检查:排序集, redis data types)。您可以按以下方式使用;
...
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(How to force VS to run iis express 64 bit ).请从 "Task Manager" 检查 Windows 7 32 位应用程序以星号显示,对于 Windows 8 32 位应用程序显示为(32 位)。
我希望它对你有用,问候...