1

15 個のプロパティを保持するオブジェクトがあります。独自のタイプのリストに格納されているオブジェクトですが、リストは少し大きいです (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();

ServiceStack.Redis ver. を使用しています。4.0.35.0

4

1 に答える 1

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;
    }

また、そのデータを使用して redis で何らかの操作を行うつもりがない場合は、redis に格納しているものに関係なく、StackExchange.Redis クライアントから StringSet および StringGet メソッドを使用できます (確認してください: sorted set, 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 を使用していることを確認してください ( VS に iis express 64 ビットを実行させる方法)。Windows 7 32ビットアプリは星印、Windows 8 32ビットアプリは(32ビット)と表示される「タスクマネージャー」からご確認ください。

よろしくお願いします...

于 2015-01-05T12:56:10.190 に答える